COPYPASTE
.wiki
API
Tools
CLI
FAQ
Archive
paste
Search pastes
Login
Sign up
New Paste
Paste text
local TABLE_TableIndirection = {}; TABLE_TableIndirection["obf_stringchar%0"] = _G['string'].char; TABLE_TableIndirection["obf_stringbyte%0"] = _G['string'].byte; TABLE_TableIndirection["obf_stringsub%0"] = _G['string'].sub; TABLE_TableIndirection["obf_bitlib%0"] = _G['bit32'] or _G['bit']; TABLE_TableIndirection["obf_XOR%0"] = TABLE_TableIndirection["obf_bitlib%0"].bxor; TABLE_TableIndirection["obf_tableconcat%0"] = _G['table'].concat; TABLE_TableIndirection["obf_tableinsert%0"] = _G['table'].insert; local function hmmm(hmmm2, hmmm3) TABLE_TableIndirection["result%0"] = {}; for i = 1, #hmmm2 do TABLE_TableIndirection["obf_tableinsert%0"](TABLE_TableIndirection["result%0"], TABLE_TableIndirection["obf_stringchar%0"](TABLE_TableIndirection["obf_XOR%0"](TABLE_TableIndirection["obf_stringbyte%0"](TABLE_TableIndirection["obf_stringsub%0"](hmmm2, i, i + 1)), TABLE_TableIndirection["obf_stringbyte%0"](TABLE_TableIndirection["obf_stringsub%0"](hmmm3, 1 + (i % #hmmm3), 1 + (i % #hmmm3) + 1))) % 256)); end return TABLE_TableIndirection["obf_tableconcat%0"](TABLE_TableIndirection["result%0"]); end TABLE_TableIndirection["Source%0"] = [==========[ local Library; do local cloneref = (typeof(cloneref) == "function" and cloneref) or function(Object) return Object end local function Service(Name) return cloneref(game:GetService(Name)) end local Players = Service("Players") local UserInputService = Service("UserInputService") local RunService = Service("RunService") local TweenService = Service("TweenService") local HttpService = Service("HttpService") local Lighting = Service("Lighting") local Workspace = Service("Workspace") local GuiService = Service("GuiService") local Stats = Service("Stats") local LocalPlayer = Players.LocalPlayer local Env = (typeof(getgenv) == "function" and getgenv()) or _G if type(Env.SwiftLibrary) == "table" and type(Env.SwiftLibrary.Unload) == "function" then pcall(Env.SwiftLibrary.Unload, Env.SwiftLibrary) end Library = { Version = "1.0.0", Folder = "Swift", Flags = {}, Elements = {}, Keybinds = {}, Connections = {}, Threads = {}, Windows = {}, SearchIndex = {}, PopupStack = {}, AnimatedPickers = {}, Notifications = {}, Casing = "Normal", ThemeName = "Swift", TweenTime = 0.25, EasingStyle = Enum.EasingStyle.Quart, Unloaded = false, Listening = nil, MenuKeybind = Enum.KeyCode.RightShift, Font = "Inter", } Library.__index = Library Env.SwiftLibrary = Library local FS = {}; do local MemoryFiles = {} local function Has(Name) return typeof(Env[Name]) == "function" or typeof(getfenv()[Name]) == "function" end local function Get(Name) return Env[Name] or getfenv()[Name] end local Native = Has("writefile") and Has("readfile") and Has("isfile") FS.Native = Native function FS.MakeFolder(Path) if Native and Has("makefolder") then if not (Has("isfolder") and Get("isfolder")(Path)) then pcall(Get("makefolder"), Path) end end end function FS.Write(Path, Content) if Native then return pcall(Get("writefile"), Path, Content) end MemoryFiles[Path] = Content return true end function FS.Read(Path) if Native then local Ok, Result = pcall(Get("readfile"), Path) return Ok and Result or nil end return MemoryFiles[Path] end function FS.Exists(Path) if Native then local Ok, Result = pcall(Get("isfile"), Path) return Ok and Result end return MemoryFiles[Path] ~= nil end function FS.Delete(Path) if Native and Has("delfile") then pcall(Get("delfile"), Path) else MemoryFiles[Path] = nil end end function FS.List(Folder) local Out = {} if Native and Has("listfiles") then local Ok, Files = pcall(Get("listfiles"), Folder) if Ok then for _, File in Files do local Name = tostring(File):gsub("\\", "/"):match("([^/]+)$") table.insert(Out, Name) end end else for Path in MemoryFiles do local Dir, Name = Path:match("^(.*)/([^/]+)$") if Dir == Folder then table.insert(Out, Name) end end end table.sort(Out) return Out end Library.FS = FS FS.MakeFolder(Library.Folder) FS.MakeFolder(Library.Folder .. "/configs") FS.MakeFolder(Library.Folder .. "/fonts") end local Fonts = { Families = { ["Inter"] = "rbxassetid://12187365364", ["Gotham"] = "rbxasset://fonts/families/GothamSSm.json", ["Montserrat"] = "rbxasset://fonts/families/Montserrat.json", ["Roboto"] = "rbxasset://fonts/families/Roboto.json", ["Source Sans"] = "rbxasset://fonts/families/SourceSansPro.json", ["Builder Sans"] = "rbxasset://fonts/families/BuilderSans.json", ["Ubuntu"] = "rbxasset://fonts/families/Ubuntu.json", }, Order = { "Inter", "Gotham", "Montserrat", "Roboto", "Source Sans", "Builder Sans", "Ubuntu" }, Registry = setmetatable({}, { __mode = "k" }), ESP = { Pixel = Font.fromEnum(Enum.Font.Code), Code = Font.fromEnum(Enum.Font.Code), Gotham = Font.fromEnum(Enum.Font.Gotham), Arial = Font.fromEnum(Enum.Font.Arial), }, } Library.Fonts = Fonts function Fonts:Face(Weight) return Font.new(self.Families[Library.Font] or self.Families.Inter, Weight or Enum.FontWeight.Bold) end function Fonts:Refresh() self.Regular = self:Face(Enum.FontWeight.Regular) self.Medium = self:Face(Enum.FontWeight.Medium) self.SemiBold = self:Face(Enum.FontWeight.SemiBold) self.Bold = self:Face(Enum.FontWeight.Bold) end function Fonts:Apply(Object, Weight) self.Registry[Object] = Weight or Enum.FontWeight.Bold Object.FontFace = self:Face(self.Registry[Object]) end function Fonts:Download(Name, Url) local Environment = getfenv() local GetAsset = Env.getcustomasset or Env.getsynasset or Environment.getcustomasset or Environment.getsynasset if not FS.Native or typeof(GetAsset) ~= "function" then return nil end local Base = Library.Folder .. "/fonts/" .. Name:gsub("%s", "") if not FS.Exists(Base .. ".ttf") then local Ok, Data = pcall(function() return game:HttpGet(Url) end) if not Ok or type(Data) ~= "string" or Data == "" then return nil end if not FS.Write(Base .. ".ttf", Data) then return nil end end if not FS.Write(Base .. ".json", HttpService:JSONEncode({ name = Name, faces = { { name = "Regular", weight = 400, style = "normal", assetId = GetAsset(Base .. ".ttf") } } })) then return nil end return GetAsset(Base .. ".json") end function Fonts:ESPFace(Name) if not self.ESP[Name] then Name = "Pixel" end if Name == "Pixel" and not self.PixelAttempted then self.PixelAttempted = true local Okay, Face = pcall(function() local Family = self:Download("Minecraftia-Regular", "https://github.com/gut7899/Storage/raw/refs/heads/main/Minecraftia-Regular.ttf") if type(Family) == "string" and Family ~= "" then return Font.new(Family, Enum.FontWeight.Regular) end end) if Okay and Face then self.ESP.Pixel = Face end end return self.ESP[Name] end function Library:AddFont(Name, Source) local Family = Source if type(Source) == "number" then Family = "rbxassetid://" .. Source elseif type(Source) == "table" then Family = Fonts:Download(Name, Source.Url) end if not Family then return false end Fonts.Families[Name] = Family if not table.find(Fonts.Order, Name) then table.insert(Fonts.Order, Name) end local Dropdown = Library.Elements.Font if Dropdown then Dropdown:SetOptions(Fonts.Order, true) end return true end function Library:SetFont(Name) if not Fonts.Families[Name] then return end Library.Font = Name Fonts:Refresh() for Object, Weight in Fonts.Registry do Object.FontFace = Fonts:Face(Weight) end end Fonts:Refresh() local Icons; do local function Thumb(Id) return "rbxthumb://type=Asset&id=" .. Id .. "&w=150&h=150" end Icons = { Logo = { Image = "rbxassetid://83222639901823", Logo = true }, Bullseye = "rbxassetid://88639165254091", Smile = { Image = Thumb(11955884989), RectOffset = Vector2.new(20, 20), RectSize = Vector2.new(110, 110) }, Globe = "rbxassetid://11887653877", Bomb = Thumb(13424571238), Gear = "rbxassetid://9753762469", Robot = Thumb(78007610361363), HeartCrack = Thumb(15331784488), Wrench = Thumb(11435662333), Cube = Thumb(9802015008), Search = { Image = Thumb(85365761530931), RectOffset = Vector2.new(14, 14), RectSize = Vector2.new(122, 122) }, Check = "rbxassetid://18856185133", User = "rbxassetid://18854794412", Users = "rbxassetid://6479819618", Plus = "rbxassetid://139167062679792", Trash = "rbxassetid://88050953687180", Checker = "rbxassetid://18274452449", Warning = "rbxassetid://11745872910", Error = "rbxassetid://5419926701", Info = "rbxassetid://7634887649", Arrow = "rbxassetid://153287088", Brush = "rbxassetid://10910211661", Eye = "rbxassetid://6473251976", Key = "rbxassetid://18854840832", Gun = "rbxassetid://3189074890", Knife = "rbxassetid://2992801749", Crown = "rbxassetid://6458974334", Lock = "rbxassetid://15117261700", Circle = "rbxassetid://9208578430", } Library.Icons = Icons end local Rgb = Color3.fromRGB local ThemeKeys = { "Background", "Tab", "Outline", "Inline", "Text", "Inactive Text", "Accent", "Element", "Gradient", "Shadow", "Hovered Element" } local Themes = { ["Swift"] = { Background = Rgb(28, 28, 28), Tab = Rgb(37, 37, 37), Outline = Rgb(45, 45, 45), Inline = Rgb(28, 28, 28), Text = Rgb(230, 230, 230), ["Inactive Text"] = Rgb(148, 148, 148), Accent = Rgb(168, 234, 181), Element = Rgb(54, 54, 54), Gradient = Rgb(240, 240, 240), Shadow = Rgb(0, 0, 0), ["Hovered Element"] = Rgb(61, 61, 61), Popup = Rgb(37, 37, 37), ToggleFill = Rgb(69, 141, 84), Knob = Rgb(235, 253, 238), KnobOff = Rgb(134, 134, 134), }, ["Blossom"] = { Background = Rgb(40, 40, 40), Tab = Rgb(43, 47, 48), Outline = Rgb(56, 60, 61), Inline = Rgb(31, 30, 28), Text = Rgb(220, 222, 235), ["Inactive Text"] = Rgb(125, 128, 135), Accent = Rgb(86, 137, 200), Element = Rgb(40, 44, 43), Gradient = Rgb(187, 191, 191), Shadow = Rgb(0, 0, 0), ["Hovered Element"] = Rgb(65, 70, 73), }, ["Afterglow"] = { Background = Rgb(28, 24, 21), Tab = Rgb(37, 31, 28), Outline = Rgb(51, 46, 42), Inline = Rgb(34, 29, 25), Text = Rgb(255, 248, 240), ["Inactive Text"] = Rgb(148, 139, 130), Accent = Rgb(250, 140, 70), Element = Rgb(40, 33, 27), Gradient = Rgb(253, 184, 117), Shadow = Rgb(0, 0, 0), ["Hovered Element"] = Rgb(56, 45, 35), }, ["Frostbite"] = { Background = Rgb(16, 25, 28), Tab = Rgb(24, 34, 41), Outline = Rgb(44, 55, 61), Inline = Rgb(22, 31, 38), Text = Rgb(245, 254, 255), ["Inactive Text"] = Rgb(138, 154, 164), Accent = Rgb(100, 200, 245), Element = Rgb(25, 38, 47), Gradient = Rgb(160, 211, 240), Shadow = Rgb(0, 0, 0), ["Hovered Element"] = Rgb(36, 53, 62), }, ["Volt"] = { Background = Rgb(14, 19, 13), Tab = Rgb(21, 28, 21), Outline = Rgb(42, 47, 40), Inline = Rgb(17, 24, 16), Text = Rgb(250, 255, 242), ["Inactive Text"] = Rgb(135, 147, 131), Accent = Rgb(185, 245, 90), Element = Rgb(24, 35, 19), Gradient = Rgb(186, 240, 101), Shadow = Rgb(0, 0, 0), ["Hovered Element"] = Rgb(38, 51, 32), }, ["Obsidian"] = { Background = Rgb(11, 12, 16), Tab = Rgb(19, 20, 24), Outline = Rgb(36, 37, 39), Inline = Rgb(15, 16, 18), Text = Rgb(250, 251, 254), ["Inactive Text"] = Rgb(121, 122, 126), Accent = Rgb(150, 122, 245), Element = Rgb(21, 22, 26), Gradient = Rgb(179, 167, 212), Shadow = Rgb(0, 0, 0), ["Hovered Element"] = Rgb(32, 36, 39), }, ["Sakura Drift"] = { Background = Rgb(28, 23, 27), Tab = Rgb(41, 30, 36), Outline = Rgb(54, 45, 50), Inline = Rgb(35, 26, 31), Text = Rgb(255, 249, 254), ["Inactive Text"] = Rgb(158, 142, 152), Accent = Rgb(245, 135, 180), Element = Rgb(46, 31, 38), Gradient = Rgb(252, 178, 212), Shadow = Rgb(0, 0, 0), ["Hovered Element"] = Rgb(56, 41, 48), }, ["Neon Mirage"] = { Background = Rgb(14, 17, 26), Tab = Rgb(22, 26, 44), Outline = Rgb(42, 45, 60), Inline = Rgb(17, 20, 35), Text = Rgb(243, 246, 255), ["Inactive Text"] = Rgb(134, 139, 166), Accent = Rgb(40, 230, 210), Element = Rgb(23, 30, 49), Gradient = Rgb(107, 216, 254), Shadow = Rgb(0, 0, 0), ["Hovered Element"] = Rgb(35, 42, 68), }, ["Copper Dust"] = { Background = Rgb(30, 27, 22), Tab = Rgb(42, 34, 25), Outline = Rgb(61, 54, 46), Inline = Rgb(38, 31, 25), Text = Rgb(250, 240, 231), ["Inactive Text"] = Rgb(150, 138, 126), Accent = Rgb(200, 135, 70), Element = Rgb(45, 33, 24), Gradient = Rgb(196, 181, 139), Shadow = Rgb(0, 0, 0), ["Hovered Element"] = Rgb(53, 45, 43), }, ["Abyss"] = { Background = Rgb(7, 14, 16), Tab = Rgb(13, 24, 29), Outline = Rgb(30, 40, 42), Inline = Rgb(9, 19, 21), Text = Rgb(225, 241, 247), ["Inactive Text"] = Rgb(112, 128, 134), Accent = Rgb(30, 185, 165), Element = Rgb(12, 25, 31), Gradient = Rgb(78, 181, 174), Shadow = Rgb(0, 0, 0), ["Hovered Element"] = Rgb(21, 39, 43), }, ["Porcelain"] = { Background = Rgb(233, 232, 227), Tab = Rgb(246, 245, 240), Outline = Rgb(204, 203, 197), Inline = Rgb(251, 250, 245), Text = Rgb(48, 49, 54), ["Inactive Text"] = Rgb(121, 121, 113), Accent = Rgb(72, 112, 197), Element = Rgb(236, 237, 241), Gradient = Rgb(160, 171, 193), Shadow = Rgb(84, 82, 83), ["Hovered Element"] = Rgb(225, 225, 217), }, } local ThemeOrder = { "Swift", "Blossom", "Afterglow", "Frostbite", "Volt", "Obsidian", "Sakura Drift", "Neon Mirage", "Copper Dust", "Abyss", "Porcelain" } Library.Themes = Themes Library.ThemeOrder = ThemeOrder Library.ThemeKeys = ThemeKeys local Theme = {} local DerivedKeys = { Popup = "Inline", ToggleFill = "Accent", Knob = "Text", KnobOff = "Inactive Text" } local ExplicitDerived = {} local function LoadPreset(Preset) for Key, Value in Preset do Theme[Key] = Value end for Derived, Base in DerivedKeys do ExplicitDerived[Derived] = Preset[Derived] ~= nil Theme[Derived] = Preset[Derived] or Preset[Base] end end LoadPreset(Themes.Swift) Library.Theme = Theme local ThemeRegistry = setmetatable({}, { __mode = "k" }) local GradientRegistry = setmetatable({}, { __mode = "k" }) local ThemeCallbacks = {} local function GradientSequence() return ColorSequence.new(Color3.new(1, 1, 1), Color3.new(1, 1, 1):Lerp(Theme.Gradient, 0.68)) end function Library:Theme(Object, Property, Key) local Entry = ThemeRegistry[Object] if not Entry then Entry = {} ThemeRegistry[Object] = Entry end Entry[Property] = Key if Theme[Key] then Object[Property] = Theme[Key] end return Object end function Library:Unthemed(Object, Property) local Entry = ThemeRegistry[Object] if Entry then Entry[Property] = nil end end function Library:OnThemeChanged(Callback) table.insert(ThemeCallbacks, Callback) end function Library:SetThemeColor(Key, Color) if Theme[Key] == nil then return end Theme[Key] = Color for Object, Entry in ThemeRegistry do for Property, ThemeKey in Entry do if ThemeKey == Key then pcall(function() Object[Property] = Color end) end end end if Key == "Gradient" then local Sequence = GradientSequence() for Gradient in GradientRegistry do Gradient.Color = Sequence end end for Derived, Base in DerivedKeys do if Base == Key and not ExplicitDerived[Derived] then Library:SetThemeColor(Derived, Color) end end for _, Callback in ThemeCallbacks do task.spawn(Callback, Key, Color) end end function Library:SetTheme(Name) local Preset = Themes[Name] if not Preset then return end Library.ThemeName = Name Library.ApplyingTheme = true for Derived in DerivedKeys do ExplicitDerived[Derived] = Preset[Derived] ~= nil end for _, Key in ThemeKeys do Library:SetThemeColor(Key, Preset[Key]) local Element = Library.Elements["Theme_" .. Key] if Element then Element:Set({ Color = Preset[Key], Alpha = 0 }, true) end end for Derived in DerivedKeys do if Preset[Derived] then Library:SetThemeColor(Derived, Preset[Derived]) end end Library.ApplyingTheme = false end function Library:AddTheme(Name, Colors) local Preset = {} for _, Key in ThemeKeys do Preset[Key] = Colors[Key] or Themes.Swift[Key] end for Derived in DerivedKeys do Preset[Derived] = Colors[Derived] end Themes[Name] = Preset if not table.find(ThemeOrder, Name) then table.insert(ThemeOrder, Name) end local Dropdown = Library.Elements.__ThemeName if Dropdown then Dropdown:SetOptions(ThemeOrder, true) end end local CasingOrder; do local TextRegistry = setmetatable({}, { __mode = "k" }) CasingOrder = { "Normal", "lower case", "Upper Case", "BOLD CASE" } Library.CasingOrder = CasingOrder local function ApplyCase(Raw) Raw = tostring(Raw or "") local Mode = Library.Casing if Mode == "lower case" then return Raw:lower() elseif Mode == "Upper Case" then return (Raw:gsub("(%a)([%w_']*)", function(First, Rest) return First:upper() .. Rest:lower() end)) elseif Mode == "BOLD CASE" then return Raw:upper() end return Raw end Library.ApplyCase = ApplyCase function Library:SetText(Object, Raw) TextRegistry[Object] = tostring(Raw or "") Object.Text = ApplyCase(Raw) end function Library:GetRawText(Object) return TextRegistry[Object] or Object.Text end function Library:SetCasing(Mode) if not table.find(CasingOrder, Mode) then return end Library.Casing = Mode for Object, Raw in TextRegistry do Object.Text = ApplyCase(Raw) end end end local function Connect(Signal, Callback) local Connection = Signal:Connect(Callback) table.insert(Library.Connections, Connection) return Connection end Library.Connect = function(_, Signal, Callback) return Connect(Signal, Callback) end local Layout = {}; do local Entries, Snapshot, LastSaved = {}, { Version = 1, Items = {} }, nil local Path = Library.Folder .. "/layout.json" local function Finite(Value) return type(Value) == "number" and Value == Value and math.abs(Value) < 10000000 end local function Record(Value) if type(Value) ~= "table" then return nil end if (Value.Kind == "Position" or Value.Kind == "Offset") and Finite(Value.X) and Finite(Value.Y) then local Min, Max = Value.Kind == "Position" and 0 or -2, Value.Kind == "Position" and 1 or 2 return { Kind = Value.Kind, X = math.clamp(Value.X, Min, Max), Y = math.clamp(Value.Y, Min, Max) } end if Value.Kind == "Section" and type(Value.Floating) == "boolean" and (Value.Side == 1 or Value.Side == 2) and Finite(Value.Order) then local Source = Value.Position local Position = type(Source) == "table" and Source.Kind == "Position" and Finite(Source.X) and Finite(Source.Y) and { Kind = "Position", X = math.clamp(Source.X, 0, 1), Y = math.clamp(Source.Y, 0, 1) } or nil if Value.Floating and (not Position or Position.Kind ~= "Position") then return nil end return { Kind = "Section", Floating = Value.Floating, Side = Value.Side, Order = math.clamp(math.floor(Value.Order), 0, 10000), Position = Position } end return nil end function Layout.Viewport(Target) local Size = Target.Parent and Target.Parent.AbsoluteSize if not Size or Size.X <= 0 or Size.Y <= 0 then local Camera = Workspace.CurrentCamera Size = Camera and Camera.ViewportSize end return Size and Size.X > 0 and Size.Y > 0 and Size or nil end function Layout.ReadPosition(Target) local Viewport = Layout.Viewport(Target) if not Viewport then return nil end local Position = Target.Position return { Kind = "Position", X = Position.X.Scale + Position.X.Offset / Viewport.X, Y = Position.Y.Scale + Position.Y.Offset / Viewport.Y } end function Layout.SetPosition(Target, Value) if not Target.Parent or Value.Kind ~= "Position" then return end local Viewport = Layout.Viewport(Target) if not Viewport then return end local Size, Anchor = Target.AbsoluteSize, Target.AnchorPoint local Width = math.min(math.max(Size.X, Target.Size.X.Offset, 0), math.max(Viewport.X - 12, 0)) local Height = math.min(math.max(Size.Y, Target.Size.Y.Offset, 0), math.max(Viewport.Y - 12, 0)) local MinX, MaxX = 6 + Width * Anchor.X, Viewport.X - 6 - Width * (1 - Anchor.X) local MinY, MaxY = 6 + Height * Anchor.Y, Viewport.Y - 6 - Height * (1 - Anchor.Y) Target.Position = UDim2.fromScale(math.clamp(Value.X * Viewport.X, MinX, math.max(MinX, MaxX)) / Viewport.X, math.clamp(Value.Y * Viewport.Y, MinY, math.max(MinY, MaxY)) / Viewport.Y) end function Layout.Register(Key, Save, Load) local Entry = { Save = Save, Load = Load } Entries[Key] = Entry local function Restore() local Value = Snapshot.Items[Key] if not Library.Unloaded and Entries[Key] == Entry and Value then pcall(Load, Value) end end Restore() task.defer(Restore) end function Layout.TrackPosition(Key, Target) Layout.Register(Key, function() return Layout.ReadPosition(Target) end, function(Value) Layout.SetPosition(Target, Value) end) local function ClampPosition() local Value = Snapshot.Items[Key] or Layout.ReadPosition(Target) if Value then pcall(Layout.SetPosition, Target, Value) end end Connect(Target:GetPropertyChangedSignal("AbsoluteSize"), ClampPosition) if Target.Parent then Connect(Target.Parent:GetPropertyChangedSignal("AbsoluteSize"), ClampPosition) end end function Library:GetLayout() local Items = {} for Key, Value in Snapshot.Items do Items[Key] = Record(Value) end for Key, Entry in Entries do local Okay, Value = pcall(Entry.Save) if Okay then Items[Key] = Record(Value) or Items[Key] end end Snapshot = { Version = 1, Items = Items } return { Version = 1, Items = table.clone(Items) } end function Library:SaveLayout() local Data = Library:GetLayout() Env.SwiftLayout = Data local Okay, Json = pcall(HttpService.JSONEncode, HttpService, Data) if not Okay or type(Json) ~= "string" then return false end if Json == LastSaved then return true end local Written, Result = pcall(FS.Write, Path, Json) if Written and Result ~= false then LastSaved = Json return true end return false end function Library:LoadLayout(Data) if Data == nil then Data = FS.Read(Path) or Env.SwiftLayout end if type(Data) == "string" then local Okay, Decoded = pcall(HttpService.JSONDecode, HttpService, Data) if not Okay then return false end Data = Decoded end if type(Data) ~= "table" or Data.Version ~= 1 or type(Data.Items) ~= "table" then return false end local Items = {} for Key, Value in Data.Items do if type(Key) == "string" and #Key <= 256 then Items[Key] = Record(Value) end end Snapshot = { Version = 1, Items = Items } for Key, Entry in Entries do if Items[Key] then pcall(Entry.Load, Items[Key]) end end return true end Library:LoadLayout() end local function Tween(Object, Properties, Time, Style, Direction) local Info = TweenInfo.new(Time or Library.TweenTime, Style or Library.EasingStyle, Direction or Enum.EasingDirection.Out) local Created = TweenService:Create(Object, Info, Properties) Created:Play() return Created end Library.Tween = function(_, ...) return Tween(...) end local function Create(Class, Properties, Children) local Object = Instance.new(Class) local IsText = Class == "TextLabel" or Class == "TextButton" or Class == "TextBox" local Parent, RawText if Object:IsA("GuiObject") then Object.BorderSizePixel = 0 end if IsText then Fonts:Apply(Object, Enum.FontWeight.Bold) Object.TextSize = 13 if Class ~= "TextButton" then Object.BackgroundTransparency = 1 end Object.TextColor3 = Theme.Text Object.Text = "" end if Class == "TextButton" or Class == "ImageButton" then Object.AutoButtonColor = false end if Class == "ImageLabel" or Class == "ImageButton" then Object.BackgroundTransparency = 1 end if Class == "ScrollingFrame" then Object.BackgroundTransparency = 1 Object.ScrollBarThickness = 0 Object.CanvasSize = UDim2.new() Object.AutomaticCanvasSize = Enum.AutomaticSize.Y Object.ScrollingDirection = Enum.ScrollingDirection.Y Object.ElasticBehavior = Enum.ElasticBehavior.Never Object.ScrollBarImageColor3 = Theme.Accent end for Key, Value in Properties or {} do if Key == "Parent" then Parent = Value elseif Key == "Theme" then for Property, ThemeKey in Value do Library:Theme(Object, Property, ThemeKey) end elseif Key == "Text" and IsText and Class ~= "TextBox" and not (Properties.NoCase) then RawText = Value elseif Key ~= "NoCase" and Key ~= "Weight" then Object[Key] = Value end end if IsText and Properties and Properties.Weight then Fonts:Apply(Object, typeof(Properties.Weight) == "EnumItem" and Properties.Weight or Enum.FontWeight[Properties.Weight]) end if RawText ~= nil then Library:SetText(Object, RawText) elseif IsText and Properties and Properties.NoCase and Properties.Text then Object.Text = Properties.Text end for _, Child in Children or {} do Child.Parent = Object end if Parent then Object.Parent = Parent end return Object end Library.Create = function(_, ...) return Create(...) end local function Corner(Parent, Radius) return Create("UICorner", { CornerRadius = UDim.new(0, Radius or 5), Parent = Parent }) end local function Stroke(Parent, Key, Inner, Thickness) local Object = Create("UIStroke", { Thickness = Thickness or 1, ApplyStrokeMode = Enum.ApplyStrokeMode.Border, LineJoinMode = Enum.LineJoinMode.Round, Theme = { Color = Key or "Outline" }, Parent = Parent, }) if Inner ~= false then pcall(function() Object.BorderStrokePosition = Enum.BorderStrokePosition.Inner end) end return Object end local function Padding(Parent, Top, Bottom, Left, Right) return Create("UIPadding", { PaddingTop = UDim.new(0, Top or 0), PaddingBottom = UDim.new(0, Bottom or Top or 0), PaddingLeft = UDim.new(0, Left or Top or 0), PaddingRight = UDim.new(0, Right or Left or Top or 0), Parent = Parent, }) end local function ListLayout(Parent, Pad, Direction, HAlign, VAlign) return Create("UIListLayout", { Padding = UDim.new(0, Pad or 0), FillDirection = Direction or Enum.FillDirection.Vertical, HorizontalAlignment = HAlign or Enum.HorizontalAlignment.Left, VerticalAlignment = VAlign or Enum.VerticalAlignment.Top, SortOrder = Enum.SortOrder.LayoutOrder, Parent = Parent, }) end local function Shade(Parent) local Gradient = Create("UIGradient", { Rotation = 90, Color = GradientSequence(), Parent = Parent }) GradientRegistry[Gradient] = true return Gradient end local function Shadow(Parent, Transparency, Blur) local Ok, Object = pcall(Instance.new, "UIShadow") if not Ok then return nil end pcall(function() Object.BlurRadius = UDim.new(0, Blur or 20) Object.Transparency = Transparency or 0.5 end) Library:Theme(Object, "Color", "Shadow") Object.Parent = Parent return Object end local DrawnIcons = { Bullet = function(Holder) local Parts = { { Position = UDim2.new(0, 0, 0.5, 0), Size = UDim2.new(0.17, 0, 0.56, 0), Radius = 1 }, { Position = UDim2.new(0.27, 0, 0.5, 0), Size = UDim2.new(0.42, 0, 0.56, 0), Radius = 1 }, { Position = UDim2.new(0.44, 0, 0.5, 0), Size = UDim2.new(0.56, 0, 0.56, 0), Radius = 99 }, } local Frames = {} for _, Spec in Parts do local Frame = Instance.new("Frame") Frame.Name = "Glyph" Frame.AnchorPoint = Vector2.new(0, 0.5) Frame.Position, Frame.Size = Spec.Position, Spec.Size Frame.BorderSizePixel = 0 local Round = Instance.new("UICorner") Round.CornerRadius = UDim.new(0, Spec.Radius) Round.Parent = Frame Frame.Parent = Holder table.insert(Frames, Frame) end return Frames end, Cross = function(Holder) local Frames = {} for _, Size in { UDim2.new(1, 0, 0, 2), UDim2.new(0, 2, 1, 0) } do local Frame = Instance.new("Frame") Frame.Name = "Glyph" Frame.AnchorPoint = Vector2.new(0.5, 0.5) Frame.Position, Frame.Size = UDim2.fromScale(0.5, 0.5), Size Frame.BorderSizePixel = 0 local Round = Instance.new("UICorner") Round.CornerRadius = UDim.new(0, 1) Round.Parent = Frame Frame.Parent = Holder table.insert(Frames, Frame) end return Frames end, } local function SetIcon(Image, Icon) for _, Child in Image:GetChildren() do if Child.Name == "Glyph" then Child:Destroy() end end if Image:GetAttribute("GlyphConnection") then Image:SetAttribute("GlyphConnection", nil) end if type(Icon) == "string" and Icons[Icon] then Icon = Icons[Icon] end Image.ImageRectOffset, Image.ImageRectSize = Vector2.zero, Vector2.zero Image.Rotation = 0 if type(Icon) == "string" and DrawnIcons[Icon] then Image.Image = "" local Frames = DrawnIcons[Icon](Image) local function Sync() for _, Frame in Frames do Frame.BackgroundColor3 = Image.ImageColor3 Frame.BackgroundTransparency = Image.ImageTransparency end end Sync() Image:GetPropertyChangedSignal("ImageColor3"):Connect(Sync) Image:GetPropertyChangedSignal("ImageTransparency"):Connect(Sync) elseif type(Icon) == "table" then Image.Image = Icon.Image or "" Image.Rotation = Icon.Rotation or 0 if Icon.RectOffset then Image.ImageRectOffset = Icon.RectOffset end if Icon.RectSize then Image.ImageRectSize = Icon.RectSize end elseif type(Icon) == "string" then Image.Image = Icon else Image.Image = "" end end Icons.Bullet = "Bullet" Icons.Cross = "Cross" Library.SetIcon = function(_, ...) return SetIcon(...) end local function MousePosition() return UserInputService:GetMouseLocation() - GuiService:GetGuiInset() end local function IsMouseOver(Object, Margin) if not Object or not Object.Parent then return false end Margin = Margin or 0 local Position, Size = Object.AbsolutePosition, Object.AbsoluteSize local Point = MousePosition() return Point.X >= Position.X - Margin and Point.X <= Position.X + Size.X + Margin and Point.Y >= Position.Y - Margin and Point.Y <= Position.Y + Size.Y + Margin end Library.IsMouseOver = function(_, ...) return IsMouseOver(...) end local function IsVisibleOnScreen(Object) local Current = Object while Current and Current:IsA("GuiObject") do if not Current.Visible then return false end Current = Current.Parent end if Current and Current:IsA("LayerCollector") then return Current.Enabled end return Current ~= nil end local function Round(Number, Increment) Increment = Increment or 1 return math.floor(Number / Increment + 0.5) * Increment end local function Clamp(Number, Min, Max) return math.max(Min, math.min(Max, Number)) end local function KeyName(Key) if Key == nil or Key == "None" then return "NONE" end if typeof(Key) == "EnumItem" then return Key.Name:upper() end return tostring(Key):upper() end local function KeyFromName(Name) if Name == nil or Name == "None" or Name == "NONE" then return nil end if typeof(Name) == "EnumItem" then return Name end local Ok, Key = pcall(function() return Enum.KeyCode[Name] end) if Ok and Key then return Key end Ok, Key = pcall(function() return Enum.UserInputType[Name] end) if Ok and Key then return Key end return nil end local function InputMatches(Input, Key) if Key == nil then return false end if Key.EnumType == Enum.KeyCode then return Input.KeyCode == Key end return Input.UserInputType == Key end local function GetGuiParent() local Ok, Hui = pcall(function() return (typeof(gethui) == "function" and gethui()) or (typeof(Env.gethui) == "function" and Env.gethui()) or nil end) if Ok and Hui then return Hui end local CoreOk, CoreGui = pcall(function() local Gui = Service("CoreGui") local _ = Gui:GetChildren() local Test = Instance.new("ScreenGui") Test.Parent = Gui Test:Destroy() return Gui end) if CoreOk and CoreGui then return CoreGui end return LocalPlayer:WaitForChild("PlayerGui") end local function ProtectGui(Gui) if typeof(Env.syn) == "table" and typeof(Env.syn.protect_gui) == "function" then pcall(Env.syn.protect_gui, Gui) end end local FlagCounter = 0 local function NextFlag(Hint) FlagCounter += 1 return (Hint and tostring(Hint):gsub("%s+", "_") or "Flag") .. "_" .. FlagCounter end local function SafeCall(Callback, ...) if type(Callback) ~= "function" then return end local Ok, Error = pcall(Callback, ...) if not Ok then warn("[Swift] callback error: " .. tostring(Error)) end end local ThemeTween; do local GuiParent = GetGuiParent() local function Layer(Name, Order) local Gui = Instance.new("ScreenGui") Gui.Name = FS.Native and HttpService:GenerateGUID(false) or Name Gui.DisplayOrder = Order Gui.IgnoreGuiInset = true Gui.ResetOnSpawn = false Gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling ProtectGui(Gui) Gui.Parent = GuiParent return Gui end Library.HudGui = Layer("SwiftHud", 9000) Library.MenuGui = Layer("SwiftMenu", 9001) Library.OverlayGui = Layer("SwiftOverlay", 9002) function ThemeTween(Object, Property, Key, Time) local Entry = ThemeRegistry[Object] if not Entry then Entry = {} ThemeRegistry[Object] = Entry end Entry[Property] = Key return Tween(Object, { [Property] = Theme[Key] }, Time) end end local Privacy = {}; do local Widgets, Roots, Connections = {}, {}, {} local TextOwners, ImageOwners = setmetatable({}, { __mode = "k" }), setmetatable({}, { __mode = "k" }) local OwnImages, Names = {}, {} local Black, White = Color3.new(0, 0, 0), Color3.new(1, 1, 1) local Generation, AvatarRequest = 0, 0 Library.AnonymousMode, Library.AnonymousName, Library.AnonymousGame = false, "...", false if LocalPlayer then for _, Name in { LocalPlayer.Name, LocalPlayer.DisplayName } do if Name ~= "" and not table.find(Names, Name) then table.insert(Names, Name) end end end local function Escape(Text) return Text:gsub("&", "&"):gsub("<", "<"):gsub(">", ">") end local function Replace(Text, Rich) local Alias = Rich and Escape(Library.AnonymousName) or Library.AnonymousName local Parts, Cursor = {}, 1 while Cursor <= #Text do local First, Last for _, Name in Names do local Start, Finish = Text:find(Name, Cursor, true) while Start and (Text:sub(Start - 1, Start - 1):match("[%w_]") or Text:sub(Finish + 1, Finish + 1):match("[%w_]")) do Start, Finish = Text:find(Name, Finish + 1, true) end if Start and (not First or Start < First or Start == First and Finish > Last) then First, Last = Start, Finish end end if not First then table.insert(Parts, Text:sub(Cursor)); break end table.insert(Parts, Text:sub(Cursor, First - 1)) table.insert(Parts, Alias) Cursor = Last + 1 end return table.concat(Parts) end local function Mask(Text, Rich) if not Rich then return Replace(Text, false) end local Parts, Cursor = {}, 1 while Cursor <= #Text do local First, Last = Text:find("<[^>]*>", Cursor) if not First then table.insert(Parts, Replace(Text:sub(Cursor), true)); break end table.insert(Parts, Replace(Text:sub(Cursor, First - 1), true)) table.insert(Parts, Text:sub(First, Last)) Cursor = Last + 1 end return table.concat(Parts) end local function LibraryWidget(Widget) for _, Root in { Library.MenuGui, Library.HudGui, Library.OverlayGui } do if Root and (Widget == Root or Widget:IsDescendantOf(Root)) then return true end end return false end local function Included(Widget) if LibraryWidget(Widget) then return true end for Root, Entry in Roots do if Entry.Game and Root.Parent == LocalPlayer and Widget:IsDescendantOf(Root) then return true end end return false end local function Disconnect(List) for _, Connection in List do pcall(Connection.Disconnect, Connection) end table.clear(List) end local function Forget(Widget, Restore) local Record = Widgets[Widget] if not Record then return end Widgets[Widget] = nil Record.Active = false Disconnect(Record.Connections) if Restore then for Key, Value in Record.Values do pcall(function() Widget[Key] = Value end) end end end local function Apply(Widget, Record) if not Privacy.Active or Library.Unloaded or not Record.Active or not Widget.Parent then return end Record.Writing = true pcall(function() if Record.Values.Text ~= nil then local Text = TextOwners[Widget] and (Widget.RichText and Escape(Library.AnonymousName) or Library.AnonymousName) or Mask(Record.Values.Text, Widget.RichText) Record.Applied.Text = Text Widget.Text = Text else local Image = Record.Values.Image local Own = ImageOwners[Widget] == true or Image ~= "" and OwnImages[Image] == true or LocalPlayer and Image:find("rbxthumb://", 1, true) and Image:match("[?&]id=(%d+)") == tostring(LocalPlayer.UserId) for Key, Value in Record.Values do if Own then if Key == "Image" then Value = Library.AnonymousImage or "" elseif Key == "ImageColor3" then Value = Library.AnonymousImage and White or Black elseif Key == "BackgroundColor3" then Value = Black elseif Key == "BackgroundTransparency" and not Library.AnonymousImage then Value = 0 end end Record.Applied[Key] = Value Widget[Key] = Value end end end) Record.Writing = false end local function Add(Widget) if not Privacy.Active or Widgets[Widget] or not Included(Widget) then return end local Text = Widget:IsA("TextLabel") or Widget:IsA("TextButton") if not Text and not Widget:IsA("ImageLabel") and not Widget:IsA("ImageButton") then return end local Record = { Active = true, Values = {}, Applied = {}, Connections = {} } Widgets[Widget] = Record for _, Key in Text and { "Text" } or { "Image", "ImageColor3", "BackgroundColor3", "BackgroundTransparency" } do Record.Values[Key] = Widget[Key] table.insert(Record.Connections, Widget:GetPropertyChangedSignal(Key):Connect(function() if not Record.Active or Record.Writing then return end local Value = Widget[Key] if Value == Record.Applied[Key] then return end Record.Values[Key] = Value Apply(Widget, Record) end)) end if Text then table.insert(Record.Connections, Widget:GetPropertyChangedSignal("RichText"):Connect(function() Apply(Widget, Record) end)) end table.insert(Record.Connections, Widget.Destroying:Connect(function() Forget(Widget, false) end)) Apply(Widget, Record) end local function Watch(Root, Game) if not Root or Roots[Root] then return end local Entry, Token = { Game = Game, Connections = {} }, Generation Roots[Root] = Entry table.insert(Entry.Connections, Root.DescendantAdded:Connect(Add)) table.insert(Entry.Connections, Root.DescendantRemoving:Connect(function(Widget) task.defer(function() if Privacy.Active and Generation == Token and not Included(Widget) then Forget(Widget, true) end end) end)) for _, Widget in Root:GetDescendants() do Add(Widget) end end function Privacy:Stop() self.Active = false Generation += 1 Disconnect(Connections) for _, Entry in Roots do Disconnect(Entry.Connections) end table.clear(Roots) local Pending = {} for Widget in Widgets do table.insert(Pending, Widget) end for _, Widget in Pending do Forget(Widget, true) end end function Privacy:Start() self.Active, self.Game = true, Library.AnonymousGame for _, Root in { Library.MenuGui, Library.HudGui, Library.OverlayGui } do Watch(Root, false) end if self.Game and LocalPlayer then Watch(LocalPlayer:FindFirstChildOfClass("PlayerGui"), true) table.insert(Connections, LocalPlayer.ChildAdded:Connect(function(Child) if self.Active and Child:IsA("PlayerGui") then Watch(Child, true) end end)) table.insert(Connections, LocalPlayer.ChildRemoved:Connect(function(Child) local Entry = Roots[Child] if not Entry or not Entry.Game then return end Disconnect(Entry.Connections) Roots[Child] = nil local Pending = {} for Widget in Widgets do if not Included(Widget) then table.insert(Pending, Widget) end end for _, Widget in Pending do Forget(Widget, true) end end)) end end function Privacy:Refresh() for Widget, Record in Widgets do Apply(Widget, Record) end end function Library:GetAnonymousText(Text, Rich) Text = tostring(Text or "") return self.AnonymousMode and Mask(Text, Rich) or Text end function Library:SetPlayerText(Widget, Player, Text) TextOwners[Widget] = Player == LocalPlayer and LocalPlayer ~= nil or nil self:SetText(Widget, Text) if Widgets[Widget] then Apply(Widget, Widgets[Widget]) end end function Library:SetPlayerAvatar(Widget, Player, Image) Image = tostring(Image or "") ImageOwners[Widget] = Player == LocalPlayer and LocalPlayer ~= nil or nil if ImageOwners[Widget] and Image ~= "" then OwnImages[Image] = true end Widget.Image = Image if Widgets[Widget] then Apply(Widget, Widgets[Widget]) end end function Library:SetAnonymous(Value) if self.Unloaded then return self end self.AnonymousMode = Value == true if self.AnonymousMode then if not Privacy.Active or Privacy.Game ~= self.AnonymousGame then Privacy:Stop(); Privacy:Start() end Privacy:Refresh() else Privacy:Stop() end if self.Watermark then self.Watermark:_Render() end return self end function Library:SetAnonymousName(Value) local Name = tostring(Value or ""):gsub("[%c]", ""):match("^%s*(.-)%s*$") self.AnonymousName = Name ~= "" and Name:sub(1, 40) or "..." return self:SetAnonymous(self.AnonymousMode) end function Library:SetAnonymousGame(Value) self.AnonymousGame = Value == true return self:SetAnonymous(self.AnonymousMode) end function Library:SetAnonymousAvatar(Value) AvatarRequest += 1 local Request = AvatarRequest local Input = tostring(Value or ""):match("^%s*(.-)%s*$") if self.Unloaded then return false end if Input == "" then self.AnonymousImage = nil; self:SetAnonymous(self.AnonymousMode); return true end local UserId = tonumber(Input) local function Notify(Text) if type(self.Notify) == "function" then pcall(self.Notify, self, { Title = "Anonymous Mode", Text = Text, Type = "Warning" }) end end if not UserId or UserId ~= UserId or UserId < 1 or UserId > 9007199254740991 or UserId % 1 ~= 0 then Notify("Enter a valid avatar user ID."); return false end task.spawn(function() if self.Unloaded or Request ~= AvatarRequest then return end local Okay = pcall(Players.GetNameFromUserIdAsync, Players, UserId) if self.Unloaded or Request ~= AvatarRequest then return end if not Okay then Notify("Avatar user ID was not found."); return end local Loaded, Image = pcall(Players.GetUserThumbnailAsync, Players, UserId, Enum.ThumbnailType.HeadShot, Enum.ThumbnailSize.Size150x150) if self.Unloaded or Request ~= AvatarRequest then return end self.AnonymousImage = Loaded and type(Image) == "string" and Image ~= "" and Image or "rbxthumb://type=AvatarHeadShot&id=" .. UserId .. "&w=150&h=150" self:SetAnonymous(self.AnonymousMode) end) return true end end local PlacePopup, PopupPanel, FadePopup; do local Popups = Library.PopupStack local function IsPopupAncestor(Ancestor, Popup) local Current = Popup.ParentPopup while Current do if Current == Ancestor then return true end Current = Current.ParentPopup end return false end function Library:ClosePopup(Popup) local Index = table.find(Popups, Popup) if not Index then return end for Position = #Popups, Index, -1 do local Closing = table.remove(Popups, Position) Closing.Open = false SafeCall(Closing.OnClose, Closing) end end function Library:CloseAllPopups() for Position = #Popups, 1, -1 do if Popups[Position] then Library:ClosePopup(Popups[Position]) end end end function Library:OpenPopup(Popup) for Position = #Popups, 1, -1 do local Other = Popups[Position] if Other ~= Popup.ParentPopup and not IsPopupAncestor(Other, Popup) then Library:ClosePopup(Other) else break end end Popup.Open = true table.insert(Popups, Popup) SafeCall(Popup.Update, Popup) end Connect(UserInputService.InputBegan, function(Input) if Input.UserInputType ~= Enum.UserInputType.MouseButton1 and Input.UserInputType ~= Enum.UserInputType.Touch then return end for Position = #Popups, 1, -1 do local Popup = Popups[Position] if not Popup then continue end if IsMouseOver(Popup.Frame) or (Popup.Owner and IsMouseOver(Popup.Owner)) then break end Library:ClosePopup(Popup) end end) Connect(RunService.RenderStepped, function() for Position = #Popups, 1, -1 do local Popup = Popups[Position] if not Popup then continue end local Watched = Popup.Owner or Popup.Anchor if Watched and not IsVisibleOnScreen(Watched) then Library:ClosePopup(Popup) else SafeCall(Popup.Update, Popup) end end end) local PopupTargets = setmetatable({}, { __mode = "k" }) function PlacePopup(Frame, Owner, OffsetX, OffsetY, AlignRight) local Gui = Library.OverlayGui local Origin, Viewport = Gui.AbsolutePosition, Gui.AbsoluteSize local Position, Size = Owner.AbsolutePosition, Owner.AbsoluteSize local Width, Height = Frame.AbsoluteSize.X, Frame.AbsoluteSize.Y local X = AlignRight and (Position.X + Size.X - Width + (OffsetX or 0)) or (Position.X + (OffsetX or 0)) local Y = Position.Y + Size.Y + (OffsetY or 0) if Y + Height > Origin.Y + Viewport.Y - 6 then Y = math.max(Origin.Y + 6, Position.Y - Height - (OffsetY or 0)) end X = Clamp(X, Origin.X + 6, math.max(Origin.X + 6, Origin.X + Viewport.X - Width - 6)) local Target = Vector2.new(math.floor(X - Origin.X + 0.5), math.floor(Y - Origin.Y + 0.5)) if PopupTargets[Frame] ~= Target or not Frame.Visible then PopupTargets[Frame] = Target Frame.Position = UDim2.fromOffset(Target.X, Target.Y) end end function PopupPanel(Size, Name, Radius) local Frame = Create("CanvasGroup", { Name = Name or "Popup", Size = Size, Theme = { BackgroundColor3 = "Popup" }, GroupTransparency = 1, Active = true, Visible = false, ZIndex = 10, Parent = Library.OverlayGui, }) Corner(Frame, Radius or 6) Stroke(Frame, "Outline") return Frame end local FadeTokens = setmetatable({}, { __mode = "k" }) local FadeBases = setmetatable({}, { __mode = "k" }) function FadePopup(Frame, Open, OffsetY) local Token = {} FadeTokens[Frame] = Token local Target = PopupTargets[Frame] local Base = FadeBases[Frame] or (Target and UDim2.fromOffset(Target.X, Target.Y)) or Frame.Position if Open then FadeBases[Frame] = nil Frame.Visible = true Frame.GroupTransparency = 1 Frame.Position = Base - UDim2.fromOffset(0, OffsetY or 5) Tween(Frame, { Position = Base, GroupTransparency = 0 }, 0.15, Enum.EasingStyle.Quad) else FadeBases[Frame] = Base Tween(Frame, { Position = Base - UDim2.fromOffset(0, 14) }, 0.2, Enum.EasingStyle.Quad) Tween(Frame, { GroupTransparency = 1 }, 0.18, Enum.EasingStyle.Sine).Completed:Connect(function() if FadeTokens[Frame] ~= Token then return end FadeBases[Frame] = nil Frame.Visible = false Frame.Position = Base end) end end end do local LOGO_SCALE = 420 / 231 local LOGO_SHIFT = Vector2.new(2 / 420, -8 / 420) function Library:Logo(Parent, Size, Icon) Size = Size or 20 local Holder = Create("Frame", { Name = "Logo", Size = UDim2.fromOffset(Size, Size), BackgroundTransparency = 1, Parent = Parent }) local ImageSize = Size * LOGO_SCALE local IsLogo = Icon == nil or Icon == "Logo" local Image = Create("ImageLabel", { AnchorPoint = Vector2.new(0.5, 0.5), Position = IsLogo and UDim2.new(0.5, ImageSize * LOGO_SHIFT.X, 0.5, ImageSize * LOGO_SHIFT.Y) or UDim2.fromScale(0.5, 0.5), Size = IsLogo and UDim2.fromOffset(ImageSize, ImageSize) or UDim2.fromOffset(Size, Size), Theme = { ImageColor3 = "Text" }, Parent = Holder, }) SetIcon(Image, Icon or "Logo") Holder:SetAttribute("Logo", true) return Holder, Image end end local Window, Tab, Section; do Window = {} Window.__index = Window Tab = {} Tab.__index = Tab Section = {} Section.__index = Section Library.Classes = { Window = Window, Tab = Tab, Section = Section } local MENU_SIZE = Vector2.new(600, 570) local MENU_RADIUS = 8 local SIDEBAR_WIDTH = 141 function Library:CreateWindow(Config) Config = Config or {} local Self = setmetatable({ Title = Config.Title or "Swift", Tabs = {}, Sections = {}, Floating = {}, Categories = {}, Open = true, LayoutCounter = 0, ZCounter = 10, }, Window) table.insert(Library.Windows, Self) Library.Window = Self local Holder = Create("Frame", { Name = "Menu", AnchorPoint = Vector2.new(0.5, 0.5), Position = Config.Position or UDim2.fromScale(0.5, 0.5), Size = UDim2.fromOffset((Config.Size or MENU_SIZE).X, (Config.Size or MENU_SIZE).Y), BackgroundTransparency = 1, ZIndex = 5, Parent = Library.MenuGui, }) Self.Holder = Holder Self.LayoutKey = "Window/" .. tostring(Config.LayoutId or #Library.Windows) Layout.TrackPosition(Self.LayoutKey, Holder) local ShadowFrame = Create("Frame", { Size = UDim2.fromScale(1, 1), Theme = { BackgroundColor3 = "Background" }, Parent = Holder }) Corner(ShadowFrame, MENU_RADIUS) Self.ShadowFrame = ShadowFrame Self.Shadow = Shadow(ShadowFrame, 0.35, 32) local Canvas = Create("CanvasGroup", { Size = UDim2.fromScale(1, 1), Theme = { BackgroundColor3 = "Background" }, ZIndex = 2, Parent = Holder }) Corner(Canvas, MENU_RADIUS) Self.Canvas = Canvas local Sidebar = Create("Frame", { Name = "Sidebar", Size = UDim2.new(0, SIDEBAR_WIDTH, 1, 0), Theme = { BackgroundColor3 = "Inline" }, Parent = Canvas }) Self.Sidebar = Sidebar Create("Frame", { Name = "Divider", Position = UDim2.fromOffset(SIDEBAR_WIDTH, 0), Size = UDim2.new(0, 1, 1, 0), Theme = { BackgroundColor3 = "Outline" }, Parent = Canvas }) local Content = Create("Frame", { Name = "Content", Position = UDim2.fromOffset(SIDEBAR_WIDTH + 1, 0), Size = UDim2.new(1, -(SIDEBAR_WIDTH + 1), 1, 0), BackgroundTransparency = 1, ClipsDescendants = true, Parent = Canvas, }) Self.Content = Content local OutlineFrame = Create("Frame", { Name = "Outline", Size = UDim2.fromScale(1, 1), BackgroundTransparency = 1, ZIndex = 80, Parent = Canvas }) Corner(OutlineFrame, MENU_RADIUS) Stroke(OutlineFrame, "Outline") local HEADER_HEIGHT = 64 local Header = Create("Frame", { Name = "Header", Size = UDim2.new(1, 0, 0, HEADER_HEIGHT), BackgroundTransparency = 1, Parent = Sidebar }) ListLayout(Header, 9, Enum.FillDirection.Horizontal, Enum.HorizontalAlignment.Center, Enum.VerticalAlignment.Center) local Logo = Library:Logo(Header, 24, Config.Logo) Logo.LayoutOrder = 1 local TitleLabel = Create("TextLabel", { Name = "Title", Size = UDim2.fromOffset(0, 28), AutomaticSize = Enum.AutomaticSize.X, Text = Self.Title, TextSize = 21, LayoutOrder = 2, Theme = { TextColor3 = "Text" }, Parent = Header, }) Self.Logo, Self.TitleLabel = Logo, TitleLabel local TabList = Create("ScrollingFrame", { Name = "Tabs", Position = UDim2.fromOffset(10, HEADER_HEIGHT), Size = UDim2.new(0, 121, 1, -(HEADER_HEIGHT + 46)), BackgroundTransparency = 1, Parent = Sidebar, }) ListLayout(TabList, 6) Self.TabList = TabList local SearchButton = Create("TextButton", { Name = "Search", Position = UDim2.new(0, 10, 1, -38), Size = UDim2.fromOffset(121, 28), Theme = { BackgroundColor3 = "Tab" }, Parent = Sidebar, }) Corner(SearchButton, 6) Stroke(SearchButton, "Outline") local SearchIcon = Create("ImageLabel", { AnchorPoint = Vector2.new(0, 0.5), Position = UDim2.new(0, 8, 0.5, 0), Size = UDim2.fromOffset(16, 16), Theme = { ImageColor3 = "Inactive Text" }, Parent = SearchButton }) SetIcon(SearchIcon, "Search") local SearchText = Create("TextLabel", { Position = UDim2.fromOffset(32, 0), Size = UDim2.new(1, -36, 1, 0), Text = "Search...", NoCase = true, TextXAlignment = Enum.TextXAlignment.Left, TextTruncate = Enum.TextTruncate.AtEnd, Theme = { TextColor3 = "Inactive Text" }, Parent = SearchButton, }) Self.SearchButton, Self.SearchText = SearchButton, SearchText do local Dragging, StartMouse, StartPosition = false, nil, nil local function Begin(Input) if Input.UserInputType ~= Enum.UserInputType.MouseButton1 and Input.UserInputType ~= Enum.UserInputType.Touch then return end Dragging = true StartMouse = MousePosition() StartPosition = Holder.Position end Connect(Sidebar.InputBegan, Begin) Connect(UserInputService.InputChanged, function(Input) if not Dragging then return end if Input.UserInputType ~= Enum.UserInputType.MouseMovement and Input.UserInputType ~= Enum.UserInputType.Touch then return end local Delta = MousePosition() - StartMouse Holder.Position = UDim2.new(StartPosition.X.Scale, StartPosition.X.Offset + Delta.X, StartPosition.Y.Scale, StartPosition.Y.Offset + Delta.Y) end) Connect(UserInputService.InputEnded, function(Input) if Input.UserInputType == Enum.UserInputType.MouseButton1 or Input.UserInputType == Enum.UserInputType.Touch then if Dragging then Library:SaveLayout() end Dragging = false end end) end Self:_BuildSearch() Connect(SearchButton.MouseButton1Click, function() Self:OpenSearch() end) return Self end function Window:AddCategory(Name) self.LayoutCounter += 1 local Label = Create("TextLabel", { Name = "Category", Size = UDim2.new(1, 0, 0, 12), Text = Name, TextSize = 10, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Inactive Text" }, LayoutOrder = self.LayoutCounter, Parent = self.TabList, }) Padding(Label, 0, 0, 2, 0) table.insert(self.Categories, Label) return Label end function Window:SetTitle(Title) self.Title = Title Library:SetText(self.TitleLabel, Title) end function Window:SetLogo(Icon) SetIcon(self.Logo:FindFirstChildOfClass("ImageLabel"), Icon) end function Window:SetOpen(Open) if Open == nil then Open = not self.Open end self.Open = Open local Holder = self.Holder if Open then Holder.Visible = true end Tween(self.Canvas, { GroupTransparency = Open and 0 or 1 }, 0.16) Tween(self.ShadowFrame, { BackgroundTransparency = Open and 0 or 1 }, 0.16) if self.Shadow then Tween(self.Shadow, { Transparency = Open and 0.35 or 1 }, 0.16) end for _, Floating in self.Floating do if Open then Floating.Visible = true end Tween(Floating, { GroupTransparency = Open and 0 or 1 }, 0.16) end for _, Extra in self.Extras or {} do SafeCall(Extra, Open) end if not Open then Library:CloseAllPopups() self:CloseSearch() task.delay(0.17, function() if self.Open then return end Holder.Visible = false for _, Floating in self.Floating do Floating.Visible = false end end) end Library:_UpdateBlur() end function Window:Toggle() self:SetOpen(not self.Open) end function Window:OnOpenChanged(Callback) self.Extras = self.Extras or {} table.insert(self.Extras, Callback) end end do function Window:AddTab(Config) if type(Config) == "string" then Config = { Title = Config } end Config = Config or {} if Config.Category then if self._LastCategory ~= Config.Category then self:AddCategory(Config.Category) self._LastCategory = Config.Category end end self.LayoutCounter += 1 local Self = setmetatable({ Title = Config.Title or "Tab", Window = self, Sections = {}, Active = false, SectionCounter = 0, }, Tab) local Button = Create("TextButton", { Name = "Tab", Size = UDim2.new(1, 0, 0, 26), BackgroundTransparency = 1, Theme = { BackgroundColor3 = "Tab" }, LayoutOrder = self.LayoutCounter, Parent = self.TabList, }) Corner(Button, 5) local ButtonStroke = Stroke(Button, "Outline") ButtonStroke.Transparency = 1 local Icon = Create("ImageLabel", { AnchorPoint = Vector2.new(0, 0.5), Position = UDim2.new(0, 7, 0.5, 0), Size = UDim2.fromOffset(16, 16), Theme = { ImageColor3 = "Inactive Text" }, Parent = Button, }) SetIcon(Icon, Config.Icon) local Label = Create("TextLabel", { Weight = "SemiBold", Position = UDim2.fromOffset(33, 0), Size = UDim2.new(1, -33, 1, 0), Text = Self.Title, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Inactive Text" }, Parent = Button, }) Self.Button, Self.ButtonStroke, Self.Icon, Self.Label = Button, ButtonStroke, Icon, Label local Page = Create("CanvasGroup", { Name = "Page", Size = UDim2.fromScale(1, 1), BackgroundTransparency = 1, GroupTransparency = 1, Visible = false, Parent = self.Content, }) Self.Page = Page local function Column(Position) local Frame = Create("ScrollingFrame", { Position = Position, Size = UDim2.new(0.5, -15, 1, 0), Parent = Page, }) Padding(Frame, 10, 10, 0, 0) ListLayout(Frame, 10) return Frame end Self.Left = Column(UDim2.fromOffset(10, 0)) Self.Right = Column(UDim2.new(0.5, 5, 0, 0)) Self.Columns = { Self.Left, Self.Right } Connect(Button.MouseEnter, function() Self.Hovered = true if Self.Active then return end Tween(Button, { BackgroundTransparency = 0 }, 0.12) Tween(ButtonStroke, { Transparency = 0 }, 0.12) end) Connect(Button.MouseLeave, function() Self.Hovered = false if Self.Active then return end Tween(Button, { BackgroundTransparency = 1 }, 0.15) Tween(ButtonStroke, { Transparency = 1 }, 0.15) end) Connect(Button.MouseButton1Click, function() Self:Select() end) table.insert(self.Tabs, Self) if not self.ActiveTab then Self:Select(true) end return Self end local PAGE_SLIDE = 10 function Tab:_SetActive(Active, Instant) self.Active = Active local ButtonTime = Instant and 0 or (Active and 0.08 or 0.18) Tween(self.Button, { BackgroundTransparency = (Active or self.Hovered) and 0 or 1 }, ButtonTime) Tween(self.ButtonStroke, { Transparency = (Active or self.Hovered) and 0 or 1 }, ButtonTime) ThemeTween(self.Label, "TextColor3", Active and "Text" or "Inactive Text", Instant and 0 or 0.1) ThemeTween(self.Icon, "ImageColor3", Active and "Text" or "Inactive Text", Instant and 0 or 0.1) local Page = self.Page if Active then Page.Visible = true Page.ZIndex = 2 Page.Position = UDim2.fromOffset(0, Instant and 0 or PAGE_SLIDE) Tween(Page, { Position = UDim2.fromOffset(0, 0) }, Instant and 0 or 0.3, Enum.EasingStyle.Quad) Tween(Page, { GroupTransparency = 0 }, Instant and 0 or 0.15, Enum.EasingStyle.Quad) else Page.ZIndex = 1 Tween(Page, { Position = UDim2.fromOffset(0, Instant and 0 or -PAGE_SLIDE) }, Instant and 0 or 0.3, Enum.EasingStyle.Quad) Tween(Page, { GroupTransparency = 1 }, Instant and 0 or 0.2, Enum.EasingStyle.Quad).Completed:Connect(function() if not self.Active then Page.Visible = false Page.Position = UDim2.fromOffset(0, 0) end end) end end function Tab:Select(Instant) local Window_ = self.Window local Old = Window_.ActiveTab if Old == self then return end Window_.ActiveTab = self Library:CloseAllPopups() if Old then Old:_SetActive(false, Instant) end self:_SetActive(true, Instant) for _, Callback in self.SelectCallbacks or {} do SafeCall(Callback) end end function Tab:OnSelected(Callback) self.SelectCallbacks = self.SelectCallbacks or {} table.insert(self.SelectCallbacks, Callback) end end local Container = {} Container.__index = Container Library.Classes.Container = Container local function NewContainer(Holder, Owner) return setmetatable({ Holder = Holder, Section = Owner.Section, Tab = Owner.Tab, Window = Owner.Window, Path = Owner.Path, Counter = 0, Elements = {}, }, Container) end local function SectionBox(Parent, Owner, Pad) local Box = Create("Frame", { Name = "Box", Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y, Theme = { BackgroundColor3 = "Tab" }, Parent = Parent, }) Corner(Box, 5) Stroke(Box, "Outline") local Items = Create("Frame", { Name = "Items", Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y, BackgroundTransparency = 1, Parent = Box, }) Padding(Items, Pad or 11, Pad or 11, Pad or 11, Pad or 11) ListLayout(Items, 6) return Box, NewContainer(Items, Owner) end function Tab:AddSection(Config) if type(Config) == "string" then Config = { Title = Config } end Config = Config or {} local Side = Config.Side if Side == "Right" or Side == 2 then Side = 2 elseif Side == "Left" or Side == 1 then Side = 1 else Side = (#self.Left:GetChildren() <= #self.Right:GetChildren()) and 1 or 2 end self.SectionCounter += 1 local Self = setmetatable({ Title = Config.Title or "Section", Tab = self, Window = self.Window, Side = Side, Order = self.SectionCounter, }, Section) Self.Section = Self Self.Path = self.Title .. " / " .. Self.Title Self.LayoutKey = self.Window.LayoutKey .. "/Section/" .. Self.Path .. "/" .. tostring(self.SectionCounter) local Frame = Create("Frame", { Name = "Section", Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y, BackgroundTransparency = 1, LayoutOrder = self.SectionCounter, Parent = self.Columns[Side], }) ListLayout(Frame, 8) local Header = Create("TextButton", { Name = "Header", Size = UDim2.new(1, 0, 0, 19), BackgroundTransparency = 1, LayoutOrder = 0, Parent = Frame }) local HeaderIcon = Create("ImageLabel", { AnchorPoint = Vector2.new(0, 0.5), Position = UDim2.new(0, 1, 0.5, 0), Size = UDim2.fromOffset(15, 15), Theme = { ImageColor3 = "Inactive Text" }, Parent = Header, }) SetIcon(HeaderIcon, Config.Icon or "Cube") local HeaderTitle = Create("TextLabel", { Position = UDim2.fromOffset(27, 0), Size = UDim2.new(1, -27, 1, 0), Text = Self.Title, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Inactive Text" }, Parent = Header, }) local Box, Items = SectionBox(Frame, Self) Box.LayoutOrder = 1 Self.Frame, Self.Header, Self.HeaderIcon, Self.HeaderTitle, Self.Box, Self.Container = Frame, Header, HeaderIcon, HeaderTitle, Box, Items setmetatable(Self, { __index = function(_, Key) local Value = rawget(Section, Key) if Value ~= nil then return Value end local Method = Container[Key] if type(Method) == "function" then local Callback = function(_, ...) return Method(Items, ...) end; return Callback end return nil end, }) table.insert(self.Sections, Self) table.insert(self.Window.Sections, Self) Library:_Index({ Title = Self.Title, Path = Self.Path, Type = "Section", Tab = self, Target = Frame, Section = Self }) if Config.Detachable ~= false then Self:_MakeDetachable() end return Self end function Section:SetTitle(Title) self.Title = Title Library:SetText(self.HeaderTitle, Title) end function Section:SetVisible(Visible) self.Frame.Visible = Visible end function Section:_MakeDetachable() local Window_ = self.Window local Frame, Header = self.Frame, self.Header local Pressing, Moved, StartMouse, GrabOffset = false, false, nil, nil local function BringToFront() if self.FloatWindow then Window_.ZCounter += 1 self.FloatWindow.ZIndex = Window_.ZCounter end end local function Detach() if self.Floating then return end local Position, Size = Frame.AbsolutePosition - Library.MenuGui.AbsolutePosition, Frame.AbsoluteSize local Width = Size.X > 0 and Size.X or math.max(120, (Window_.Holder.Size.X.Offset - 142) * 0.5 - 15) local Float = Create("CanvasGroup", { Name = "FloatingSection", BackgroundTransparency = 1, Size = UDim2.fromOffset(Width, 0), AutomaticSize = Enum.AutomaticSize.Y, Position = UDim2.fromOffset(Position.X, Position.Y), Parent = Library.MenuGui, }) self.FloatWindow = Float self.Floating = true Frame.Parent = Float table.insert(Window_.Floating, Float) BringToFront() Library:CloseAllPopups() end local function Dock() local Content = Window_.Content local Mouse_ = MousePosition() local Middle = Content.AbsolutePosition.X + Content.AbsoluteSize.X / 2 local Side = Mouse_.X < Middle and 1 or 2 local Columns = self.Tab.Columns local Order = self.Order local Best for _, Other in self.Tab.Sections do if Other ~= self and not Other.Floating and Other.Frame.Parent == Columns[Side] then local Top = Other.Frame.AbsolutePosition.Y + Other.Frame.AbsoluteSize.Y / 2 if Mouse_.Y < Top and (not Best or Other.Frame.LayoutOrder < Best) then Best = Other.Frame.LayoutOrder end end end if Best then for _, Other in self.Tab.Sections do if Other ~= self and Other.Frame.Parent == Columns[Side] and Other.Frame.LayoutOrder >= Best then Other.Frame.LayoutOrder += 1 end end Order = Best else Order = 0 for _, Other in self.Tab.Sections do if Other.Frame.Parent == Columns[Side] then Order = math.max(Order, Other.Frame.LayoutOrder) end end Order += 1 end Frame.LayoutOrder = Order Frame.Parent = Columns[Side] self.Side = Side local Float = self.FloatWindow self.FloatWindow = nil self.Floating = false local Index = table.find(Window_.Floating, Float) if Index then table.remove(Window_.Floating, Index) end if Float then Float:Destroy() end end self.Dock = Dock self.Detach = Detach Connect(Header.InputBegan, function(Input) if Input.UserInputType ~= Enum.UserInputType.MouseButton1 and Input.UserInputType ~= Enum.UserInputType.Touch then return end Pressing, Moved = true, false StartMouse = MousePosition() GrabOffset = StartMouse - Frame.AbsolutePosition BringToFront() end) Connect(UserInputService.InputChanged, function(Input) if not Pressing then return end if Input.UserInputType ~= Enum.UserInputType.MouseMovement and Input.UserInputType ~= Enum.UserInputType.Touch then return end local Mouse_ = MousePosition() if not Moved and (Mouse_ - StartMouse).Magnitude > 8 then Moved = true if not self.Floating then Detach() end end if Moved and self.FloatWindow then local Target = Mouse_ - GrabOffset - Library.MenuGui.AbsolutePosition self.FloatWindow.Position = UDim2.fromOffset(Target.X, Target.Y) end end) Connect(UserInputService.InputEnded, function(Input) if not Pressing then return end if Input.UserInputType ~= Enum.UserInputType.MouseButton1 and Input.UserInputType ~= Enum.UserInputType.Touch then return end Pressing = false if Moved and self.Floating and Window_.Open and self.Tab.Active and IsMouseOver(Window_.Content) then Dock() end if Moved then Library:SaveLayout() end end) Layout.Register(self.LayoutKey, function() return { Kind = "Section", Floating = self.Floating == true, Side = self.Side, Order = Frame.LayoutOrder, Position = self.FloatWindow and Layout.ReadPosition(self.FloatWindow) } end, function(Value) if Value.Kind ~= "Section" then return end self.Side = Value.Side Frame.LayoutOrder = Value.Order if Value.Floating then Detach() Layout.SetPosition(self.FloatWindow, Value.Position) else self:Redock(true) Frame.Parent = self.Tab.Columns[Value.Side] Frame.LayoutOrder = Value.Order end end) end function Section:Redock(Silent) if self.Floating and self.Dock then local Columns = self.Tab.Columns self.Frame.Parent = Columns[self.Side] self.Frame.LayoutOrder = self.Order local Float = self.FloatWindow self.FloatWindow, self.Floating = nil, false local Index = table.find(self.Window.Floating, Float) if Index then table.remove(self.Window.Floating, Index) end if Float then Float:Destroy() end if not Silent then Library:SaveLayout() end end end function Window:ResetLayout() for _, Section_ in self.Sections do Section_:Redock(true) end Library:SaveLayout() end local Class, RegisterFlag, LayoutGlyph, ResetGlyph; do local ElementBase = {} ElementBase.__index = ElementBase Library.Classes.ElementBase = ElementBase function Class(Name) local Object = {} Object.__index = function(_, Key) local Value = rawget(Object, Key) if Value ~= nil then return Value end return ElementBase[Key] end Library.Classes[Name] = Object return Object end function ElementBase:Get() return self.Value end function ElementBase:OnChanged(Callback) self.ChangedCallbacks = self.ChangedCallbacks or {} table.insert(self.ChangedCallbacks, Callback) return self end function ElementBase:SetVisible(Visible) if self.Row then self.Row.Visible = Visible end end function ElementBase:_Fire(...) SafeCall(self.Callback, ...) for _, Callback in self.ChangedCallbacks or {} do SafeCall(Callback, ...) end end function ElementBase:Serialize() return self.Value end function ElementBase:Deserialize(Value) self:Set(Value) end function RegisterFlag(Element) if Element.Flag then Library.Flags[Element.Flag] = Element.Value Library.Elements[Element.Flag] = Element end end function Container:_Row(Height, Class_) self.Counter += 1 return Create(Class_ or "Frame", { Name = "Element", Size = UDim2.new(1, 0, 0, Height), BackgroundTransparency = 1, LayoutOrder = self.Counter, Parent = self.Holder, }) end function Container:_Index(Title, Type, Row) if not self.Tab or self.NoIndex then return end Library:_Index({ Title = Title, Path = self.Path or self.Tab.Title, Type = Type, Tab = self.Tab, Target = Row, Section = self.Section }) end function LayoutGlyph(Parent) local Glyph = Create("Frame", { AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, -7, 0.5, 0), Size = UDim2.fromOffset(12, 12), BackgroundTransparency = 1, Parent = Parent }) for _, Rect in { { 0, 0, 12, 4 }, { 0, 5, 5, 7 }, { 7, 5, 5, 7 } } do local Part = Create("Frame", { Position = UDim2.fromOffset(Rect[1], Rect[2]), Size = UDim2.fromOffset(Rect[3], Rect[4]), Theme = { BackgroundColor3 = "Inactive Text" }, Parent = Glyph }) Corner(Part, 1) end return Glyph end function ResetGlyph(Parent, Size) Size = Size or 12 local Glyph = Create("Frame", { Size = UDim2.fromOffset(Size, Size), BackgroundTransparency = 1, Parent = Parent }) local Ring = Create("Frame", { Size = UDim2.fromScale(1, 1), BackgroundTransparency = 1, Parent = Glyph }) Corner(Ring, Size) local RingStroke = Create("UIStroke", { Thickness = 1.4, Theme = { Color = "Text" }, Parent = Ring }) Create("UIGradient", { Rotation = -135, Transparency = NumberSequence.new({ NumberSequenceKeypoint.new(0, 1), NumberSequenceKeypoint.new(0.12, 1), NumberSequenceKeypoint.new(0.13, 0), NumberSequenceKeypoint.new(1, 0) }), Parent = RingStroke, }) local Arrow = Create("ImageLabel", { AnchorPoint = Vector2.new(0.5, 0.5), Position = UDim2.new(0, 1, 0.78, 0), Size = UDim2.fromOffset(6, 6), Rotation = 90, Theme = { ImageColor3 = "Text" }, Parent = Glyph }) SetIcon(Arrow, "Arrow") return Glyph end end local ToggleClass = Class("Toggle") function Container:AddToggle(Config) Config = Config or {} local Self = setmetatable({ Type = "Toggle", Text = Config.Text or Config.Title or Config.Name or "Toggle", Value = Config.Default == true or Config.Value == true, Callback = Config.Callback, Container = self, Risky = Config.Risky, ExtraCount = 0, }, ToggleClass) Self.Flag = Config.Flag or NextFlag((self.Path or "") .. "/" .. Self.Text) local Row = self:_Row(16, "TextButton") local Label = Create("TextLabel", { Weight = "SemiBold", Size = UDim2.new(1, -40, 1, 0), Text = Self.Text, TextXAlignment = Enum.TextXAlignment.Left, TextTruncate = Enum.TextTruncate.AtEnd, Theme = { TextColor3 = Self.Value and "Text" or "Inactive Text" }, Parent = Row, }) local Extras = Create("Frame", { Name = "Extras", AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, 0, 0.5, 0), Size = UDim2.new(0, 0, 1, 0), AutomaticSize = Enum.AutomaticSize.X, BackgroundTransparency = 1, Parent = Row, }) ListLayout(Extras, 8, Enum.FillDirection.Horizontal, Enum.HorizontalAlignment.Right, Enum.VerticalAlignment.Center) local Track = Create("Frame", { Name = "Track", Size = UDim2.fromOffset(28, 16), Theme = { BackgroundColor3 = "Element" }, LayoutOrder = 1000, Parent = Extras }) Corner(Track, 8) Shade(Track) Stroke(Track, "Outline") local Fill = Create("Frame", { Size = UDim2.fromScale(1, 1), Theme = { BackgroundColor3 = "ToggleFill" }, BackgroundTransparency = Self.Value and 0 or 1, Parent = Track }) Corner(Fill, 8) Shade(Fill) local Knob = Create("Frame", { AnchorPoint = Vector2.new(0, 0.5), Position = UDim2.new(0, Self.Value and 16 or 2, 0.5, 0), Size = UDim2.fromOffset(10, 10), Theme = { BackgroundColor3 = Self.Value and "Knob" or "KnobOff" }, ZIndex = 2, Parent = Track, }) Corner(Knob, 5) Self.Row, Self.Label, Self.Extras, Self.Track, Self.Fill, Self.Knob = Row, Label, Extras, Track, Fill, Knob Connect(Extras:GetPropertyChangedSignal("AbsoluteSize"), function() Label.Size = UDim2.new(1, -(Extras.AbsoluteSize.X + 8), 1, 0) end) Connect(Row.MouseButton1Click, function() Self:Set(not Self.Value) end) RegisterFlag(Self) if Config.Keybind ~= false then Self:AddKeybind() end self:_Index(Self.Text, "Toggle", Row) if Self.Value then task.defer(Self._Fire, Self, true) end return Self end function ToggleClass:Set(Value, Silent) Value = Value == true local Changed = Value ~= self.Value self.Value = Value if self.Flag then Library.Flags[self.Flag] = Value end Tween(self.Fill, { BackgroundTransparency = Value and 0 or 1 }, 0.2) Tween(self.Knob, { Position = UDim2.new(0, Value and 16 or 2, 0.5, 0) }, 0.25) ThemeTween(self.Knob, "BackgroundColor3", Value and "Knob" or "KnobOff", 0.2) ThemeTween(self.Label, "TextColor3", Value and "Text" or "Inactive Text", 0.2) Library:_RefreshHotkeys() if Changed and not Silent then self:_Fire(Value) end end function ToggleClass:SetText(Text) self.Text = Text Library:SetText(self.Label, Text) end function ToggleClass:_ExtraOrder() self.ExtraCount += 1 return 900 - self.ExtraCount end do local KeybindClass = Class("Keybind") local function CreateKeybox(Parent, LayoutOrder) local Box = Create("TextButton", { Name = "Keybind", Size = UDim2.fromOffset(0, 16), AutomaticSize = Enum.AutomaticSize.X, TextSize = 10, NoCase = true, Text = "", BackgroundTransparency = 0, Theme = { BackgroundColor3 = "Element", TextColor3 = "Inactive Text" }, LayoutOrder = LayoutOrder or 0, Parent = Parent, }) Corner(Box, 4) Shade(Box) Stroke(Box, "Outline") Padding(Box, 0, 0, 5, 5) Create("UISizeConstraint", { MinSize = Vector2.new(18, 16), Parent = Box }) return Box, Box end local function NewKeybind(Config, Container_, Toggle) local Default = KeyFromName(Config.Default or Config.Key) local Self = setmetatable({ Type = "Keybind", Text = Config.Text or Config.Name or (Toggle and Toggle.Text) or "Keybind", Name = Config.Name, Value = { Key = Default, Mode = Config.Mode or "Toggle" }, Default = { Key = Default, Mode = Config.Mode or "Toggle" }, Callback = Config.Callback, Toggle = Toggle, Container = Container_, Displays = {}, Active = false, NoList = Config.NoList, OnPress = Config.OnPress, }, KeybindClass) Self.Flag = Config.Flag or NextFlag(((Container_ and Container_.Path) or "") .. "/" .. Self.Text .. "_Key") table.insert(Library.Keybinds, Self) RegisterFlag(Self) return Self end function KeybindClass:_AddDisplay(Box, Label, OpenEditor) table.insert(self.Displays, { Box = Box, Label = Label }) Connect(Box.MouseButton1Click, function() if Library.Listening ~= self then self:Listen() end end) if OpenEditor then Connect(Box.MouseButton2Click, function() if Library.Listening == self then self:StopListening() end self:OpenEditor(Box) end) end Connect(Box.MouseEnter, function() if Library.Listening ~= self then ThemeTween(Label, "TextColor3", "Text", 0.12) end end) Connect(Box.MouseLeave, function() if Library.Listening ~= self then ThemeTween(Label, "TextColor3", "Inactive Text", 0.12) end end) self:_Draw() end function KeybindClass:_IsOverDisplay() for _, Display in self.Displays do if Display.Box.Visible and IsMouseOver(Display.Box) then return true end end return false end function KeybindClass:Listen() if Library.Listening then Library.Listening:StopListening() end Library.Listening = self for _, Display in self.Displays do Display.Label.Text = "..." ThemeTween(Display.Label, "TextColor3", "Accent", 0.12) end end function KeybindClass:StopListening() if Library.Listening == self then Library.Listening = nil end self:_Draw() end function KeybindClass:_Draw() local Name = KeyName(self.Value.Key) for _, Display in self.Displays do Display.Label.Text = Name == "NONE" and (Display.Editor and "None" or "-") or Name ThemeTween(Display.Label, "TextColor3", IsMouseOver(Display.Box) and "Text" or "Inactive Text", 0.12) end end function KeybindClass:Set(Value, Silent) if type(Value) ~= "table" then Value = { Key = Value, Mode = self.Value.Mode } end self.Value = { Key = KeyFromName(Value.Key), Mode = Value.Mode or self.Value.Mode or "Toggle" } if self.Flag then Library.Flags[self.Flag] = self.Value end self:_Draw() if self.Editor then self:_DrawModes() end Library:_RefreshHotkeys() if not Silent then for _, Callback in self.ChangedCallbacks or {} do SafeCall(Callback, self.Value) end end end function KeybindClass:SetMode(Mode) self.Value.Mode = Mode if self.Flag then Library.Flags[self.Flag] = self.Value end if self.Editor then self:_DrawModes() end Library:_RefreshHotkeys() end function KeybindClass:Serialize() return { Key = self.Value.Key and self.Value.Key.Name or "None", Mode = self.Value.Mode } end function KeybindClass:Deserialize(Value) if type(Value) == "table" then self:Set({ Key = Value.Key, Mode = Value.Mode }) end end function KeybindClass:IsActive() if self.Toggle then return self.Toggle.Value end return self.Active end function KeybindClass:_Pressed(Down) if self.OnPress then if Down then SafeCall(self.OnPress) end return end local Mode = self.Value.Mode if self.Toggle then if Mode == "Hold" then self.Toggle:Set(Down) elseif Down then self.Toggle:Set(not self.Toggle.Value) end else if Mode == "Hold" then self.Active = Down self:_Fire(Down) elseif Down then self.Active = not self.Active self:_Fire(self.Active) end end Library:_RefreshHotkeys() end function KeybindClass:_DrawModes(Instant) local Editor = self.Editor local Time = Instant and 0 or 0.22 Tween(Editor.Pill, { Position = UDim2.fromScale(self.Value.Mode == "Hold" and 0.5 or 0, 0) }, Time) for Mode, Label in Editor.ModeLabels do ThemeTween(Label, "TextColor3", Mode == self.Value.Mode and "Text" or "Inactive Text", Time) end end local EDITOR_WIDTH = 190 function KeybindClass:_BuildEditor() local Frame = PopupPanel(UDim2.fromOffset(EDITOR_WIDTH, 107), "KeybindEditor") Create("TextLabel", { Weight = "SemiBold", Position = UDim2.fromOffset(11, 10), Size = UDim2.new(1, -100, 0, 22), Text = self.Toggle and self.Toggle.Text or self.Text, TextXAlignment = Enum.TextXAlignment.Left, TextTruncate = Enum.TextTruncate.AtEnd, Theme = { TextColor3 = "Text" }, Parent = Frame }) local KeyButton = Create("TextButton", { AnchorPoint = Vector2.new(1, 0), Position = UDim2.new(1, -11, 0, 10), Size = UDim2.fromOffset(76, 22), TextSize = 11, NoCase = true, TextTruncate = Enum.TextTruncate.AtEnd, Theme = { BackgroundColor3 = "Element", TextColor3 = "Inactive Text" }, Parent = Frame, }) Corner(KeyButton, 5) Shade(KeyButton) Stroke(KeyButton, "Outline") local Switch = Create("Frame", { Position = UDim2.fromOffset(11, 40), Size = UDim2.new(1, -22, 0, 25), Theme = { BackgroundColor3 = "Element" }, Parent = Frame }) Corner(Switch, 5) Shade(Switch) Stroke(Switch, "Outline") local Pill = Create("Frame", { Size = UDim2.fromScale(0.5, 1), Theme = { BackgroundColor3 = "ToggleFill" }, Parent = Switch }) Corner(Pill, 5) Shade(Pill) local ModeLabels = {} for Index, Mode in { "Toggle", "Hold" } do local Button = Create("TextButton", { Position = UDim2.fromScale((Index - 1) * 0.5, 0), Size = UDim2.fromScale(0.5, 1), BackgroundTransparency = 1, ZIndex = 2, Parent = Switch }) ModeLabels[Mode] = Create("TextLabel", { Weight = "SemiBold", Size = UDim2.fromScale(1, 1), Text = "On " .. Mode, TextSize = 12, Theme = { TextColor3 = "Inactive Text" }, ZIndex = 2, Parent = Button }) Connect(Button.MouseButton1Click, function() if self.Toggle and self.Value.Mode == "Hold" and Mode ~= "Hold" then self.Toggle:Set(false) end self:SetMode(Mode) end) end local Buttons = Create("Frame", { Position = UDim2.fromOffset(11, 73), Size = UDim2.new(1, -22, 0, 24), BackgroundTransparency = 1, Parent = Frame }) local function EditorButton(Text, Order, Glyph) local Button = Create("TextButton", { Position = UDim2.new((Order - 1) * 0.5, Order == 1 and 0 or 3, 0, 0), Size = UDim2.new(0.5, -3, 1, 0), Theme = { BackgroundColor3 = "Element" }, Parent = Buttons }) Corner(Button, 5) Shade(Button) Stroke(Button, "Outline") local Inner = Create("Frame", { AnchorPoint = Vector2.new(0.5, 0.5), Position = UDim2.fromScale(0.5, 0.5), Size = UDim2.fromOffset(0, 14), AutomaticSize = Enum.AutomaticSize.X, BackgroundTransparency = 1, Parent = Button }) ListLayout(Inner, 5, Enum.FillDirection.Horizontal, Enum.HorizontalAlignment.Center, Enum.VerticalAlignment.Center) if Glyph then ResetGlyph(Inner, 10) end Create("TextLabel", { Weight = "SemiBold", Size = UDim2.fromOffset(0, 14), AutomaticSize = Enum.AutomaticSize.X, Text = Text, TextSize = 12, LayoutOrder = 2, Theme = { TextColor3 = "Text" }, Parent = Inner }) Connect(Button.MouseEnter, function() ThemeTween(Button, "BackgroundColor3", "Hovered Element", 0.12) end) Connect(Button.MouseLeave, function() ThemeTween(Button, "BackgroundColor3", "Element", 0.12) end) return Button end local Clear = EditorButton("Clear", 1) local Reset = EditorButton("Reset", 2, true) Connect(Clear.MouseButton1Click, function() if Library.Listening == self then Library.Listening = nil end if self.Toggle and self.Value.Mode == "Hold" then self.Toggle:Set(false) end self:Set({ Key = nil }) end) Connect(Reset.MouseButton1Click, function() if Library.Listening == self then Library.Listening = nil end local WasHold = self.Value.Mode == "Hold" self:Set({ Key = self.Default.Key, Mode = self.Default.Mode }) if self.Toggle and WasHold and self.Default.Mode ~= "Hold" then self.Toggle:Set(false) end end) self.Editor = { Frame = Frame, Pill = Pill, ModeLabels = ModeLabels, Update = function(Popup) PlacePopup(Frame, Popup.Anchor, self.EditorOffset or 0, 6) end, OnClose = function() if Library.Listening == self then self:StopListening() end FadePopup(Frame, false) end, } self:_AddDisplay(KeyButton, KeyButton) self.Displays[#self.Displays].Editor = true end function KeybindClass:OpenEditor(Anchor, OffsetX) if not self.Editor then self:_BuildEditor() end local Editor = self.Editor if Editor.Open then Library:ClosePopup(Editor) if Editor.Anchor == Anchor then return end end Editor.Anchor = Anchor self.EditorOffset = OffsetX or 0 self:_Draw() self:_DrawModes(true) Editor.ParentPopup = self.Container and self.Container.ParentPopup Library:OpenPopup(Editor) FadePopup(Editor.Frame, true) if not self.Value.Key then self:Listen() end end KeybindClass.OpenModes = KeybindClass.OpenEditor function ToggleClass:AddKeybind(Config) Config = Config or {} local Keybind = self.Keybind if not Keybind then Keybind = NewKeybind(Config, self.Container, self) self.Keybind = Keybind if Config.Flag == nil then Library.Elements[Keybind.Flag], Library.Flags[Keybind.Flag] = nil, nil Keybind.Flag = self.Flag .. "_Key" RegisterFlag(Keybind) end Connect(self.Row.MouseButton2Click, function() local OffsetX = math.floor(MousePosition().X - self.Row.AbsolutePosition.X - 12) Keybind:OpenEditor(self.Row, Clamp(OffsetX, 0, math.max(0, self.Row.AbsoluteSize.X - EDITOR_WIDTH))) end) return self end local Default = KeyFromName(Config.Default or Config.Key) Keybind.Default = { Key = Default, Mode = Config.Mode or "Toggle" } Keybind.Name = Config.Name or Keybind.Name Keybind.Callback = Config.Callback or Keybind.Callback if Config.NoList ~= nil then Keybind.NoList = Config.NoList end if Config.Flag and Config.Flag ~= Keybind.Flag then Library.Elements[Keybind.Flag], Library.Flags[Keybind.Flag] = nil, nil Keybind.Flag = Config.Flag RegisterFlag(Keybind) end Keybind:Set({ Key = Default, Mode = Keybind.Default.Mode }, true) return self end ToggleClass.AddKeyPicker = ToggleClass.AddKeybind ToggleClass.AddBind = ToggleClass.AddKeybind function ToggleClass:GetKeybind() return self.Keybind end function Container:AddKeybind(Config) Config = Config or {} local Row = self:_Row(16) local Label = Create("TextLabel", { Weight = "SemiBold", Size = UDim2.new(1, -60, 1, 0), Text = Config.Text or Config.Title or "Keybind", TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Text" }, Parent = Row, }) local Holder = Create("Frame", { AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, 0, 0.5, 0), Size = UDim2.new(0, 0, 1, 0), AutomaticSize = Enum.AutomaticSize.X, BackgroundTransparency = 1, Parent = Row }) ListLayout(Holder, 0, Enum.FillDirection.Horizontal, Enum.HorizontalAlignment.Right, Enum.VerticalAlignment.Center) local Box, Text = CreateKeybox(Holder, 1) local Keybind = NewKeybind(Config, self, nil) Keybind.Box, Keybind.Label = Box, Text Keybind:_AddDisplay(Box, Text, true) Keybind.Row, Keybind.TextLabel = Row, Label self:_Index(Keybind.Text, "Keybind", Row) return Keybind end Container.AddKeyPicker = Container.AddKeybind Container.AddBind = Container.AddKeybind Connect(UserInputService.InputBegan, function(Input, Processed) local Listening = Library.Listening if Listening then local Type = Input.UserInputType if Type == Enum.UserInputType.Keyboard then if Input.KeyCode == Enum.KeyCode.Escape then Listening:StopListening() elseif Input.KeyCode == Enum.KeyCode.Backspace or Input.KeyCode == Enum.KeyCode.Delete then Library.Listening = nil Listening:Set({ Key = nil }) else Library.Listening = nil Listening:Set({ Key = Input.KeyCode }) end elseif Type == Enum.UserInputType.MouseButton1 or Type == Enum.UserInputType.Touch then if not Listening:_IsOverDisplay() then Listening:StopListening() end elseif Type == Enum.UserInputType.MouseButton2 or Type == Enum.UserInputType.MouseButton3 then if not Listening:_IsOverDisplay() then Library.Listening = nil Listening:Set({ Key = Type }) end end return end if UserInputService:GetFocusedTextBox() then return end for _, Keybind in Library.Keybinds do if Keybind.Value.Key and InputMatches(Input, Keybind.Value.Key) then Keybind:_Pressed(true) end end end) Connect(UserInputService.InputEnded, function(Input) for _, Keybind in Library.Keybinds do if Keybind.Value.Key and Keybind.Value.Mode == "Hold" and InputMatches(Input, Keybind.Value.Key) then Keybind:_Pressed(false) end end end) end do local PickerClass = Class("ColorPicker") local AnimationModes = { "None", "Rainbow", "Fade", "Fade Alpha" } local function NewPicker(Config, Swatch, Container_, Owner) local Default = Config.Default or Config.Color or Color3.new(1, 1, 1) local H, S, V = Default:ToHSV() local Self = setmetatable({ Type = "ColorPicker", Text = Config.Text or Config.Title or "Color", Value = { Color = Default, Alpha = Config.Alpha or Config.Transparency or 0, Animation = Config.Animation or "None" }, Hue = H, Sat = S, Val = V, Callback = Config.Callback, Container = Container_, Swatch = Swatch, Owner = Owner, Current = Default, CurrentAlpha = Config.Alpha or 0, }, PickerClass) Self.Flag = Config.Flag or NextFlag(((Container_ and Container_.Path) or "") .. "/" .. Self.Text .. "_Color") Self:_Draw() Connect(Swatch.MouseButton1Click, function() Self:Open() end) RegisterFlag(Self) if Self.Value.Animation ~= "None" then Library.AnimatedPickers[Self] = true end return Self end local function CreateSwatch(Parent, LayoutOrder) local Swatch = Create("TextButton", { Name = "Swatch", Size = UDim2.fromOffset(13, 13), BackgroundColor3 = Color3.new(1, 1, 1), LayoutOrder = LayoutOrder or 0, Parent = Parent }) Corner(Swatch, 4) local SwatchStroke = Stroke(Swatch, "Outline") SwatchStroke.Transparency = 0.4 return Swatch end function PickerClass:_Draw() local Color = Color3.fromHSV(self.Hue, self.Sat, self.Val) self.Value.Color = Color if not Library.AnimatedPickers[self] then self.Current = Color self.CurrentAlpha = self.Value.Alpha self.Swatch.BackgroundColor3 = Color self.Swatch.BackgroundTransparency = math.min(self.Value.Alpha, 0.85) end if not Library.AnimatedPickers[self] then self:_DrawKnobs(self.Hue, self.Sat, self.Val, self.Value.Alpha) end end function PickerClass:_DrawKnobs(H, S, V, Alpha, Instant) if not self.Popup then return end local P = self.Parts local Color = Color3.fromHSV(H, S, V) P.SV.BackgroundColor3 = Color3.fromHSV(H, 1, 1) P.SVKnob.BackgroundColor3 = Color P.HueKnob.BackgroundColor3 = Color3.fromHSV(H, 1, 1) P.AlphaColor.BackgroundColor3 = Color P.AlphaKnob.BackgroundColor3 = Color local Positions = { [P.SVKnob] = UDim2.fromScale(S, 1 - V), [P.HueKnob] = UDim2.new(0.5, 0, H, 0), [P.AlphaKnob] = UDim2.new(Alpha, 0, 0.5, 0), } for Knob, Position in Positions do if Instant then Knob.Position = Position else Tween(Knob, { Position = Position }, 0.08) end end end function PickerClass:Set(Value, Silent, Alpha) if typeof(Value) == "Color3" then Value = { Color = Value, Alpha = Alpha or self.Value.Alpha, Animation = self.Value.Animation } end if type(Value) ~= "table" then return end local Color = Value.Color if type(Color) == "string" then Color = Color3.fromHex(Color) end if typeof(Color) == "Color3" then self.Hue, self.Sat, self.Val = Color:ToHSV() end if Value.Alpha ~= nil then self.Value.Alpha = Clamp(tonumber(Value.Alpha) or 0, 0, 1) end if Value.Animation ~= nil then self:SetAnimation(Value.Animation, true) end self:_Draw() if self.Flag then Library.Flags[self.Flag] = self.Value end if not Silent then self:_Fire(self.Value.Color, self.Value.Alpha) end end function PickerClass:SetAnimation(Mode, Silent) if not table.find(AnimationModes, Mode) then Mode = "None" end self.Value.Animation = Mode Library.AnimatedPickers[self] = Mode ~= "None" or nil if Mode == "None" then self:_Draw() end if self.AnimationDropdown and not Silent then self.AnimationDropdown:Set(Mode, true) end end function PickerClass:GetColor() return self.Current, self.CurrentAlpha end function PickerClass:Serialize() return { Color = self.Value.Color:ToHex(), Alpha = self.Value.Alpha, Animation = self.Value.Animation } end function PickerClass:Deserialize(Value) if type(Value) == "table" then self:Set({ Color = Value.Color and Color3.fromHex(Value.Color), Alpha = Value.Alpha, Animation = Value.Animation }) end end function PickerClass:_Build() local Frame = PopupPanel(UDim2.fromOffset(215, 269), "ColorPicker") local Parts = {} local SV = Create("TextButton", { Position = UDim2.fromOffset(11, 11), Size = UDim2.fromOffset(171, 167), BackgroundColor3 = Color3.new(1, 0, 0), Parent = Frame }) Corner(SV, 4) local White = Create("Frame", { Size = UDim2.fromScale(1, 1), BackgroundColor3 = Color3.new(1, 1, 1), Parent = SV }) Corner(White, 4) Create("UIGradient", { Transparency = NumberSequence.new(0, 1), Parent = White }) local Black = Create("Frame", { Size = UDim2.fromScale(1, 1), BackgroundColor3 = Color3.new(0, 0, 0), Parent = SV }) Corner(Black, 4) Create("UIGradient", { Rotation = 90, Transparency = NumberSequence.new(1, 0), Parent = Black }) local SVKnob = Create("Frame", { AnchorPoint = Vector2.new(0.5, 0.5), Size = UDim2.fromOffset(12, 12), ZIndex = 3, Parent = SV }) Corner(SVKnob, 6) Create("UIStroke", { Color = Color3.new(1, 1, 1), Thickness = 2, Parent = SVKnob }) local Hue = Create("TextButton", { Position = UDim2.fromOffset(191, 11), Size = UDim2.fromOffset(13, 167), BackgroundColor3 = Color3.new(1, 1, 1), Parent = Frame }) Corner(Hue, 6) local Keypoints = {} for Index = 0, 6 do table.insert(Keypoints, ColorSequenceKeypoint.new(Index / 6, Color3.fromHSV((Index / 6) % 1, 1, 1))) end Keypoints[7] = ColorSequenceKeypoint.new(1, Color3.fromHSV(0, 1, 1)) Create("UIGradient", { Rotation = 90, Color = ColorSequence.new(Keypoints), Parent = Hue }) local HueKnob = Create("Frame", { AnchorPoint = Vector2.new(0.5, 0.5), Size = UDim2.fromOffset(12, 12), ZIndex = 3, Parent = Hue }) Corner(HueKnob, 6) Create("UIStroke", { Color = Color3.new(1, 1, 1), Thickness = 2, Parent = HueKnob }) local Alpha = Create("TextButton", { Position = UDim2.fromOffset(11, 188), Size = UDim2.fromOffset(193, 12), BackgroundTransparency = 1, Parent = Frame }) local Checker = Create("ImageLabel", { Size = UDim2.fromScale(1, 1), Image = Icons.Checker, ScaleType = Enum.ScaleType.Tile, TileSize = UDim2.fromOffset(12, 12), Parent = Alpha }) Corner(Checker, 6) local AlphaColor = Create("Frame", { Size = UDim2.fromScale(1, 1), BackgroundColor3 = Color3.new(1, 1, 1), Parent = Alpha }) Corner(AlphaColor, 6) Create("UIGradient", { Transparency = NumberSequence.new(0, 1), Parent = AlphaColor }) local AlphaKnob = Create("Frame", { AnchorPoint = Vector2.new(0.5, 0.5), Size = UDim2.fromOffset(12, 12), ZIndex = 3, Parent = Alpha }) Corner(AlphaKnob, 6) Create("UIStroke", { Color = Color3.new(1, 1, 1), Thickness = 2, Parent = AlphaKnob }) local DropHolder = Create("Frame", { Position = UDim2.fromOffset(11, 213), Size = UDim2.fromOffset(193, 47), BackgroundTransparency = 1, Parent = Frame }) ListLayout(DropHolder, 0) local Mini = NewContainer(DropHolder, { Path = "" }) Mini.NoIndex = true self.Popup = { Frame = Frame, Owner = self.Swatch, Update = function() PlacePopup(Frame, self.Swatch, -8, 9) end, OnClose = function() FadePopup(Frame, false) end, } Mini.ParentPopup = self.Popup self.AnimationDropdown = Mini:AddDropdown({ Text = "Animations", Options = AnimationModes, Default = self.Value.Animation, Flag = self.Flag .. "_Animation", Callback = function(Mode) self:SetAnimation(Mode, true) if self.Flag then Library.Flags[self.Flag] = self.Value end end, }) Library.Elements[self.Flag .. "_Animation"] = nil Parts.SV, Parts.SVKnob, Parts.HueKnob, Parts.AlphaColor, Parts.AlphaKnob = SV, SVKnob, HueKnob, AlphaColor, AlphaKnob self.Parts = Parts local Dragging local function Update() local Point = MousePosition() if Dragging == SV then self.Sat = Clamp((Point.X - SV.AbsolutePosition.X) / SV.AbsoluteSize.X, 0, 1) self.Val = 1 - Clamp((Point.Y - SV.AbsolutePosition.Y) / SV.AbsoluteSize.Y, 0, 1) elseif Dragging == Hue then self.Hue = Clamp((Point.Y - Hue.AbsolutePosition.Y) / Hue.AbsoluteSize.Y, 0, 0.999) elseif Dragging == Alpha then self.Value.Alpha = Round(Clamp((Point.X - Alpha.AbsolutePosition.X) / Alpha.AbsoluteSize.X, 0, 1), 0.01) end self:_Draw() if self.Flag then Library.Flags[self.Flag] = self.Value end self:_Fire(self.Value.Color, self.Value.Alpha) end for _, Area in { SV, Hue, Alpha } do Connect(Area.InputBegan, function(Input) if Input.UserInputType == Enum.UserInputType.MouseButton1 or Input.UserInputType == Enum.UserInputType.Touch then Dragging = Area Update() end end) end Connect(UserInputService.InputChanged, function(Input) if Dragging and (Input.UserInputType == Enum.UserInputType.MouseMovement or Input.UserInputType == Enum.UserInputType.Touch) then Update() end end) Connect(UserInputService.InputEnded, function(Input) if Input.UserInputType == Enum.UserInputType.MouseButton1 or Input.UserInputType == Enum.UserInputType.Touch then Dragging = nil end end) end function PickerClass:Open() if not self.Popup then self:_Build() end if self.Popup.Open then Library:ClosePopup(self.Popup) return end self.Popup.ParentPopup = self.Container and self.Container.ParentPopup self:_Draw() Library:OpenPopup(self.Popup) FadePopup(self.Popup.Frame, true) end function ToggleClass:AddColorPicker(Config) Config = Config or {} local Swatch = CreateSwatch(self.Extras, self:_ExtraOrder()) local Picker = NewPicker(Config, Swatch, self.Container, self) self.ColorPickers = self.ColorPickers or {} table.insert(self.ColorPickers, Picker) return self end ToggleClass.AddColorpicker = ToggleClass.AddColorPicker function Container:AddColorPicker(Config) Config = Config or {} local Row = self:_Row(16) local Label = Create("TextLabel", { Weight = "SemiBold", Size = UDim2.new(1, -24, 1, 0), Text = Config.Text or Config.Title or "Color", TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Text" }, Parent = Row, }) local Holder = Create("Frame", { AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, 0, 0.5, 0), Size = UDim2.new(0, 0, 1, 0), AutomaticSize = Enum.AutomaticSize.X, BackgroundTransparency = 1, Parent = Row }) ListLayout(Holder, 8, Enum.FillDirection.Horizontal, Enum.HorizontalAlignment.Right, Enum.VerticalAlignment.Center) local Swatch = CreateSwatch(Holder, 100) local Picker = NewPicker(Config, Swatch, self, nil) Picker.Row, Picker.Label = Row, Label self:_Index(Picker.Text, "Colorpicker", Row) return Picker end Container.AddColorpicker = Container.AddColorPicker Connect(RunService.Heartbeat, function() local Now = os.clock() for Picker in Library.AnimatedPickers do local Mode = Picker.Value.Animation local Wave = 0.5 + 0.5 * math.sin(Now * 3) local H, S, V, Alpha = Picker.Hue, Picker.Sat, Picker.Val, Picker.Value.Alpha if Mode == "Rainbow" then H, S, V = (Now * 0.12) % 1, math.max(S, 0.6), math.max(V, 0.6) elseif Mode == "Fade" then V = V * (0.25 + 0.75 * Wave) elseif Mode == "Fade Alpha" then Alpha = Alpha + (1 - Alpha) * Wave end local Color = Color3.fromHSV(H, S, V) Picker.Current, Picker.CurrentAlpha = Color, Alpha if Picker.Popup and Picker.Popup.Open then Picker:_DrawKnobs(H, S, V, Alpha, true) end Picker.Swatch.BackgroundColor3 = Color Picker.Swatch.BackgroundTransparency = math.min(Alpha, 0.85) if Picker.Callback then SafeCall(Picker.Callback, Color, Alpha) end end end) end do function ToggleClass:AddSettings(Config) if self.SettingsContainer then return self.SettingsContainer end Config = Config or {} local Gear = Create("ImageButton", { Name = "Settings", Size = UDim2.fromOffset(13, 13), Theme = { ImageColor3 = "Inactive Text" }, LayoutOrder = self:_ExtraOrder() - 100, Parent = self.Extras, }) SetIcon(Gear, "Gear") local Frame = PopupPanel(UDim2.fromOffset(Config.Width or 206, 0), "ToggleSettings") Frame.AutomaticSize = Enum.AutomaticSize.Y local Items = Create("Frame", { Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y, BackgroundTransparency = 1, Parent = Frame }) Padding(Items, 11, 11, 11, 11) ListLayout(Items, 6) local Settings = NewContainer(Items, { Section = self.Container.Section, Tab = self.Container.Tab, Window = self.Container.Window, Path = (self.Container.Path or "") .. " / " .. self.Text }) if Config.Title ~= false then Settings.Counter += 1 local Title = Create("Frame", { Size = UDim2.new(1, 0, 0, 16), BackgroundTransparency = 1, LayoutOrder = Settings.Counter, Parent = Items }) local TitleIcon = Create("ImageLabel", { AnchorPoint = Vector2.new(0, 0.5), Position = UDim2.new(0, 0, 0.5, 0), Size = UDim2.fromOffset(12, 12), Theme = { ImageColor3 = "Inactive Text" }, Parent = Title }) SetIcon(TitleIcon, "Gear") Create("TextLabel", { Weight = "SemiBold", Position = UDim2.fromOffset(19, 0), Size = UDim2.new(1, -19, 1, 0), Text = Config.Title or (self.Text .. " Settings"), TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Inactive Text" }, Parent = Title }) end local Popup = { Frame = Frame, Owner = Gear, Update = function() PlacePopup(Frame, Gear, -8, 9) end, OnClose = function() FadePopup(Frame, false) ThemeTween(Gear, "ImageColor3", "Inactive Text", 0.15) end, } Settings.ParentPopup = Popup Connect(Gear.MouseEnter, function() ThemeTween(Gear, "ImageColor3", "Text", 0.15) end) Connect(Gear.MouseLeave, function() if not Popup.Open then ThemeTween(Gear, "ImageColor3", "Inactive Text", 0.15) end end) Connect(Gear.MouseButton1Click, function() if Popup.Open then Library:ClosePopup(Popup) return end Popup.ParentPopup = self.Container.ParentPopup Library:OpenPopup(Popup) FadePopup(Frame, true) ThemeTween(Gear, "ImageColor3", "Accent", 0.15) end) self.SettingsContainer = Settings return Settings end ToggleClass.Settings = ToggleClass.AddSettings ToggleClass.AddSetting = ToggleClass.AddSettings end do function Container:AddSeparator() local Row = self:_Row(15) local Line = Create("Frame", { AnchorPoint = Vector2.new(0, 0.5), Position = UDim2.fromScale(0, 0.5), Size = UDim2.new(1, 0, 0, 8), BackgroundTransparency = 1, Parent = Row }) Corner(Line, 4) Stroke(Line, "Outline") return { Row = Row, SetVisible = function(_, Visible) Row.Visible = Visible end } end Container.AddDivider = Container.AddSeparator end do local SliderClass = Class("Slider") function Container:AddSlider(Config) Config = Config or {} local Min, Max = Config.Min or 0, Config.Max or 100 local Increment = Config.Increment or Config.Rounding or (Config.Decimals and 10 ^ -Config.Decimals) or Config.Decimal or 1 local Self = setmetatable({ Type = "Slider", Text = Config.Text or Config.Title or "Slider", Min = Min, Max = Max, Increment = Increment, Suffix = Config.Suffix or "", Prefix = Config.Prefix or "", Value = Clamp(Config.Default or Config.Value or Min, Min, Max), Callback = Config.Callback, Format = Config.Format, Container = self, }, SliderClass) Self.Flag = Config.Flag or NextFlag((self.Path or "") .. "/" .. Self.Text) local Row = self:_Row(32) local Label = Create("TextLabel", { Weight = "SemiBold", Size = UDim2.new(1, -60, 0, 14), Text = Self.Text, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Text" }, Parent = Row }) local ValueBox = Create("TextBox", { AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, 0, 0, 7), Size = UDim2.fromOffset(0, 17), AutomaticSize = Enum.AutomaticSize.X, TextSize = 10, ClearTextOnFocus = false, Theme = { BackgroundColor3 = "Element", TextColor3 = "Inactive Text" }, BackgroundTransparency = 0, Parent = Row, }) Corner(ValueBox, 4) Shade(ValueBox) Stroke(ValueBox, "Outline") Padding(ValueBox, 0, 0, 5, 5) Create("UISizeConstraint", { MinSize = Vector2.new(22, 17), Parent = ValueBox }) local Track = Create("TextButton", { Position = UDim2.fromOffset(0, 21), Size = UDim2.new(1, 0, 0, 10), Theme = { BackgroundColor3 = "Element" }, Parent = Row }) Corner(Track, 5) Shade(Track) Stroke(Track, "Outline") local Fill = Create("Frame", { Size = UDim2.new(0, 10, 1, 0), Theme = { BackgroundColor3 = "ToggleFill" }, Parent = Track }) Corner(Fill, 5) Shade(Fill) local Knob = Create("Frame", { AnchorPoint = Vector2.new(0.5, 0.5), Size = UDim2.fromOffset(10, 10), Theme = { BackgroundColor3 = "Knob" }, ZIndex = 2, Parent = Track }) Corner(Knob, 5) Self.Row, Self.Label, Self.ValueBox, Self.Track, Self.Fill, Self.Knob = Row, Label, ValueBox, Track, Fill, Knob Self:_Draw(true) local Dragging = false local function UpdateFromMouse() local Percent = Clamp((MousePosition().X - Track.AbsolutePosition.X - 5) / math.max(1, Track.AbsoluteSize.X - 10), 0, 1) Self:Set(Min + (Max - Min) * Percent) end Connect(Track.InputBegan, function(Input) if Input.UserInputType == Enum.UserInputType.MouseButton1 or Input.UserInputType == Enum.UserInputType.Touch then Dragging = true UpdateFromMouse() end end) Connect(UserInputService.InputChanged, function(Input) if Dragging and (Input.UserInputType == Enum.UserInputType.MouseMovement or Input.UserInputType == Enum.UserInputType.Touch) then UpdateFromMouse() end end) Connect(UserInputService.InputEnded, function(Input) if Input.UserInputType == Enum.UserInputType.MouseButton1 or Input.UserInputType == Enum.UserInputType.Touch then Dragging = false end end) Connect(ValueBox.FocusLost, function() local Number = tonumber((ValueBox.Text:gsub("[^%d%.%-]", ""))) if Number then Self:Set(Number) else Self:_Draw() end end) RegisterFlag(Self) self:_Index(Self.Text, "Slider", Row) task.defer(Self._Fire, Self, Self.Value) return Self end function SliderClass:_Text() if self.Format then return self.Format(self.Value) end local Value = self.Value local Text if self.Increment >= 1 then Text = tostring(math.floor(Value + 0.5)) else local Decimals = math.max(0, math.ceil(-math.log10(self.Increment) - 1e-9)) Text = string.format("%." .. Decimals .. "f", Value) end return self.Prefix .. Text .. self.Suffix end function SliderClass:_Draw(Instant) local Percent = (self.Value - self.Min) / math.max(1e-9, self.Max - self.Min) local Time = Instant and 0 or 0.12 Tween(self.Fill, { Size = UDim2.new(Percent, 10 - 10 * Percent, 1, 0) }, Time) Tween(self.Knob, { Position = UDim2.new(Percent, 5 - 10 * Percent, 0.5, 0) }, Time) self.ValueBox.Text = self:_Text() end function SliderClass:Set(Value, Silent) Value = tonumber(Value) or self.Value Value = Clamp(Round(Value, self.Increment), self.Min, self.Max) Value = tonumber(string.format("%.6f", Value)) local Changed = Value ~= self.Value self.Value = Value if self.Flag then Library.Flags[self.Flag] = Value end self:_Draw() if Changed and not Silent then self:_Fire(Value) end end function SliderClass:SetMax(Max) self.Max = Max; self:Set(self.Value) end function SliderClass:SetMin(Min) self.Min = Min; self:Set(self.Value) end end do local RangeClass = Class("RangeSlider") function Container:AddRangeSlider(Config) Config = Config or {} local Min, Max = Config.Min or 0, Config.Max or 100 local Default = Config.Default or { Min, Max } local Self = setmetatable({ Type = "RangeSlider", Text = Config.Text or Config.Title or "Range", Min = Min, Max = Max, Increment = Config.Increment or Config.Rounding or 1, Suffix = Config.Suffix or "", Value = { Clamp(Default[1] or Default.Min or Min, Min, Max), Clamp(Default[2] or Default.Max or Max, Min, Max) }, Callback = Config.Callback, Container = self, }, RangeClass) Self.Flag = Config.Flag or NextFlag((self.Path or "") .. "/" .. Self.Text) local Row = self:_Row(32) Create("TextLabel", { Weight = "SemiBold", Size = UDim2.new(1, -90, 0, 14), Text = Self.Text, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Text" }, Parent = Row }) local ValueBox = Create("TextLabel", { AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, 0, 0, 7), Size = UDim2.fromOffset(0, 17), AutomaticSize = Enum.AutomaticSize.X, TextSize = 10, NoCase = true, BackgroundTransparency = 0, Theme = { BackgroundColor3 = "Element", TextColor3 = "Inactive Text" }, Parent = Row, }) Corner(ValueBox, 4) Shade(ValueBox) Stroke(ValueBox, "Outline") Padding(ValueBox, 0, 0, 5, 5) local Track = Create("TextButton", { Position = UDim2.fromOffset(0, 21), Size = UDim2.new(1, 0, 0, 10), Theme = { BackgroundColor3 = "Element" }, Parent = Row }) Corner(Track, 5) Shade(Track) Stroke(Track, "Outline") local Fill = Create("Frame", { Theme = { BackgroundColor3 = "ToggleFill" }, Parent = Track }) Corner(Fill, 5) Shade(Fill) local Knobs = {} for Index = 1, 2 do Knobs[Index] = Create("Frame", { AnchorPoint = Vector2.new(0.5, 0.5), Size = UDim2.fromOffset(10, 10), Theme = { BackgroundColor3 = "Knob" }, ZIndex = 2, Parent = Track }) Corner(Knobs[Index], 5) end Self.Row, Self.ValueBox, Self.Track, Self.Fill, Self.Knobs = Row, ValueBox, Track, Fill, Knobs Self:_Draw(true) local Dragging local function Percent() return Clamp((MousePosition().X - Track.AbsolutePosition.X - 5) / math.max(1, Track.AbsoluteSize.X - 10), 0, 1) end local function Update() local Value = Min + (Max - Min) * Percent() local New = table.clone(Self.Value) New[Dragging] = Value if New[1] > New[2] then New[1], New[2] = New[2], New[1] Dragging = 3 - Dragging end Self:Set(New) end Connect(Track.InputBegan, function(Input) if Input.UserInputType ~= Enum.UserInputType.MouseButton1 and Input.UserInputType ~= Enum.UserInputType.Touch then return end local Value = Min + (Max - Min) * Percent() Dragging = math.abs(Value - Self.Value[1]) <= math.abs(Value - Self.Value[2]) and 1 or 2 Update() end) Connect(UserInputService.InputChanged, function(Input) if Dragging and (Input.UserInputType == Enum.UserInputType.MouseMovement or Input.UserInputType == Enum.UserInputType.Touch) then Update() end end) Connect(UserInputService.InputEnded, function(Input) if Input.UserInputType == Enum.UserInputType.MouseButton1 or Input.UserInputType == Enum.UserInputType.Touch then Dragging = nil end end) RegisterFlag(Self) self:_Index(Self.Text, "Range slider", Row) task.defer(Self._Fire, Self, Self.Value) return Self end function RangeClass:_Format(Value) if self.Increment >= 1 then return tostring(math.floor(Value + 0.5)) end local Decimals = math.max(0, math.ceil(-math.log10(self.Increment) - 1e-9)) return string.format("%." .. Decimals .. "f", Value) end function RangeClass:_Draw(Instant) local Span = math.max(1e-9, self.Max - self.Min) local A, B = (self.Value[1] - self.Min) / Span, (self.Value[2] - self.Min) / Span local Time = Instant and 0 or 0.12 Tween(self.Knobs[1], { Position = UDim2.new(A, 5 - 10 * A, 0.5, 0) }, Time) Tween(self.Knobs[2], { Position = UDim2.new(B, 5 - 10 * B, 0.5, 0) }, Time) Tween(self.Fill, { Position = UDim2.new(A, -10 * A, 0, 0), Size = UDim2.new(B - A, 10 + 10 * A - 10 * B, 1, 0) }, Time) self.ValueBox.Text = self:_Format(self.Value[1]) .. self.Suffix .. " - " .. self:_Format(self.Value[2]) .. self.Suffix end function RangeClass:Set(Value, Silent) if type(Value) ~= "table" then return end local A = Clamp(Round(tonumber(Value[1] or Value.Min) or self.Value[1], self.Increment), self.Min, self.Max) local B = Clamp(Round(tonumber(Value[2] or Value.Max) or self.Value[2], self.Increment), self.Min, self.Max) if A > B then A, B = B, A end A, B = tonumber(string.format("%.6f", A)), tonumber(string.format("%.6f", B)) local Changed = A ~= self.Value[1] or B ~= self.Value[2] self.Value = { A, B } if self.Flag then Library.Flags[self.Flag] = self.Value end self:_Draw() if Changed and not Silent then self:_Fire(self.Value) end end end local OptionRow; do local DropdownClass = Class("Dropdown") function OptionRow(Parent, Text, Order) local Option = Create("TextButton", { Name = "Option", Size = UDim2.new(1, 0, 0, 24), BackgroundTransparency = 1, Theme = { BackgroundColor3 = "Tab" }, LayoutOrder = Order or 0, Parent = Parent, }) local Bar = Create("Frame", { AnchorPoint = Vector2.new(0, 0.5), Position = UDim2.new(0, 7, 0.5, 0), Size = UDim2.fromOffset(3, 12), Theme = { BackgroundColor3 = "Accent" }, BackgroundTransparency = 1, Parent = Option }) Corner(Bar, 1) local Label = Create("TextLabel", { Weight = "SemiBold", Position = UDim2.fromOffset(8, 0), Size = UDim2.new(1, -16, 1, 0), Text = Text, TextXAlignment = Enum.TextXAlignment.Left, TextTruncate = Enum.TextTruncate.AtEnd, Theme = { TextColor3 = "Inactive Text" }, Parent = Option, }) local Self = { Button = Option, Bar = Bar, Label = Label, Value = Text, Selected = false } function Self.SetSelected(_, Selected, Instant) Self.Selected = Selected local Time = Instant and 0 or 0.18 Tween(Option, { BackgroundTransparency = Selected and 0 or 1 }, Time) Tween(Bar, { BackgroundTransparency = Selected and 0 or 1 }, Time) Tween(Label, { Position = UDim2.fromOffset(Selected and 18 or 8, 0) }, Time) ThemeTween(Label, "TextColor3", Selected and "Text" or "Inactive Text", Time) end Connect(Option.MouseEnter, function() if not Self.Selected then Tween(Option, { BackgroundTransparency = 0.6 }, 0.15) end end) Connect(Option.MouseLeave, function() if not Self.Selected then Tween(Option, { BackgroundTransparency = 1 }, 0.15) end end) return Self end local function NormalizeOptions(Options) local Values, Names = {}, {} for _, Option in Options or {} do local Value, Name = Option, tostring(Option) if type(Option) == "table" then Value = Option.Value ~= nil and Option.Value or Option.Name Name = tostring(Option.Name or Option.Value) end table.insert(Values, Value) Names[Value] = Name end return Values, Names end function Container:AddDropdown(Config) Config = Config or {} local Multi = Config.Multi == true local Values, Names = NormalizeOptions(Config.Options or Config.Values) local Default = Config.Default if Multi then Default = type(Default) == "table" and table.clone(Default) or (Default ~= nil and { Default } or {}) elseif Default == nil and not Config.AllowNone then Default = Values[1] end local Self = setmetatable({ Type = "Dropdown", Text = Config.Text or Config.Title or Config.Name, Options = Values, Names = Names, Multi = Multi, Value = Default, Callback = Config.Callback, Searchable = Config.Search or Config.Searchable, MaxVisible = Config.MaxVisible or 8, Container = self, OptionRows = {}, }, DropdownClass) Self.Flag = Config.Flag or NextFlag((self.Path or "") .. "/" .. (Self.Text or "Dropdown")) local HasLabel = Self.Text ~= nil and Self.Text ~= "" local Row = self:_Row(HasLabel and 47 or 25) if HasLabel then Self.Label = Create("TextLabel", { Weight = "SemiBold", Size = UDim2.new(1, 0, 0, 14), Text = Self.Text, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Text" }, Parent = Row }) end local Box = Create("TextButton", { Position = UDim2.fromOffset(0, HasLabel and 21 or 0), Size = UDim2.new(1, 0, 0, 25), Theme = { BackgroundColor3 = "Element" }, Parent = Row, }) Corner(Box, 5) Shade(Box) Stroke(Box, "Outline") local ValueLabel = Create("TextLabel", { Weight = "SemiBold", Position = UDim2.fromOffset(8, 0), Size = UDim2.new(1, -30, 1, 0), TextXAlignment = Enum.TextXAlignment.Left, TextTruncate = Enum.TextTruncate.AtEnd, Theme = { TextColor3 = "Inactive Text" }, Parent = Box, }) LayoutGlyph(Box) Self.Row, Self.Box, Self.ValueLabel = Row, Box, ValueLabel Self:_DrawValue() Connect(Box.MouseEnter, function() ThemeTween(ValueLabel, "TextColor3", "Text", 0.12) end) Connect(Box.MouseLeave, function() ThemeTween(ValueLabel, "TextColor3", "Inactive Text", 0.12) end) Connect(Box.MouseButton1Click, function() Self:Toggle() end) RegisterFlag(Self) if Self.Text then self:_Index(Self.Text, "Dropdown", Row) end task.defer(function() if Self.Value ~= nil then Self:_Fire(Self.Value) end end) return Self end function Container:AddMultiDropdown(Config) Config = Config or {} Config.Multi = true return self:AddDropdown(Config) end function DropdownClass:_Name(Value) return self.Names[Value] or tostring(Value) end function DropdownClass:_DrawValue() local Text if self.Multi then local Shown = {} for _, Value in self.Value do table.insert(Shown, self:_Name(Value)) end Text = #Shown > 0 and table.concat(Shown, ", ") or "None" else Text = self.Value ~= nil and self:_Name(self.Value) or "None" end Library:SetText(self.ValueLabel, Text) end function DropdownClass:IsSelected(Option) if self.Multi then return table.find(self.Value, Option) ~= nil end return self.Value == Option end function DropdownClass:_BuildList() if self.Popup then self.Popup.Frame:Destroy() end local Frame = PopupPanel(UDim2.fromOffset(100, 100), "DropdownList", 5) local Search local Top = 1 if self.Searchable then Search = Create("TextBox", { Weight = "SemiBold", Position = UDim2.fromOffset(6, 6), Size = UDim2.new(1, -12, 0, 22), PlaceholderText = "Search...", Text = "", ClearTextOnFocus = false, TextXAlignment = Enum.TextXAlignment.Left, Theme = { BackgroundColor3 = "Element", TextColor3 = "Text", PlaceholderColor3 = "Inactive Text" }, BackgroundTransparency = 0, Parent = Frame, }) Corner(Search, 4) Stroke(Search, "Outline") Padding(Search, 0, 0, 7, 7) Top = 32 end local List = Create("ScrollingFrame", { Position = UDim2.fromOffset(1, Top), Size = UDim2.new(1, -2, 1, -(Top + 1)), ScrollBarThickness = 2, ScrollBarImageTransparency = 0, Theme = { ScrollBarImageColor3 = "Accent" }, Parent = Frame, }) ListLayout(List, 0) self.OptionRows = {} for Index, Option in self.Options do local Option_ = OptionRow(List, self:_Name(Option), Index) Option_.Value = Option Option_:SetSelected(self:IsSelected(Option), true) Connect(Option_.Button.MouseButton1Click, function() self:_Choose(Option) end) table.insert(self.OptionRows, Option_) end if Search then Connect(Search:GetPropertyChangedSignal("Text"), function() local Query = Search.Text:lower() local Count = 0 for _, Option_ in self.OptionRows do local Match = Query == "" or self:_Name(Option_.Value):lower():find(Query, 1, true) ~= nil Option_.Button.Visible = Match if Match then Count += 1 end end self:_ResizeList(Count) end) end self.ListFrame, self.ListScroll, self.ListTop, self.SearchBox = Frame, List, Top, Search self.Popup = { Frame = Frame, Owner = self.Box, Update = function() Frame.Size = UDim2.fromOffset(self.Box.AbsoluteSize.X, Frame.Size.Y.Offset) PlacePopup(Frame, self.Box, 0, 8) end, OnClose = function() FadePopup(Frame, false) end, } self:_ResizeList(#self.Options) end function DropdownClass:_ResizeList(Count) local Visible = math.min(math.max(Count, 1), self.MaxVisible) self.ListFrame.Size = UDim2.fromOffset(self.Box.AbsoluteSize.X, Visible * 24 + 2 + (self.ListTop - 1)) end function DropdownClass:_Choose(Option) if self.Multi then local Value = table.clone(self.Value) local Index = table.find(Value, Option) if Index then table.remove(Value, Index) else table.insert(Value, Option) end self:Set(Value) else self:Set(Option) if self.Popup then Library:ClosePopup(self.Popup) end end end function DropdownClass:Toggle() if not self.Popup or self._Dirty then self:_BuildList() self._Dirty = false end if self.Popup.Open then Library:ClosePopup(self.Popup) return end for _, Option_ in self.OptionRows do Option_:SetSelected(self:IsSelected(Option_.Value), true) end if self.SearchBox then self.SearchBox.Text = "" end self.Popup.ParentPopup = self.Container and self.Container.ParentPopup Library:OpenPopup(self.Popup) FadePopup(self.ListFrame, true, 4) end function DropdownClass:Set(Value, Silent) if self.Multi then if type(Value) ~= "table" then Value = Value ~= nil and { Value } or {} end local Clean = {} for _, Option in Value do if table.find(self.Options, Option) and not table.find(Clean, Option) then table.insert(Clean, Option) end end self.Value = Clean else if Value ~= nil and not table.find(self.Options, Value) then return end self.Value = Value end if self.Flag then Library.Flags[self.Flag] = self.Value end self:_DrawValue() for _, Option_ in self.OptionRows do Option_:SetSelected(self:IsSelected(Option_.Value)) end if not Silent then self:_Fire(self.Value) end end function DropdownClass:SetOptions(Options, Keep) self.Options, self.Names = NormalizeOptions(Options) self._Dirty = true if self.Popup and self.Popup.Open then Library:ClosePopup(self.Popup) end if not Keep then if self.Multi then self:Set({}, true) else self:Set(self.Options[1], true) end else self:Set(self.Value, true) end end DropdownClass.Refresh = DropdownClass.SetOptions end do local ButtonClass = Class("Button") local function CreateButton(Parent, Config, Container_) local Self = setmetatable({ Type = "Button", Text = Config.Text or Config.Title or "Button", Callback = Config.Callback, Container = Container_, Confirm = Config.Confirm or Config.Confirmation }, ButtonClass) local Button = Create("TextButton", { Size = UDim2.new(1, 0, 1, 0), Theme = { BackgroundColor3 = "Element" }, Parent = Parent }) Corner(Button, 5) Shade(Button) Stroke(Button, "Outline") local Label = Create("TextLabel", { Weight = "SemiBold", Size = UDim2.fromScale(1, 1), Text = Self.Text, TextTruncate = Enum.TextTruncate.AtEnd, Theme = { TextColor3 = "Text" }, Parent = Button }) Self.Button, Self.Label = Button, Label local Pending = false Connect(Button.MouseEnter, function() ThemeTween(Button, "BackgroundColor3", "Hovered Element", 0.15) end) Connect(Button.MouseLeave, function() ThemeTween(Button, "BackgroundColor3", "Element", 0.15) end) Connect(Button.MouseButton1Down, function() Tween(Label, { TextTransparency = 0.35 }, 0.08) end) Connect(Button.MouseButton1Up, function() Tween(Label, { TextTransparency = 0 }, 0.15) end) Connect(Button.MouseButton1Click, function() if Self.Confirm and not Pending then Pending = true Library:SetText(Label, "Are you sure?") ThemeTween(Label, "TextColor3", "Accent", 0.15) task.delay(2.5, function() if Pending then Pending = false Library:SetText(Label, Self.Text) ThemeTween(Label, "TextColor3", "Text", 0.15) end end) return end if Pending then Pending = false Library:SetText(Label, Self.Text) ThemeTween(Label, "TextColor3", "Text", 0.15) end Self:_Fire() end) return Self end function Container:AddButton(Config, Callback) if type(Config) == "string" then Config = { Text = Config, Callback = Callback } end Config = Config or {} local Row = self:_Row(28) local Layout = ListLayout(Row, 6, Enum.FillDirection.Horizontal) pcall(function() Layout.HorizontalFlex = Enum.UIFlexAlignment.Fill end) local Self = CreateButton(Row, Config, self) Self.Row = Row Self.Button.Size = UDim2.new(1, 0, 1, 0) self:_Index(Self.Text, "Button", Row) return Self end function ButtonClass:AddButton(Config) Config = Config or {} local Other = CreateButton(self.Row, Config, self.Container) Other.Row = self.Row local Count = 0 for _, Child in self.Row:GetChildren() do if Child:IsA("TextButton") then Count += 1 end end for _, Child in self.Row:GetChildren() do if Child:IsA("TextButton") then Child.Size = UDim2.new(1 / Count, -6 * (Count - 1) / Count, 1, 0) end end if self.Container then self.Container:_Index(Other.Text, "Button", self.Row) end return Other end function ButtonClass:SetText(Text) self.Text = Text Library:SetText(self.Label, Text) end end do local InputClass = Class("Input") function Container:AddInput(Config) Config = Config or {} local Self = setmetatable({ Type = "Input", Text = Config.Text or Config.Title, Value = tostring(Config.Default or Config.Value or ""), Callback = Config.Callback, Numeric = Config.Numeric, Finished = Config.Finished ~= false and not Config.Live, Container = self, }, InputClass) Self.Flag = Config.Flag or NextFlag((self.Path or "") .. "/" .. (Self.Text or Config.Placeholder or "Input")) local HasLabel = Self.Text ~= nil and Self.Text ~= "" local Row = self:_Row(HasLabel and 46 or 25) if HasLabel then Create("TextLabel", { Weight = "SemiBold", Size = UDim2.new(1, 0, 0, 14), Text = Self.Text, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Text" }, Parent = Row }) end local Box = Create("TextBox", { Weight = "SemiBold", Position = UDim2.fromOffset(0, HasLabel and 21 or 0), Size = UDim2.new(1, 0, 0, 25), Text = Self.Value, PlaceholderText = Config.Placeholder or Config.PlaceHolder or "", ClearTextOnFocus = Config.ClearTextOnFocus == true, TextXAlignment = Enum.TextXAlignment.Left, TextTruncate = Enum.TextTruncate.AtEnd, Theme = { BackgroundColor3 = "Element", TextColor3 = "Text", PlaceholderColor3 = "Inactive Text" }, BackgroundTransparency = 0, Parent = Row, }) Corner(Box, 5) Shade(Box) Stroke(Box, "Outline") Padding(Box, 0, 0, 8, 8) Self.Row, Self.Box = Row, Box local function Commit() local Text = Box.Text if Self.Numeric then Text = Text:gsub("[^%d%.%-]", "") Box.Text = Text end Self.Value = Text if Self.Flag then Library.Flags[Self.Flag] = Text end Self:_Fire(Text) end if Self.Finished then Connect(Box.FocusLost, Commit) else Connect(Box:GetPropertyChangedSignal("Text"), Commit) end RegisterFlag(Self) self:_Index(Self.Text or Config.Placeholder or "Input", "Input", Row) return Self end Container.AddTextbox = Container.AddInput function InputClass:Set(Value, Silent) Value = tostring(Value or "") self.Value = Value self.Box.Text = Value if self.Flag then Library.Flags[self.Flag] = Value end if not Silent then self:_Fire(Value) end end end do function Container:AddLabel(Config) if type(Config) == "string" then Config = { Text = Config } end Config = Config or {} self.Counter += 1 local Label = Create("TextLabel", { Weight = "SemiBold", Name = "Label", Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y, Text = Config.Text or "", TextWrapped = true, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = Config.Color or (Config.Muted == false and "Text" or "Inactive Text") }, LayoutOrder = self.Counter, Parent = self.Holder, }) local Self = { Type = "Label", Row = Label, Label = Label } function Self.SetText(_, Text) Library:SetText(Label, Text) end function Self.SetVisible(_, Visible) Label.Visible = Visible end return Self end Container.AddParagraph = Container.AddLabel end do local ListClass = Class("List") function Container:AddList(Config) Config = Config or {} local Multi = Config.Multi == true local Default = Config.Default if Multi then Default = type(Default) == "table" and table.clone(Default) or (Default ~= nil and { Default } or {}) end local Self = setmetatable({ Type = "List", Text = Config.Text or Config.Title, Options = table.clone(Config.Options or Config.Values or {}), Multi = Multi, Value = Default, Callback = Config.Callback, Container = self, Rows = {}, Query = "", }, ListClass) Self.Flag = Config.Flag or NextFlag((self.Path or "") .. "/" .. (Self.Text or "List")) local Height = Config.Height or Config.Size or 178 local HasLabel = Self.Text ~= nil and Self.Text ~= "" local Searchable = Config.Search or Config.Searchable local Top = HasLabel and 21 or 0 local Row = self:_Row(Top + Height + (Searchable and 31 or 0)) if HasLabel then Create("TextLabel", { Weight = "SemiBold", Size = UDim2.new(1, 0, 0, 14), Text = Self.Text, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Text" }, Parent = Row }) end if Searchable then local Search = Create("TextBox", { Weight = "SemiBold", Position = UDim2.fromOffset(0, Top), Size = UDim2.new(1, 0, 0, 25), PlaceholderText = "Search...", Text = "", ClearTextOnFocus = false, TextXAlignment = Enum.TextXAlignment.Left, Theme = { BackgroundColor3 = "Element", TextColor3 = "Text", PlaceholderColor3 = "Inactive Text" }, BackgroundTransparency = 0, Parent = Row, }) Corner(Search, 5) Shade(Search) Stroke(Search, "Outline") Padding(Search, 0, 0, 8, 8) Connect(Search:GetPropertyChangedSignal("Text"), function() Self.Query = Search.Text:lower() Self:_Filter() end) Top += 31 end local Box = Create("Frame", { Position = UDim2.fromOffset(0, Top), Size = UDim2.new(1, 0, 0, Height), Theme = { BackgroundColor3 = "Element" }, Parent = Row }) Corner(Box, 5) Stroke(Box, "Outline") local Scroll = Create("ScrollingFrame", { Position = UDim2.fromOffset(1, 1), Size = UDim2.new(1, -2, 1, -2), ScrollBarThickness = 2, Theme = { ScrollBarImageColor3 = "Accent" }, Parent = Box, }) Padding(Scroll, 8, 8, 9, 9) ListLayout(Scroll, 0) Self.Row, Self.Box, Self.Scroll = Row, Box, Scroll Self:_Build() RegisterFlag(Self) if Self.Text then self:_Index(Self.Text, "List", Row) end return Self end Container.AddListbox = Container.AddList function ListClass:IsSelected(Option) if self.Multi then return table.find(self.Value, Option) ~= nil end return self.Value == Option end function ListClass:_Build() for _, Row in self.Rows do Row.Button:Destroy() end self.Rows = {} for Index, Option in self.Options do local Row = OptionRow(self.Scroll, tostring(Option), Index) Row.Value = Option Row:SetSelected(self:IsSelected(Option), true) Connect(Row.Button.MouseButton1Click, function() if self.Multi then local Value = table.clone(self.Value) local Found = table.find(Value, Option) if Found then table.remove(Value, Found) else table.insert(Value, Option) end self:Set(Value) else self:Set(Option) end end) table.insert(self.Rows, Row) end self:_Filter() end function ListClass:_Filter() for _, Row in self.Rows do Row.Button.Visible = self.Query == "" or tostring(Row.Value):lower():find(self.Query, 1, true) ~= nil end end function ListClass:Set(Value, Silent) if self.Multi then if type(Value) ~= "table" then Value = Value ~= nil and { Value } or {} end self.Value = table.clone(Value) else self.Value = Value end if self.Flag then Library.Flags[self.Flag] = self.Value end for _, Row in self.Rows do Row:SetSelected(self:IsSelected(Row.Value)) end if not Silent then self:_Fire(self.Value) end end function ListClass:SetOptions(Options) self.Options = table.clone(Options or {}) if self.Multi then local Keep = {} for _, Option in self.Value do if table.find(self.Options, Option) then table.insert(Keep, Option) end end self.Value = Keep elseif self.Value ~= nil and not table.find(self.Options, self.Value) then self.Value = nil end self:_Build() end ListClass.Refresh = ListClass.SetOptions end do local PartPickerClass = Class("PartPicker") function Container:AddPartPicker(Config) Config = Config or {} local Self = setmetatable({ Type = "PartPicker", Text = Config.Text or "Part", Value = nil, Callback = Config.Callback, Container = self, Filter = Config.Filter }, PartPickerClass) local Row = self:_Row(47) Create("TextLabel", { Weight = "SemiBold", Size = UDim2.new(1, 0, 0, 14), Text = Self.Text, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Text" }, Parent = Row }) local Box = Create("TextButton", { Position = UDim2.fromOffset(0, 21), Size = UDim2.new(1, 0, 0, 25), Theme = { BackgroundColor3 = "Element" }, Parent = Row }) Corner(Box, 5) Shade(Box) Stroke(Box, "Outline") local ValueLabel = Create("TextLabel", { Weight = "SemiBold", Position = UDim2.fromOffset(8, 0), Size = UDim2.new(1, -30, 1, 0), Text = "None", NoCase = true, TextXAlignment = Enum.TextXAlignment.Left, TextTruncate = Enum.TextTruncate.AtEnd, Theme = { TextColor3 = "Inactive Text" }, Parent = Box }) local Crosshair = Create("ImageLabel", { AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, -7, 0.5, 0), Size = UDim2.fromOffset(12, 12), Theme = { ImageColor3 = "Inactive Text" }, Parent = Box }) SetIcon(Crosshair, "Bullseye") Self.Row, Self.Box, Self.ValueLabel = Row, Box, ValueLabel Connect(Box.MouseButton1Click, function() Self:Pick() end) self:_Index(Self.Text, "Part picker", Row) return Self end function PartPickerClass:Pick() if Library.Picking then return end Library.Picking = self self.ValueLabel.Text = "Click a part... (Esc to cancel)" ThemeTween(self.ValueLabel, "TextColor3", "Accent", 0.15) local Highlight = Instance.new("Highlight") Highlight.FillTransparency = 0.6 Highlight.OutlineTransparency = 0 Highlight.FillColor = Theme.Accent Highlight.OutlineColor = Theme.Accent Highlight.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop local Camera = Workspace.CurrentCamera local Params = RaycastParams.new() Params.FilterType = Enum.RaycastFilterType.Exclude Params.FilterDescendantsInstances = { LocalPlayer.Character } local Hovered local Window_ = Library.Window local WasOpen = Window_ and Window_.Open if Window_ then Window_:SetOpen(false) end local Step, Click local function Finish(Part) if Step then Step:Disconnect() end if Click then Click:Disconnect() end Highlight:Destroy() Library.Picking = nil if Window_ and WasOpen then Window_:SetOpen(true) end ThemeTween(self.ValueLabel, "TextColor3", "Inactive Text", 0.15) if Part then self:Set(Part) else self.ValueLabel.Text = self.Value and self.Value.Name or "None" end end Step = RunService.RenderStepped:Connect(function() local Point = MousePosition() local Ray = Camera:ScreenPointToRay(Point.X, Point.Y) local Result = Workspace:Raycast(Ray.Origin, Ray.Direction * 5000, Params) local Part = Result and Result.Instance if Part and self.Filter and not self.Filter(Part) then Part = nil end if Part ~= Hovered then Hovered = Part Highlight.Adornee = Part Highlight.Parent = Part and Library.HudGui or nil end end) Click = UserInputService.InputBegan:Connect(function(Input) if Input.UserInputType == Enum.UserInputType.MouseButton1 then Finish(Hovered) elseif Input.KeyCode == Enum.KeyCode.Escape then Finish(nil) end end) end function PartPickerClass:Set(Part, Silent) self.Value = Part self.ValueLabel.Text = Part and Part:GetFullName():gsub("^Workspace%.", "") or "None" if not Silent then self:_Fire(Part) end end end do function Library:_Index(Entry) table.insert(Library.SearchIndex, Entry) end function Window:_BuildSearch() local Canvas = self.Canvas local Dim = Create("TextButton", { Name = "SearchDim", Size = UDim2.fromScale(1, 1), BackgroundColor3 = Color3.new(0, 0, 0), BackgroundTransparency = 1, Visible = false, ZIndex = 40, Parent = Canvas }) local Modal = Create("CanvasGroup", { Name = "Search", Active = true, AnchorPoint = Vector2.new(0.5, 0), Position = UDim2.new(0.5, 0, 0, 61), Size = UDim2.fromOffset(421, 340), Theme = { BackgroundColor3 = "Popup" }, GroupTransparency = 1, Visible = false, ZIndex = 41, Parent = Canvas, }) Corner(Modal, 8) Stroke(Modal, "Outline") local Title = Create("TextLabel", { Position = UDim2.fromOffset(18, 13), Size = UDim2.new(1, -36, 0, 24), Text = "Search", TextSize = 17, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Text" }, Parent = Modal }) local InputFrame = Create("Frame", { Position = UDim2.fromOffset(17, 52), Size = UDim2.new(1, -34, 0, 36), Theme = { BackgroundColor3 = "Tab" }, Parent = Modal }) Corner(InputFrame, 8) Stroke(InputFrame, "Outline") local Icon = Create("ImageLabel", { AnchorPoint = Vector2.new(0, 0.5), Position = UDim2.new(0, 12, 0.5, 0), Size = UDim2.fromOffset(14, 14), Theme = { ImageColor3 = "Inactive Text" }, Parent = InputFrame }) SetIcon(Icon, "Search") local Box = Create("TextBox", { Position = UDim2.fromOffset(34, 0), Size = UDim2.new(1, -44, 1, 0), PlaceholderText = "Type to search...", Text = "", ClearTextOnFocus = false, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Text", PlaceholderColor3 = "Inactive Text" }, Parent = InputFrame, }) local Results = Create("ScrollingFrame", { Position = UDim2.fromOffset(17, 100), Size = UDim2.new(1, -30, 1, -110), ScrollBarThickness = 2, Theme = { ScrollBarImageColor3 = "Accent" }, Parent = Modal, }) ListLayout(Results, 6) Padding(Results, 0, 6, 0, 6) self.SearchParts = { Dim = Dim, Modal = Modal, Title = Title, Box = Box, Results = Results } local function Render(Query) for _, Child in Results:GetChildren() do if Child:IsA("GuiObject") then Child:Destroy() end end Library:SetText(Title, Query ~= "" and Query or "Search") if Query ~= "" then self.SearchText.Text = Query ThemeTween(self.SearchText, "TextColor3", "Text", 0.1) else self.SearchText.Text = "Search..." ThemeTween(self.SearchText, "TextColor3", "Inactive Text", 0.1) end if Query == "" then return end local Lower = Query:lower() local Matches = {} for _, Entry in Library.SearchIndex do if Entry.Tab and Entry.Tab.Window == self then local Title_ = tostring(Entry.Title or ""):lower() local Start = Title_:find(Lower, 1, true) if Start then table.insert(Matches, { Entry = Entry, Score = Start + (Entry.Type == "Section" and -0.5 or 0) }) end end end table.sort(Matches, function(A, B) return A.Score < B.Score end) for Index = 1, math.min(#Matches, 40) do local Entry = Matches[Index].Entry local Row = Create("CanvasGroup", { Size = UDim2.new(1, 0, 0, 42), Theme = { BackgroundColor3 = "Tab" }, GroupTransparency = 1, LayoutOrder = Index, Parent = Results }) Corner(Row, 6) Stroke(Row, "Outline") local Bar = Create("Frame", { AnchorPoint = Vector2.new(0, 0.5), Position = UDim2.new(0, 6, 0.5, 0), Size = UDim2.fromOffset(3, 27), Theme = { BackgroundColor3 = "Accent" }, Parent = Row }) Corner(Bar, 1) Create("TextLabel", { Position = UDim2.fromOffset(17, 6), Size = UDim2.new(1, -24, 0, 16), Text = Entry.Title, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Text" }, Parent = Row }) Create("TextLabel", { Position = UDim2.fromOffset(17, 21), Size = UDim2.new(1, -24, 0, 14), Text = (Entry.Path or "") .. " · " .. (Entry.Type or ""), TextSize = 11, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Inactive Text" }, Parent = Row }) local Click = Create("TextButton", { Size = UDim2.fromScale(1, 1), BackgroundTransparency = 1, ZIndex = 3, Parent = Row }) Connect(Click.MouseEnter, function() ThemeTween(Row, "BackgroundColor3", "Hovered Element", 0.15) end) Connect(Click.MouseLeave, function() ThemeTween(Row, "BackgroundColor3", "Tab", 0.15) end) Connect(Click.MouseButton1Click, function() self:_GoTo(Entry) end) task.delay((Index - 1) * 0.03, function() if Row.Parent then Tween(Row, { GroupTransparency = 0 }, 0.25) end end) end end Connect(Box:GetPropertyChangedSignal("Text"), function() Render(Box.Text) end) Connect(Dim.MouseButton1Click, function() self:CloseSearch() end) Connect(UserInputService.InputBegan, function(Input) if Input.KeyCode == Enum.KeyCode.Escape and self.SearchOpen then self:CloseSearch() end end) end function Window:OpenSearch() local Parts = self.SearchParts if self.SearchOpen then return end self.SearchOpen = true Library:CloseAllPopups() Parts.Dim.Visible = true Parts.Modal.Visible = true Tween(Parts.Dim, { BackgroundTransparency = 0.45 }, 0.2) Parts.Modal.Position = UDim2.new(0.5, 0, 0, 69) Tween(Parts.Modal, { GroupTransparency = 0, Position = UDim2.new(0.5, 0, 0, 61) }, 0.25) task.defer(function() Parts.Box:CaptureFocus() end) end function Window:CloseSearch() local Parts = self.SearchParts if not Parts or not self.SearchOpen then return end self.SearchOpen = false Parts.Box:ReleaseFocus() Tween(Parts.Dim, { BackgroundTransparency = 1 }, 0.2) local Fade = Tween(Parts.Modal, { GroupTransparency = 1 }, 0.2) Fade.Completed:Connect(function() if self.SearchOpen then return end Parts.Dim.Visible = false Parts.Modal.Visible = false Parts.Box.Text = "" end) end function Window:_GoTo(Entry) self:CloseSearch() if Entry.Tab then Entry.Tab:Select() end local Target = Entry.Target if not Target then return end task.delay(0.05, function() local Column = Target:FindFirstAncestorWhichIsA("ScrollingFrame") if Column and Column.Parent == Entry.Tab.Page then local Offset = Target.AbsolutePosition.Y - Column.AbsolutePosition.Y + Column.CanvasPosition.Y - 30 local MaxY = math.max(0, Column.AbsoluteCanvasSize.Y - Column.AbsoluteWindowSize.Y) Tween(Column, { CanvasPosition = Vector2.new(0, Clamp(Offset, 0, MaxY)) }, 0.35) end task.wait(0.3) local Content = Target:IsDescendantOf(self.Content) and self.Content or Target:FindFirstAncestorWhichIsA("LayerCollector") if not Content then return end local Flash = Create("Frame", { Theme = { BackgroundColor3 = "Accent" }, BackgroundTransparency = 0.82, ZIndex = 50, Parent = Content }) Corner(Flash, 6) local function Follow() local Position = Target.AbsolutePosition - Content.AbsolutePosition Flash.Position = UDim2.fromOffset(Position.X - 4, Position.Y - 3) Flash.Size = UDim2.fromOffset(Target.AbsoluteSize.X + 8, Target.AbsoluteSize.Y + 6) end Follow() local Following = RunService.RenderStepped:Connect(Follow) Tween(Flash, { BackgroundTransparency = 1 }, 1.2).Completed:Connect(function() Following:Disconnect() Flash:Destroy() end) end) end end local function HudPanel(Properties) Properties.Theme = Properties.Theme or { BackgroundColor3 = "Popup" } local Frame = Create("Frame", Properties) Corner(Frame, 6) Stroke(Frame, "Outline") return Frame end do local NotifyHolder = Create("Frame", { Name = "Notifications", Position = UDim2.fromOffset(15, 15), Size = UDim2.new(0, 400, 1, -30), BackgroundTransparency = 1, Parent = Library.HudGui }) ListLayout(NotifyHolder, 6) local NotifyCounter = 0 local NotifyColors = { Success = Rgb(76, 214, 128), Info = nil, Warning = Rgb(242, 188, 72), Error = Rgb(240, 84, 84), } local NotifyIcons = { Success = "Check", Info = "Info", Warning = "Warning", Error = "Error" } function Library:Notify(Config, Duration, Kind) if type(Config) ~= "table" then Config = { Text = tostring(Config), Duration = Duration, Type = Kind } end Kind = Config.Type or Config.Kind or "Success" Duration = Config.Duration or Config.Lifetime or Config.Time or 4 NotifyCounter += 1 local Holder = Create("Frame", { Size = UDim2.fromOffset(0, 30), AutomaticSize = Enum.AutomaticSize.X, BackgroundTransparency = 1, LayoutOrder = -NotifyCounter, Parent = NotifyHolder }) local Panel = Create("CanvasGroup", { Position = UDim2.fromOffset(-20, 0), Size = UDim2.fromOffset(0, 30), AutomaticSize = Enum.AutomaticSize.X, Theme = { BackgroundColor3 = "Popup" }, GroupTransparency = 1, Parent = Holder }) Corner(Panel, 6) Stroke(Panel, "Outline") local Color = NotifyColors[Kind] local Bar = Create("Frame", { AnchorPoint = Vector2.new(0, 0.5), Position = UDim2.new(0, 1, 0.5, 0), Size = UDim2.fromOffset(2, 15), BackgroundColor3 = Color or Theme.Accent, Parent = Panel }) local Icon = Create("ImageLabel", { AnchorPoint = Vector2.new(0, 0.5), Position = UDim2.new(0, 12, 0.5, 0), Size = UDim2.fromOffset(10, 10), ImageColor3 = Color or Theme.Accent, Parent = Panel }) if not Color then Library:Theme(Bar, "BackgroundColor3", "Accent") Library:Theme(Icon, "ImageColor3", "Accent") end SetIcon(Icon, Config.Icon or NotifyIcons[Kind] or "Check") local Label = Create("TextLabel", { Position = UDim2.fromOffset(31, 0), Size = UDim2.new(0, 0, 1, 0), AutomaticSize = Enum.AutomaticSize.X, Text = Config.Text or Config.Title or "", TextSize = 12, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Text" }, Parent = Panel }) Padding(Label, 0, 0, 0, 12) Tween(Panel, { Position = UDim2.fromOffset(0, 0), GroupTransparency = 0 }, 0.3) local Entry = { Holder = Holder } table.insert(Library.Notifications, Entry) task.delay(Duration, function() if not Holder.Parent then return end Tween(Panel, { Position = UDim2.fromOffset(-20, 0), GroupTransparency = 1 }, 0.3).Completed:Wait() Tween(Holder, { Size = UDim2.fromOffset(0, 0) }, 0.15).Completed:Wait() Holder:Destroy() local Index = table.find(Library.Notifications, Entry) if Index then table.remove(Library.Notifications, Index) end end) return Entry end end local HudDraggable; do function HudDraggable(Handle, Target, Key) Layout.TrackPosition(Key, Target) local Dragging, Start, From Connect(Handle.InputBegan, function(Input) if Input.UserInputType == Enum.UserInputType.MouseButton1 or Input.UserInputType == Enum.UserInputType.Touch then Dragging, Start, From = true, MousePosition(), Target.Position end end) Connect(UserInputService.InputChanged, function(Input) if Dragging and (Input.UserInputType == Enum.UserInputType.MouseMovement or Input.UserInputType == Enum.UserInputType.Touch) then local Delta = MousePosition() - Start Target.Position = UDim2.new(From.X.Scale, From.X.Offset + Delta.X, From.Y.Scale, From.Y.Offset + Delta.Y) end end) Connect(UserInputService.InputEnded, function(Input) if Input.UserInputType == Enum.UserInputType.MouseButton1 or Input.UserInputType == Enum.UserInputType.Touch then if Dragging then Library:SaveLayout() end Dragging = false end end) end local Hotkeys = { Visible = true, Mode = "Active", ShowMode = false, Rows = {}, } Library.Hotkeys = Hotkeys local HotkeyHolder = Create("Frame", { Name = "Hotkeys", Position = UDim2.new(0, 15, 0.5, -12), Size = UDim2.fromOffset(200, 25), BackgroundTransparency = 1, Parent = Library.HudGui }) local HotkeyHeader = HudPanel({ Size = UDim2.fromOffset(0, 25), AutomaticSize = Enum.AutomaticSize.X, Active = true, Parent = HotkeyHolder }) do local Glyph = Create("Frame", { AnchorPoint = Vector2.new(0, 0.5), Position = UDim2.new(0, 10, 0.5, 0), Size = UDim2.fromOffset(14, 14), BackgroundTransparency = 1, Parent = HotkeyHeader }) local Ball = Create("Frame", { Position = UDim2.fromOffset(0, 6), Size = UDim2.fromOffset(8, 8), Theme = { BackgroundColor3 = "Accent" }, Parent = Glyph }) Corner(Ball, 4) local Stick = Create("Frame", { AnchorPoint = Vector2.new(0.5, 0.5), Position = UDim2.fromOffset(8.5, 5.5), Size = UDim2.fromOffset(8, 1.6), Rotation = -45, Theme = { BackgroundColor3 = "Accent" }, Parent = Glyph }) Corner(Stick, 1) local Tip = Create("Frame", { AnchorPoint = Vector2.new(0.5, 0.5), Position = UDim2.fromOffset(11.5, 2.5), Size = UDim2.fromOffset(5, 3), Rotation = -45, Theme = { BackgroundColor3 = "Accent" }, Parent = Glyph }) Corner(Tip, 2) Hotkeys.Title = Create("TextLabel", { Weight = "SemiBold", Position = UDim2.fromOffset(31, 0), Size = UDim2.new(0, 0, 1, 0), AutomaticSize = Enum.AutomaticSize.X, Text = "Hotkeys", TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Text" }, Parent = HotkeyHeader }) Padding(Hotkeys.Title, 0, 0, 0, 10) end HudDraggable(HotkeyHeader, HotkeyHolder, "Hotkeys") local HotkeyList = Create("Frame", { Position = UDim2.fromOffset(0, 30), Size = UDim2.fromOffset(260, 0), AutomaticSize = Enum.AutomaticSize.Y, BackgroundTransparency = 1, Parent = HotkeyHolder }) ListLayout(HotkeyList, 0) Hotkeys.Holder, Hotkeys.List = HotkeyHolder, HotkeyList Library.HotkeysVisible = true function Library:SetHotkeysVisible(Visible) Library.HotkeysVisible = Visible Hotkeys.Visible = Visible HotkeyHolder.Visible = Visible end function Hotkeys:SetMode(Mode) self.Mode = Mode == "All" and "All" or "Active" Library:_RefreshHotkeys() end function Hotkeys:SetShowMode(Show) self.ShowMode = Show Library:_RefreshHotkeys() end function Hotkeys:SetTitle(Text) Library:SetText(self.Title, Text) end local function KeybindDisplayName(Keybind) local Name = Keybind.Name if not Name and Keybind.Toggle then local Toggle_ = Keybind.Toggle local Section_ = Toggle_.Container and Toggle_.Container.Section Name = (Toggle_.Text == "Enabled" and Section_ and Section_.Title) or Toggle_.Text end return Name or Keybind.Text end local ROW_HEIGHT, ROW_GAP, ROW_SLIDE = 23, 5, 10 local function HotkeyRow(Keybind) local Row = Hotkeys.Rows[Keybind] if Row then return Row end local Holder = Create("Frame", { Size = UDim2.fromOffset(0, 0), AutomaticSize = Enum.AutomaticSize.X, BackgroundTransparency = 1, Visible = false, Parent = HotkeyList }) local Panel = Create("Frame", { Position = UDim2.fromOffset(-ROW_SLIDE, 0), Size = UDim2.fromOffset(0, ROW_HEIGHT), AutomaticSize = Enum.AutomaticSize.X, BackgroundTransparency = 1, Theme = { BackgroundColor3 = "Popup" }, Parent = Holder }) Corner(Panel, 6) local Outline = Stroke(Panel, "Outline") Outline.Transparency = 1 local Label = Create("TextLabel", { Weight = "SemiBold", Size = UDim2.new(0, 0, 1, 0), AutomaticSize = Enum.AutomaticSize.X, TextXAlignment = Enum.TextXAlignment.Left, TextTransparency = 1, Theme = { TextColor3 = "Text" }, Parent = Panel }) Padding(Label, 0, 0, 9, 9) Row = { Holder = Holder, Panel = Panel, Outline = Outline, Label = Label, Shown = false } Hotkeys.Rows[Keybind] = Row return Row end local function ShowRow(Row, Show) if Row.Shown == Show then return end Row.Shown = Show Row.Token = (Row.Token or 0) + 1 local Token = Row.Token local Alpha = Show and 0 or 1 local Time, Style, Direction = Show and 0.22 or 0.16, Enum.EasingStyle.Quint, Show and Enum.EasingDirection.Out or Enum.EasingDirection.In if Show then Row.Holder.Visible = true Row.Panel.Position = UDim2.fromOffset(-ROW_SLIDE, 0) end Tween(Row.Holder, { Size = UDim2.fromOffset(0, Show and ROW_HEIGHT + ROW_GAP or 0) }, Show and 0.2 or 0.22, Enum.EasingStyle.Quint, Enum.EasingDirection.Out) Tween(Row.Panel, { Position = UDim2.fromOffset(Show and 0 or -ROW_SLIDE, 0), BackgroundTransparency = Alpha }, Time, Style, Direction) Tween(Row.Outline, { Transparency = Alpha }, Time, Style, Direction) Tween(Row.Label, { TextTransparency = Alpha }, Time, Style, Direction).Completed:Connect(function() if not Show and Row.Token == Token then Row.Holder.Visible = false end end) end function Library:_RefreshHotkeys() for Index, Keybind in Library.Keybinds do local Listed = Keybind.Value.Key and not Keybind.NoList and not Keybind.OnPress local Active = Listed and Keybind:IsActive() local Show = Listed and (Active or Hotkeys.Mode == "All") if Show or Hotkeys.Rows[Keybind] then local Row = HotkeyRow(Keybind) Row.Holder.LayoutOrder = Index if Listed then local Key = Keybind.Value.Key local KeyText = Key.EnumType == Enum.KeyCode and Key.Name or Key.Name:gsub("MouseButton", "MB") local Text = KeybindDisplayName(Keybind) .. " - " .. KeyText if Hotkeys.ShowMode then Text ..= " [" .. Keybind.Value.Mode .. "]" end Library:SetText(Row.Label, Text) end ThemeTween(Row.Label, "TextColor3", Active and "Text" or "Inactive Text", 0.15) ShowRow(Row, Show) end end end end local GetPing; do local WatermarkHolder = Create("Frame", { Name = "Watermark", AnchorPoint = Vector2.new(0.5, 1), Position = UDim2.new(0.5, 0, 1, -20), Size = UDim2.fromOffset(0, 27), AutomaticSize = Enum.AutomaticSize.X, BackgroundTransparency = 1, Parent = Library.HudGui }) local WatermarkFrame = HudPanel({ Size = UDim2.fromOffset(0, 27), AutomaticSize = Enum.AutomaticSize.X, Active = true, Parent = WatermarkHolder }) ListLayout(WatermarkFrame, 7, Enum.FillDirection.Horizontal, Enum.HorizontalAlignment.Center, Enum.VerticalAlignment.Center) Padding(WatermarkFrame, 0, 0, 10, 10) HudDraggable(WatermarkFrame, WatermarkHolder, "Watermark") Library.WatermarkFrame = WatermarkFrame local GameName = "Roblox" task.spawn(function() pcall(function() GameName = game:GetService("MarketplaceService"):GetProductInfo(game.PlaceId).Name end) end) local FrameRate = 60 do local Frames, Last = 0, os.clock() Connect(RunService.RenderStepped, function() Frames += 1 local Now = os.clock() if Now - Last >= 0.5 then FrameRate = math.floor(Frames / (Now - Last) + 0.5) Frames, Last = 0, Now end end) end function GetPing() local Ok, Value = pcall(function() return Stats.Network.ServerStatsItem["Data Ping"]:GetValue() end) if Ok and Value then return math.floor(Value + 0.5) end Ok, Value = pcall(function() return LocalPlayer:GetNetworkPing() * 1000 end) return Ok and math.floor(Value + 0.5) or 0 end local Watermark = { Title = "Swift", Items = { "GameName", "PlayerName" }, Providers = { FPS = function() return FrameRate .. " fps" end, Ping = function() return GetPing() .. " ms" end, GameName = function() return GameName end, PlayerName = { Icon = "User", IconSize = 12, Text = function() return Library.AnonymousMode and Library.AnonymousName or LocalPlayer and (LocalPlayer.DisplayName .. " (@" .. LocalPlayer.Name .. ")") or "Player" end }, Time = function() return os.date("%H:%M:%S") end, Date = function() return os.date("%d/%m/%Y") end, }, Labels = {}, } Library.Watermark = Watermark function Watermark:_Render() for _, Child in WatermarkFrame:GetChildren() do if Child:IsA("GuiObject") then Child:Destroy() end end self.Labels = {} local Segments = { { Logo = true, Text = self.Title } } for _, Item in self.Items do local Provider = type(Item) == "string" and self.Providers[Item] or Item if Provider and not (type(Item) == "table" and Item.Visible == false) then table.insert(Segments, Provider) end end local Order = 0 for Index, Segment in Segments do if type(Segment) == "function" or type(Segment) == "string" then Segment = { Text = Segment } end if Index > 1 then Order += 1 Create("Frame", { Size = UDim2.fromOffset(1, 14), Theme = { BackgroundColor3 = "Outline" }, LayoutOrder = Order, Parent = WatermarkFrame }) end Order += 1 local Group = Create("Frame", { Size = UDim2.fromOffset(0, 27), AutomaticSize = Enum.AutomaticSize.X, BackgroundTransparency = 1, LayoutOrder = Order, Parent = WatermarkFrame }) ListLayout(Group, 8, Enum.FillDirection.Horizontal, Enum.HorizontalAlignment.Left, Enum.VerticalAlignment.Center) if Segment.Logo then Library:Logo(Group, 15) elseif Segment.Icon then local Image = Create("ImageLabel", { Size = UDim2.fromOffset(Segment.IconSize or 14, Segment.IconSize or 14), Theme = { ImageColor3 = Segment.IconColor or "Text" }, Parent = Group }) SetIcon(Image, Segment.Icon) end local Label = Create("TextLabel", { Weight = "SemiBold", Size = UDim2.fromOffset(0, 27), AutomaticSize = Enum.AutomaticSize.X, LayoutOrder = 2, Theme = { TextColor3 = "Text" }, Parent = Group }) local Text = Segment.Text if type(Text) == "function" then table.insert(self.Labels, { Label = Label, Get = Text }) local Ok, Value = pcall(Text) Library:SetText(Label, Ok and Value or "") else Library:SetText(Label, Text or "") end end end function Watermark:SetItems(Items) self.Items = Items or {} self:_Render() end function Watermark:SetTitle(Title) self.Title = Title self:_Render() end function Watermark:AddProvider(Name, Provider) self.Providers[Name] = Provider end task.spawn(function() while not Library.Unloaded do for _, Entry in Watermark.Labels do if Entry.Label.Parent then local Ok, Value = pcall(Entry.Get) if Ok then Library:SetText(Entry.Label, Value) end end end task.wait(0.5) end end) Watermark:_Render() function Library:SetWatermark(Segments) local Items = {} for Index, Segment in Segments do if Index == 1 and type(Segment) == "string" then Watermark.Title = Segment elseif Index == 1 and type(Segment) == "table" and Segment.Icon == "Logo" then Watermark.Title = Segment.Text or Watermark.Title else table.insert(Items, Segment) end end Watermark:SetItems(Items) end function Library:SetWatermarkVisible(Visible) WatermarkHolder.Visible = Visible end end do Library.BlurEnabled = false function Library:_UpdateBlur() local Open = false for _, Window_ in Library.Windows do if Window_.Open then Open = true end end local Wanted = Library.BlurEnabled and Open and 14 or 0 if not Library.Blur then if Wanted == 0 then return end Library.Blur = Instance.new("BlurEffect") Library.Blur.Name = "SwiftBlur" Library.Blur.Size = 0 Library.Blur.Parent = Workspace.CurrentCamera or Lighting end Tween(Library.Blur, { Size = Wanted }, 0.25) end function Library:SetBlur(Enabled) Library.BlurEnabled = Enabled Library:_UpdateBlur() end end do local CONFIG_FOLDER = Library.Folder .. "/configs" function Library:GetConfig() local Data = {} for Flag, Element in Library.Elements do if type(Flag) == "string" and Flag:sub(1, 2) ~= "__" and Element.Serialize and not Element.NoSave then local Ok, Value = pcall(Element.Serialize, Element) if Ok then Data[Flag] = Value end end end for _, Extra in Library.ConfigExtras or {} do local Ok, Key, Value = pcall(Extra.Save) if Ok and Key then Data[Key] = Value end end return HttpService:JSONEncode(Data) end function Library:LoadConfigString(Json) local Ok, Data = pcall(HttpService.JSONDecode, HttpService, Json) if not Ok or type(Data) ~= "table" then return false end if Data.__ThemeName and Themes[Data.__ThemeName] then Library:SetTheme(Data.__ThemeName) end for Flag, Value in Data do local Element = Library.Elements[Flag] if Element and Element.Deserialize then pcall(Element.Deserialize, Element, Value) end end for _, Extra in Library.ConfigExtras or {} do pcall(Extra.Load, Data) end return true end function Library:AddConfigExtra(Save, Load) Library.ConfigExtras = Library.ConfigExtras or {} table.insert(Library.ConfigExtras, { Save = Save, Load = Load }) end Library:AddConfigExtra(function() return "__Layout", Library:GetLayout() end, function(Data) if Data.__Layout and Library:LoadLayout(Data.__Layout) then Library:SaveLayout() end end) function Library:ListConfigs() local Out = {} for _, File in FS.List(CONFIG_FOLDER) do local Name = File:match("^(.*)%.json$") if Name then table.insert(Out, Name) end end return Out end function Library:SaveConfig(Name) if not Name or Name == "" then return false end FS.Write(CONFIG_FOLDER .. "/" .. Name .. ".json", Library:GetConfig()) return true end function Library:LoadConfig(Name) local Content = Name and FS.Read(CONFIG_FOLDER .. "/" .. Name .. ".json") if not Content then return false end return Library:LoadConfigString(Content) end function Library:DeleteConfig(Name) if not Name then return false end FS.Delete(CONFIG_FOLDER .. "/" .. Name .. ".json") return true end function Library:SetAutoload(Name) if Name then FS.Write(Library.Folder .. "/autoload.txt", Name) else FS.Delete(Library.Folder .. "/autoload.txt") end end function Library:GetAutoload() return FS.Read(Library.Folder .. "/autoload.txt") end end do function Window:AddSettingsTab(Config) Config = Config or {} local Settings = self:AddTab({ Title = Config.Title or "Settings", Icon = Config.Icon or "Gear", Category = Config.Category }) local Window_ = self local Profiles = Settings:AddSection({ Title = "Profiles", Icon = "Cube", Side = 1 }) local NameBox local ConfigList = Profiles:AddList({ Text = "Configs", Height = 178, Flag = "__ConfigList", Options = Library:ListConfigs(), Callback = function(Name) if NameBox and Name then NameBox:Set(Name, true) end end, }) NameBox = Profiles:AddInput({ Placeholder = "Config name", Flag = "__ConfigName" }) local function Refresh() ConfigList:SetOptions(Library:ListConfigs()) end local function Selected() local Name = NameBox.Value ~= "" and NameBox.Value or ConfigList.Value return Name end Profiles:AddButton({ Text = "Create", Callback = function() local Name = NameBox.Value if Name == "" then return Library:Notify({ Text = "Enter a config name first.", Type = "Error" }) end Library:SaveConfig(Name) Refresh() ConfigList:Set(Name, true) Library:Notify('Created config "' .. Name .. '".') end }) Profiles:AddButton({ Text = "Load", Callback = function() local Name = Selected() if Name and Library:LoadConfig(Name) then Library:Notify('Loaded config "' .. Name .. '".') else Library:Notify({ Text = "Select a config to load.", Type = "Error" }) end end }) Profiles:AddButton({ Text = "Delete", Callback = function() local Name = Selected() if not Name or Name == "" then return end Library:DeleteConfig(Name) Refresh() NameBox:Set("", true) Library:Notify('Deleted config "' .. Name .. '".') end }) Profiles:AddButton({ Text = "Overwrite", Callback = function() local Name = Selected() if not Name or Name == "" then return end Library:SaveConfig(Name) Refresh() Library:Notify('Overwrote config "' .. Name .. '".') end }) local Autoload = Settings:AddSection({ Title = "Autoload", Icon = "Cube", Side = 1 }) Autoload:AddButton({ Text = "Set selected as autoload", Callback = function() local Name = Selected() if not Name or Name == "" then return Library:Notify({ Text = "Select a config first.", Type = "Error" }) end Library:SetAutoload(Name) Library:Notify('Set "' .. Name .. '" as autoload.') end }) Autoload:AddButton({ Text = "Clear autoload", Callback = function() Library:SetAutoload(nil) Library:Notify("Cleared autoload.") end }) local Theming = Settings:AddSection({ Title = "Theming", Icon = "Cube", Side = 2 }) Theming:AddDropdown({ Text = "Theme", Options = ThemeOrder, Default = Library.ThemeName, Flag = "__ThemeName", Callback = function(Name) if Name == Library.ThemeName and not Window_._ThemeReady then Window_._ThemeReady = true return end Window_._ThemeReady = true Library:SetTheme(Name) Library:Notify('Applied "' .. Name .. '" theme.') end }) Library.Elements.__ThemeName.NoSave = false Theming:AddDropdown({ Text = "Casing", Options = CasingOrder, Default = Library.Casing, Flag = "Casing", Callback = function(Mode) if Mode == Library.Casing then return end Library:SetCasing(Mode) Library:Notify('Set casing to "' .. Mode .. '".') end }) Theming:AddDropdown({ Text = "Font", Options = Fonts.Order, Default = Library.Font, Flag = "Font", Callback = function(Name) if Name == Library.Font then return end Library:SetFont(Name) Library:Notify('Set font to "' .. Name .. '".') end }) Theming:AddSeparator() for _, Key in ThemeKeys do Theming:AddColorPicker({ Text = Key, Default = Theme[Key], Flag = "Theme_" .. Key, Callback = function(Color) if Library.ApplyingTheme then return end Library:SetThemeColor(Key, Color) end }) end local Menu = Settings:AddSection({ Title = "Menu", Icon = "Cube", Side = 2 }) Menu:AddKeybind({ Text = "Menu Keybind", Default = Config.MenuKeybind or Library.MenuKeybind, Flag = "MenuKeybind", NoList = true, OnPress = function() Window_:Toggle() end }) local Anonymous = Menu:AddToggle({ Text = "Anonymous Mode", Flag = "AnonymousMode", Default = false, Callback = function(Value) Library:SetAnonymous(Value) end }) local AnonymousSettings = Anonymous:Settings({ Title = "Anonymous Mode" }) AnonymousSettings:AddInput({ Text = "Custom Name", Flag = "AnonymousName", Default = "...", Finished = true, Callback = function(Value) Library:SetAnonymousName(Value) end }) AnonymousSettings:AddToggle({ Text = "Hide Name In Game", Flag = "AnonymousGame", Default = false, Callback = function(Value) Library:SetAnonymousGame(Value) end }) AnonymousSettings:AddInput({ Text = "Avatar User ID", Flag = "AnonymousAvatar", Default = "", Finished = true, Callback = function(Value) Library:SetAnonymousAvatar(Value) end }) local WatermarkToggle = Menu:AddToggle({ Text = "Watermark", Default = Config.Watermark ~= false, Flag = "Watermark", Callback = function(Value) Library:SetWatermarkVisible(Value) end }) local WatermarkSettings = WatermarkToggle:Settings({ Title = "Watermark Settings" }) WatermarkSettings:AddInput({ Text = "Name", Default = Library.Watermark.Title, Placeholder = "Swift", Flag = "WatermarkName", Callback = function(Text) Library.Watermark:SetTitle(Text ~= "" and Text or "Swift") end }) WatermarkSettings:AddMultiDropdown({ Text = "Items", Options = { "FPS", "Ping", { Name = "Game name", Value = "GameName" }, { Name = "Player name", Value = "PlayerName" }, "Time", "Date" }, Default = Library.Watermark.Items, Flag = "WatermarkItems", Callback = function(Values) local Selected, Present, Items = {}, {}, {} for _, Value in Values do Selected[Value] = true end for _, Item in Library.Watermark.Items do if type(Item) == "string" and Library.Watermark.Providers[Item] then if Selected[Item] then table.insert(Items, Item) end Present[Item] = true else table.insert(Items, Item) end end for _, Value in Values do if not Present[Value] then table.insert(Items, Value) end end Library.Watermark:SetItems(Items) end, }) local HotkeysToggle = Menu:AddToggle({ Text = "Keybind List", Default = Config.KeybindList ~= false, Flag = "KeybindList", Callback = function(Value) Library:SetHotkeysVisible(Value) end }) local HotkeySettings = HotkeysToggle:Settings({ Title = "Keybind List Settings" }) HotkeySettings:AddDropdown({ Text = "Show", Options = { { Name = "Active bindings", Value = "Active" }, { Name = "All bindings", Value = "All" } }, Default = "Active", Flag = "KeybindListMode", Callback = function(Mode) Library.Hotkeys:SetMode(Mode) end }) HotkeySettings:AddToggle({ Text = "Show Mode", Flag = "KeybindListShowMode", Callback = function(Value) Library.Hotkeys:SetShowMode(Value) end }) HotkeySettings:AddInput({ Text = "Title", Default = "Hotkeys", Placeholder = "Hotkeys", Flag = "KeybindListTitle", Callback = function(Text) Library.Hotkeys:SetTitle(Text ~= "" and Text or "Hotkeys") end }) Menu:AddToggle({ Text = "Menu Blur", Default = Config.Blur == true, Flag = "MenuBlur", Callback = function(Value) Library:SetBlur(Value) end }) Menu:AddSeparator() Menu:AddButton({ Text = "Unload", Confirm = true, Callback = function() Library:Unload() end }) Library.Elements.__ThemeName.Serialize = nil Library:AddConfigExtra(function() return "__ThemeName", Library.ThemeName end, function() end) task.defer(function() local Name = Library:GetAutoload() if Name and Library:LoadConfig(Name) then Library:Notify('Autoloaded config "' .. Name .. '".') end end) self.SettingsTab = Settings return Settings end Window.InitSettings = Window.AddSettingsTab Window.InitConfigs = Window.AddSettingsTab end do function Library:Unload() if Library.Unloaded then return end Library:SaveLayout() Library.Unloaded = true Privacy:Stop() for _, Callback in Library.UnloadCallbacks or {} do SafeCall(Callback) end for _, Connection in Library.Connections do pcall(function() Connection:Disconnect() end) end table.clear(Library.AnimatedPickers) if Library.Blur then Library.Blur:Destroy() end for _, Gui in { Library.HudGui, Library.MenuGui, Library.OverlayGui } do pcall(function() Gui:Destroy() end) end if Env.SwiftLibrary == Library then Env.SwiftLibrary = nil end end function Library:OnUnload(Callback) Library.UnloadCallbacks = Library.UnloadCallbacks or {} table.insert(Library.UnloadCallbacks, Callback) end end function Tab:GetCustomPage() if self.Custom then return self.Custom end for _, Column in self.Columns do Column.Visible = false end self.Custom = Create("Frame", { Name = "Custom", Size = UDim2.fromScale(1, 1), BackgroundTransparency = 1, ClipsDescendants = true, Parent = self.Page }) return self.Custom end local function Panel(Parent, Properties) Properties.Theme = Properties.Theme or { BackgroundColor3 = "Tab" } Properties.Parent = Parent local Frame = Create("Frame", Properties) Corner(Frame, 6) Stroke(Frame, "Outline") return Frame end local function SmallButton(Parent, Text, Properties) Properties = Properties or {} Properties.Theme = Properties.Theme or { BackgroundColor3 = "Element" } Properties.Parent = Parent local Button = Create("TextButton", Properties) Corner(Button, 5) Shade(Button) Stroke(Button, "Outline") local Label = Create("TextLabel", { Size = UDim2.fromScale(1, 1), Text = Text, TextSize = 12, Theme = { TextColor3 = "Text" }, Parent = Button }) Connect(Button.MouseEnter, function() ThemeTween(Button, "BackgroundColor3", "Hovered Element", 0.12) end) Connect(Button.MouseLeave, function() ThemeTween(Button, "BackgroundColor3", "Element", 0.12) end) return Button, Label end local PingColors = { Good = Rgb(110, 210, 130), Okay = Rgb(230, 190, 90), Bad = Rgb(230, 95, 95) } local function PingColor(Ping) return Ping < 90 and PingColors.Good or Ping < 170 and PingColors.Okay or PingColors.Bad end local function SegmentSwitch(Parent, Options, Callback) local Switch = Create("Frame", { Theme = { BackgroundColor3 = "Element" }, Parent = Parent }) Corner(Switch, 5) Shade(Switch) Stroke(Switch, "Outline") local Pill = Create("Frame", { Size = UDim2.fromScale(1 / #Options, 1), Theme = { BackgroundColor3 = "ToggleFill" }, Parent = Switch }) Corner(Pill, 5) Shade(Pill) local Labels = {} local Self = { Frame = Switch } function Self.Set(_, Value, Instant) for Index, Option in Options do if Option.Value == Value then Tween(Pill, { Position = UDim2.fromScale((Index - 1) / #Options, 0) }, Instant and 0 or 0.22) if Option.Color then Library:Unthemed(Pill, "BackgroundColor3") Tween(Pill, { BackgroundColor3 = Option.Color:Lerp(Theme.Element, 0.5) }, Instant and 0 or 0.22) else ThemeTween(Pill, "BackgroundColor3", "ToggleFill", Instant and 0 or 0.22) end end ThemeTween(Labels[Index], "TextColor3", Option.Value == Value and "Text" or "Inactive Text", Instant and 0 or 0.15) end end for Index, Option in Options do local Button = Create("TextButton", { Position = UDim2.fromScale((Index - 1) / #Options, 0), Size = UDim2.fromScale(1 / #Options, 1), BackgroundTransparency = 1, ZIndex = 2, Parent = Switch }) Labels[Index] = Create("TextLabel", { Size = UDim2.fromScale(1, 1), Text = Option.Name, TextSize = 11, ZIndex = 2, Theme = { TextColor3 = "Inactive Text" }, Parent = Button }) Connect(Button.MouseButton1Click, function() Callback(Option.Value) end) end return Self end local CopyText, Avatar; do local Playerlist = {} Playerlist.__index = Playerlist Library.Classes.Playerlist = Playerlist Library.PlayerStatuses = { "Neutral", "Friendly", "Enemy", "Priority" } Library.StatusColors = { Friendly = Rgb(96, 220, 120), Enemy = Rgb(240, 84, 84), Priority = Rgb(242, 188, 72), } local StatusOrder = { Client = -1, Priority = 1, Enemy = 2, Friendly = 3, Neutral = 4 } local function AccountAge(Player) local Days = Player.AccountAge if Days >= 365 then return string.format("%.1f years", Days / 365) end return Days .. " days" end function CopyText(Text, What) local Copy = Env.setclipboard or Env.toclipboard if typeof(Copy) == "function" then Copy(Text) Library:Notify("Copied " .. What .. ".") else Library:Notify({ Text = "Clipboard is not available here.", Type = "Warning" }) end end function Avatar(Parent, Size, Properties) Properties = Properties or {} Properties.Size = UDim2.fromOffset(Size, Size) Properties.BackgroundTransparency = 0 Properties.Theme = { BackgroundColor3 = "Element" } Properties.Parent = Parent local Image = Create("ImageLabel", Properties) Corner(Image, Size) local Ring = Create("UIStroke", { Thickness = Size > 30 and 2 or 1.5, Theme = { Color = "Outline" }, Parent = Image }) return Image, Ring end local function PaintRing(Ring, Color, Time) if Color then Library:Unthemed(Ring, "Color") Tween(Ring, { Color = Color }, Time or 0.15) else ThemeTween(Ring, "Color", "Outline", Time or 0.15) end end function Window:AddPlayerlist(Config) Config = Config or {} local TabObject = Config.Tab or self:AddTab({ Title = Config.Title or "Playerlist", Icon = Config.Icon or "Users", Category = Config.Category }) local Page = TabObject:GetCustomPage() local Self = setmetatable({ Tab = TabObject, Window = self, Rows = {}, Statuses = {}, Selected = nil, Callbacks = {}, Filter = "All", Query = "" }, Playerlist) Library.Playerlist = Self local Header = Create("Frame", { Position = UDim2.fromOffset(10, 10), Size = UDim2.new(1, -20, 0, 22), BackgroundTransparency = 1, Parent = Page }) local TitleRow = Create("Frame", { Size = UDim2.new(1, -250, 1, 0), BackgroundTransparency = 1, Parent = Header }) ListLayout(TitleRow, 8, Enum.FillDirection.Horizontal, Enum.HorizontalAlignment.Left, Enum.VerticalAlignment.Center) local HeaderIcon = Create("ImageLabel", { Size = UDim2.fromOffset(15, 15), LayoutOrder = 1, Theme = { ImageColor3 = "Inactive Text" }, Parent = TitleRow }) SetIcon(HeaderIcon, Config.Icon or "Users") Create("TextLabel", { Size = UDim2.fromOffset(0, 22), AutomaticSize = Enum.AutomaticSize.X, Text = Config.Title or "Players", LayoutOrder = 2, Theme = { TextColor3 = "Inactive Text" }, Parent = TitleRow }) local Count = Create("TextLabel", { Size = UDim2.fromOffset(0, 22), AutomaticSize = Enum.AutomaticSize.X, TextSize = 11, LayoutOrder = 3, Theme = { TextColor3 = "Inactive Text" }, Parent = TitleRow }) local Filter = SegmentSwitch(Header, { { Name = "All", Value = "All" }, { Name = "Friendly", Value = "Friendly", Color = Library.StatusColors.Friendly }, { Name = "Enemy", Value = "Enemy", Color = Library.StatusColors.Enemy }, { Name = "Priority", Value = "Priority", Color = Library.StatusColors.Priority }, }, function(Value) Self:SetFilter(Value) end) Filter.Frame.AnchorPoint = Vector2.new(1, 0.5) Filter.Frame.Position = UDim2.new(1, 0, 0.5, 0) Filter.Frame.Size = UDim2.fromOffset(240, 22) local ListPanel = Panel(Page, { Position = UDim2.fromOffset(10, 42), Size = UDim2.new(1, -20, 1, -232) }) local SearchIcon = Create("ImageLabel", { AnchorPoint = Vector2.new(0, 0.5), Position = UDim2.new(0, 12, 0, 16), Size = UDim2.fromOffset(13, 13), Theme = { ImageColor3 = "Inactive Text" }, Parent = ListPanel }) SetIcon(SearchIcon, "Search") local Search = Create("TextBox", { Position = UDim2.fromOffset(32, 0), Size = UDim2.new(1, -44, 0, 32), PlaceholderText = "Search players...", Text = "", ClearTextOnFocus = false, TextSize = 12, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Text", PlaceholderColor3 = "Inactive Text" }, Parent = ListPanel }) Create("Frame", { Position = UDim2.fromOffset(0, 32), Size = UDim2.new(1, 0, 0, 1), Theme = { BackgroundColor3 = "Outline" }, Parent = ListPanel }) local Scroll = Create("ScrollingFrame", { Position = UDim2.fromOffset(0, 33), Size = UDim2.new(1, 0, 1, -34), ScrollBarThickness = 2, Theme = { ScrollBarImageColor3 = "Accent" }, Parent = ListPanel }) Padding(Scroll, 4, 4, 4, 6) ListLayout(Scroll, 2) local Empty = Create("TextLabel", { AnchorPoint = Vector2.new(0.5, 0.5), Position = UDim2.new(0.5, 0, 0.5, 16), Size = UDim2.new(1, -40, 0, 16), Text = "No players match.", TextSize = 12, Visible = false, Theme = { TextColor3 = "Inactive Text" }, Parent = ListPanel }) Self.Scroll, Self.Count, Self.Empty, Self.FilterSwitch = Scroll, Count, Empty, Filter local Card = Panel(Page, { AnchorPoint = Vector2.new(0, 1), Position = UDim2.new(0, 10, 1, -10), Size = UDim2.new(1, -20, 0, 0), AutomaticSize = Enum.AutomaticSize.Y }) local CardItems = Create("Frame", { Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y, BackgroundTransparency = 1, Parent = Card }) Padding(CardItems, 12, 12, 12, 12) ListLayout(CardItems, 10) local Top = Create("Frame", { Size = UDim2.new(1, 0, 0, 44), BackgroundTransparency = 1, LayoutOrder = 1, Parent = CardItems }) local BigAvatar, BigRing = Avatar(Top, 44) local DisplayName = Create("TextLabel", { Position = UDim2.fromOffset(56, 4), Size = UDim2.new(1, -150, 0, 18), NoCase = true, TextSize = 15, TextXAlignment = Enum.TextXAlignment.Left, TextTruncate = Enum.TextTruncate.AtEnd, Theme = { TextColor3 = "Text" }, Parent = Top }) local Username = Create("TextLabel", { Position = UDim2.fromOffset(56, 24), Size = UDim2.new(1, -150, 0, 14), NoCase = true, TextSize = 11, TextXAlignment = Enum.TextXAlignment.Left, TextTruncate = Enum.TextTruncate.AtEnd, Theme = { TextColor3 = "Inactive Text" }, Parent = Top }) local StatusTag = Create("TextLabel", { AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, 0, 0.5, 0), Size = UDim2.fromOffset(0, 20), AutomaticSize = Enum.AutomaticSize.X, TextSize = 11, BackgroundTransparency = 0.85, Parent = Top }) Corner(StatusTag, 10) Padding(StatusTag, 0, 0, 9, 9) local InfoStrip = Create("Frame", { Size = UDim2.new(1, 0, 0, 30), BackgroundTransparency = 1, LayoutOrder = 2, Parent = CardItems }) local Info = {} local InfoKeys = { "User ID", "Team", "Account Age", "Distance", "Health" } for Index, Key in InfoKeys do local Column = Create("Frame", { Position = UDim2.fromScale((Index - 1) / #InfoKeys, 0), Size = UDim2.fromScale(1 / #InfoKeys, 1), BackgroundTransparency = 1, Parent = InfoStrip }) Create("TextLabel", { Size = UDim2.new(1, -6, 0, 13), Text = Key, TextSize = 10, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Inactive Text" }, Parent = Column }) Info[Key] = Create("TextLabel", { Position = UDim2.fromOffset(0, 15), Size = UDim2.new(1, -6, 0, 15), Text = "-", NoCase = true, TextSize = 12, TextXAlignment = Enum.TextXAlignment.Left, TextTruncate = Enum.TextTruncate.AtEnd, Theme = { TextColor3 = "Text" }, Parent = Column }) end local StatusRow = Create("Frame", { Size = UDim2.new(1, 0, 0, 24), BackgroundTransparency = 1, LayoutOrder = 3, Parent = CardItems }) local StatusOptions = {} for _, Status in Library.PlayerStatuses do table.insert(StatusOptions, { Name = Status, Value = Status, Color = Library.StatusColors[Status] }) end local StatusSwitch = SegmentSwitch(StatusRow, StatusOptions, function(Status) if Self.Selected then Self:SetStatus(Self.Selected, Status) end end) StatusSwitch.Frame.Size = UDim2.fromScale(1, 1) local YouLabel = Create("TextLabel", { Size = UDim2.fromScale(1, 1), Text = "This is you.", TextSize = 12, Visible = false, Theme = { TextColor3 = "Inactive Text" }, Parent = StatusRow }) local ActionRow = Create("Frame", { Size = UDim2.new(1, 0, 0, 24), BackgroundTransparency = 1, LayoutOrder = 4, Parent = CardItems }) local SpectateButton, SpectateLabel = SmallButton(ActionRow, "Spectate", { Size = UDim2.new(1 / 3, -4, 1, 0) }) local CopyNameButton = SmallButton(ActionRow, "Copy Name", { Position = UDim2.new(1 / 3, 2, 0, 0), Size = UDim2.new(1 / 3, -4, 1, 0) }) local CopyIdButton = SmallButton(ActionRow, "Copy ID", { Position = UDim2.new(2 / 3, 4, 0, 0), Size = UDim2.new(1 / 3, -4, 1, 0) }) Connect(SpectateButton.MouseButton1Click, function() Self:Spectate(not Self.Spectating) end) Connect(CopyNameButton.MouseButton1Click, function() if Self.Selected then CopyText(Self.Selected.Name, '"' .. Self.Selected.Name .. '"') end end) Connect(CopyIdButton.MouseButton1Click, function() if Self.Selected then CopyText(tostring(Self.Selected.UserId), "user id " .. Self.Selected.UserId) end end) local Custom = Create("Frame", { Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y, BackgroundTransparency = 1, LayoutOrder = 5, Parent = CardItems }) ListLayout(Custom, 6) local Section = NewContainer(Custom, { Path = "Playerlist" }) Section.NoIndex = true Self.Section = Section Connect(Card:GetPropertyChangedSignal("AbsoluteSize"), function() ListPanel.Size = UDim2.new(1, -20, 1, -(42 + Card.AbsoluteSize.Y + 20)) end) Self.Parts = { Avatar = BigAvatar, Ring = BigRing, DisplayName = DisplayName, Username = Username, StatusTag = StatusTag, Info = Info, StatusSwitch = StatusSwitch, YouLabel = YouLabel, SpectateLabel = SpectateLabel, } Connect(Search:GetPropertyChangedSignal("Text"), function() Self.Query = Search.Text:lower() Self:_ApplyFilter() end) for _, Player in Players:GetPlayers() do Self:_Add(Player) end Connect(Players.PlayerAdded, function(Player) Self:_Add(Player) end) Connect(Players.PlayerRemoving, function(Player) Self:_Remove(Player) end) Self:SetFilter("All", true) Self:Select(LocalPlayer) task.spawn(function() while not Library.Unloaded do local Player = Self.Selected if Player and TabObject.Active then local Character, Mine = Player.Character, LocalPlayer.Character local Root = Character and Character:FindFirstChild("HumanoidRootPart") local MyRoot = Mine and Mine:FindFirstChild("HumanoidRootPart") local Humanoid = Character and Character:FindFirstChildOfClass("Humanoid") Info.Distance.Text = (Root and MyRoot) and (math.floor((Root.Position - MyRoot.Position).Magnitude) .. " st") or "-" Info.Health.Text = Humanoid and (math.floor(Humanoid.Health) .. " / " .. math.floor(Humanoid.MaxHealth)) or "-" end task.wait(0.25) end end) Library:AddConfigExtra(function() local Out = {} for UserId, Status in Self.Statuses do if Status ~= "Client" then Out[tostring(UserId)] = Status end end return "__PlayerStatuses", Out end, function(Data) if type(Data.__PlayerStatuses) ~= "table" then return end for UserId, Status in Data.__PlayerStatuses do local Player = Players:GetPlayerByUserId(tonumber(UserId)) if Player then Self:SetStatus(Player, Status, true) else Self.Statuses[tonumber(UserId)] = Status end end end) return Self end function Playerlist:_Add(Player) if self.Rows[Player] then return end local IsClient = Player == LocalPlayer local Row = Create("TextButton", { Name = Player.Name, Size = UDim2.new(1, 0, 0, 36), BackgroundTransparency = 1, Theme = { BackgroundColor3 = "Element" }, Parent = self.Scroll }) Corner(Row, 5) local Bar = Create("Frame", { AnchorPoint = Vector2.new(0, 0.5), Position = UDim2.new(0, 0, 0.5, 0), Size = UDim2.fromOffset(3, 16), Theme = { BackgroundColor3 = "Accent" }, BackgroundTransparency = 1, Parent = Row }) Corner(Bar, 2) local Image, Ring = Avatar(Row, 24, { AnchorPoint = Vector2.new(0, 0.5), Position = UDim2.new(0, 10, 0.5, 0) }) local Name = Create("TextLabel", { Position = UDim2.fromOffset(44, 0), Size = UDim2.new(0, 0, 1, 0), AutomaticSize = Enum.AutomaticSize.X, Text = Player.DisplayName, NoCase = true, TextSize = 13, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Text" }, Parent = Row }) Create("UISizeConstraint", { MaxSize = Vector2.new(170, math.huge), Parent = Name }) Name.TextTruncate = Enum.TextTruncate.AtEnd local Sub = Create("TextLabel", { Position = UDim2.fromOffset(44, 0), Size = UDim2.new(1, -150, 1, 0), Text = "@" .. Player.Name, NoCase = true, TextSize = 11, TextXAlignment = Enum.TextXAlignment.Left, TextTruncate = Enum.TextTruncate.AtEnd, Theme = { TextColor3 = "Inactive Text" }, Parent = Row }) Library:SetPlayerText(Name, Player, Player.DisplayName) Library:SetPlayerText(Sub, Player, "@" .. Player.Name) Library:SetPlayerAvatar(Image, Player, "") local function PlaceSub() Sub.Position = UDim2.fromOffset(44 + Name.AbsoluteSize.X + 6, 1) end Connect(Name:GetPropertyChangedSignal("AbsoluteSize"), PlaceSub) PlaceSub() local Tag = Create("Frame", { AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, -10, 0.5, 0), Size = UDim2.fromOffset(0, 18), AutomaticSize = Enum.AutomaticSize.X, BackgroundTransparency = 1, Parent = Row }) ListLayout(Tag, 6, Enum.FillDirection.Horizontal, Enum.HorizontalAlignment.Right, Enum.VerticalAlignment.Center) local Dot = Create("Frame", { Size = UDim2.fromOffset(6, 6), LayoutOrder = 1, Parent = Tag }) Corner(Dot, 3) local TagLabel = Create("TextLabel", { Size = UDim2.fromOffset(0, 18), AutomaticSize = Enum.AutomaticSize.X, TextSize = 11, LayoutOrder = 2, Parent = Tag }) local Entry = { Player = Player, Row = Row, Bar = Bar, Ring = Ring, Name = Name, Sub = Sub, Tag = Tag, Dot = Dot, TagLabel = TagLabel } self.Rows[Player] = Entry local ThumbnailRequest = {} Entry.ThumbnailRequest = ThumbnailRequest if IsClient then self.Statuses[Player.UserId] = "Client" end self:_DrawStatus(Player) task.spawn(function() if Library.Unloaded or self.Rows[Player] ~= Entry or Entry.ThumbnailRequest ~= ThumbnailRequest then return end local Ok, Thumbnail = pcall(Players.GetUserThumbnailAsync, Players, Player.UserId, Enum.ThumbnailType.HeadShot, Enum.ThumbnailSize.Size48x48) if Ok and not Library.Unloaded and Row.Parent and self.Rows[Player] == Entry and Entry.ThumbnailRequest == ThumbnailRequest then Library:SetPlayerAvatar(Image, Player, Thumbnail) end end) Connect(Player:GetPropertyChangedSignal("Team"), function() if self.Selected == Player then self.Parts.Info.Team.Text = Player.Team and Player.Team.Name or "None" end end) Connect(Row.MouseEnter, function() if self.Selected ~= Player then Tween(Row, { BackgroundTransparency = 0.6 }, 0.12) end end) Connect(Row.MouseLeave, function() if self.Selected ~= Player then Tween(Row, { BackgroundTransparency = 1 }, 0.12) end end) Connect(Row.MouseButton1Click, function() self:Select(Player) end) self:_ApplyFilter() end function Playerlist:_Remove(Player) local Entry = self.Rows[Player] if not Entry then return end Entry.Row:Destroy() self.Rows[Player] = nil if self.Selected == Player then self:Select(LocalPlayer) end self:_ApplyFilter() end function Playerlist:_DrawStatus(Player) local Entry = self.Rows[Player] if not Entry then return end local Status = self:GetStatus(Player) local Color = Status == "Client" and Theme.Accent or Library.StatusColors[Status] Entry.Tag.Visible = Status ~= "Neutral" Library:SetText(Entry.TagLabel, Status == "Client" and "You" or Status) Entry.TagLabel.TextColor3 = Color or Theme["Inactive Text"] Entry.Dot.BackgroundColor3 = Color or Theme["Inactive Text"] PaintRing(Entry.Ring, Color, 0) Entry.Row.LayoutOrder = (StatusOrder[Status] or 4) * 1000 + (string.byte(Player.Name:lower()) or 0) end function Playerlist:SetFilter(Filter, Instant) self.Filter = Filter self.FilterSwitch:Set(Filter, Instant) self:_ApplyFilter() end function Playerlist:_ApplyFilter() local Shown = 0 for Player, Entry in self.Rows do local Status = self:GetStatus(Player) local MatchesFilter = self.Filter == "All" or Status == self.Filter local MatchesQuery = self.Query == "" or (Player.Name .. " " .. Player.DisplayName):lower():find(self.Query, 1, true) ~= nil Entry.Row.Visible = MatchesFilter and MatchesQuery if Entry.Row.Visible then Shown += 1 end end self.Count.Text = #Players:GetPlayers() .. " / " .. Players.MaxPlayers self.Empty.Visible = Shown == 0 end function Playerlist:Select(Player) local Old = self.Selected and self.Rows[self.Selected] if Old then Tween(Old.Row, { BackgroundTransparency = 1 }, 0.15) Tween(Old.Bar, { BackgroundTransparency = 1 }, 0.15) end if self.Spectating then self:Spectate(false) end self.Selected = Player local Entry = Player and self.Rows[Player] if Entry then Tween(Entry.Row, { BackgroundTransparency = 0.35 }, 0.15) Tween(Entry.Bar, { BackgroundTransparency = 0 }, 0.15) end if not Player then return end local Parts = self.Parts Library:SetPlayerText(Parts.DisplayName, Player, Player.DisplayName) Library:SetPlayerText(Parts.Username, Player, "@" .. Player.Name) Parts.Info["User ID"].Text = tostring(Player.UserId) Parts.Info.Team.Text = Player.Team and Player.Team.Name or "None" Parts.Info["Account Age"].Text = AccountAge(Player) self:_DrawProfileStatus(true) Library:SetPlayerAvatar(Parts.Avatar, Player, "") self.AvatarRequest = (self.AvatarRequest or 0) + 1 local AvatarRequest = self.AvatarRequest task.spawn(function() if Library.Unloaded or self.AvatarRequest ~= AvatarRequest then return end local Ok, Image = pcall(Players.GetUserThumbnailAsync, Players, Player.UserId, Enum.ThumbnailType.HeadShot, Enum.ThumbnailSize.Size150x150) if Ok and not Library.Unloaded and Parts.Avatar.Parent and self.Selected == Player and self.AvatarRequest == AvatarRequest then Library:SetPlayerAvatar(Parts.Avatar, Player, Image) end end) for _, Callback in self.Callbacks.Selected or {} do SafeCall(Callback, Player) end end function Playerlist:_DrawProfileStatus(Instant) local Player = self.Selected if not Player then return end local Parts = self.Parts local Status = self:GetStatus(Player) local IsClient = Player == LocalPlayer local Color = IsClient and Theme.Accent or Library.StatusColors[Status] Parts.StatusSwitch.Frame.Visible = not IsClient Parts.YouLabel.Visible = IsClient if not IsClient then Parts.StatusSwitch:Set(Status, Instant) end PaintRing(Parts.Ring, Color) Parts.StatusTag.Visible = Status ~= "Neutral" Library:SetText(Parts.StatusTag, IsClient and "You" or Status) Parts.StatusTag.TextColor3 = Color or Theme["Inactive Text"] Parts.StatusTag.BackgroundColor3 = Color or Theme.Element end function Playerlist:Spectate(Enabled) local Camera = Workspace.CurrentCamera local Target = self.Selected and self.Selected.Character and self.Selected.Character:FindFirstChildOfClass("Humanoid") if Enabled and Target and self.Selected ~= LocalPlayer then Camera.CameraSubject = Target self.Spectating = true else if LocalPlayer.Character then Camera.CameraSubject = LocalPlayer.Character:FindFirstChildOfClass("Humanoid") end self.Spectating = false end Library:SetText(self.Parts.SpectateLabel, self.Spectating and "Stop Spectating" or "Spectate") ThemeTween(self.Parts.SpectateLabel, "TextColor3", self.Spectating and "Accent" or "Text", 0.15) end function Playerlist:GetStatus(Player) return self.Statuses[Player.UserId] or "Neutral" end function Playerlist:SetStatus(Player, Status, Silent) if Player == LocalPlayer then return end self.Statuses[Player.UserId] = Status self:_DrawStatus(Player) if self.Selected == Player then self:_DrawProfileStatus() end self:_ApplyFilter() if not Silent then for _, Callback in self.Callbacks.Status or {} do SafeCall(Callback, Player, Status) end end end function Playerlist:GetPlayersWithStatus(Status) local Out = {} for _, Player in Players:GetPlayers() do if self:GetStatus(Player) == Status then table.insert(Out, Player) end end return Out end function Playerlist:OnStatusChanged(Callback) self.Callbacks.Status = self.Callbacks.Status or {} table.insert(self.Callbacks.Status, Callback) end function Playerlist:OnSelected(Callback) self.Callbacks.Selected = self.Callbacks.Selected or {} table.insert(self.Callbacks.Selected, Callback) end end do local ServerList = {} ServerList.__index = ServerList Library.Classes.ServerList = ServerList local function HttpGet(Url) local Ok, Result = pcall(function() return game:HttpGet(Url) end) if Ok and type(Result) == "string" then return Result end if Library.Unloaded then return nil end local RequestFunction = Env.request or Env.http_request or (type(Env.syn) == "table" and Env.syn.request) or (type(Env.http) == "table" and Env.http.request) if typeof(RequestFunction) == "function" then local Ok2, Response = pcall(RequestFunction, { Url = Url, Method = "GET" }) if Ok2 and type(Response) == "table" and Response.Body then return Response.Body end end return nil end local function FormatTime(Seconds) Seconds = math.floor(Seconds) local Hours, Minutes = math.floor(Seconds / 3600), math.floor(Seconds % 3600 / 60) if Hours > 0 then return string.format("%dh %02dm", Hours, Minutes) end return string.format("%dm %02ds", Minutes, Seconds % 60) end function Window:AddServerList(Config) Config = Config or {} local TabObject = Config.Tab or self:AddTab({ Title = Config.Title or "Servers", Icon = Config.Icon or "Globe", Category = Config.Category }) local Page = TabObject:GetCustomPage() local Self = setmetatable({ Tab = TabObject, Servers = {}, Sort = "Players", Rows = {} }, ServerList) Library.ServerList = Self local TeleportService = Service("TeleportService") local CURRENT_HEIGHT = 92 local Header = Create("Frame", { Position = UDim2.fromOffset(10, 10), Size = UDim2.new(1, -20, 0, 22), BackgroundTransparency = 1, Parent = Page }) local TitleRow = Create("Frame", { Size = UDim2.new(1, -300, 1, 0), BackgroundTransparency = 1, Parent = Header }) ListLayout(TitleRow, 8, Enum.FillDirection.Horizontal, Enum.HorizontalAlignment.Left, Enum.VerticalAlignment.Center) local HeaderIcon = Create("ImageLabel", { Size = UDim2.fromOffset(15, 15), LayoutOrder = 1, Theme = { ImageColor3 = "Inactive Text" }, Parent = TitleRow }) SetIcon(HeaderIcon, Config.Icon or "Globe") Create("TextLabel", { Size = UDim2.fromOffset(0, 22), AutomaticSize = Enum.AutomaticSize.X, Text = Config.Title or "Servers", LayoutOrder = 2, Theme = { TextColor3 = "Inactive Text" }, Parent = TitleRow }) local CountLabel = Create("TextLabel", { Size = UDim2.fromOffset(0, 22), AutomaticSize = Enum.AutomaticSize.X, Text = "", TextSize = 11, LayoutOrder = 3, Theme = { TextColor3 = "Inactive Text" }, Parent = TitleRow }) local Sorter = SegmentSwitch(Header, { { Name = "Most players", Value = "Players" }, { Name = "Least players", Value = "Empty" }, { Name = "Best ping", Value = "Ping" }, }, function(Sort) Self:SetSort(Sort) end) Sorter.Frame.AnchorPoint = Vector2.new(1, 0.5) Sorter.Frame.Position = UDim2.new(1, 0, 0.5, 0) Sorter.Frame.Size = UDim2.fromOffset(222, 22) local RefreshButton, RefreshLabel = SmallButton(Header, "Refresh", { AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, -228, 0.5, 0), Size = UDim2.fromOffset(64, 22) }) RefreshLabel.TextSize = 11 Self.Sorter, Self.CountLabel, Self.RefreshLabel, Self.RefreshButton = Sorter, CountLabel, RefreshLabel, RefreshButton local ListPanel = Panel(Page, { Position = UDim2.fromOffset(10, 42), Size = UDim2.new(1, -20, 1, -(42 + 10 + CURRENT_HEIGHT + 10)) }) local Columns = { { "#", 12 }, { "Players", 44 }, { "Ping", 214 }, { "FPS", 272 } } for _, Column in Columns do Create("TextLabel", { Position = UDim2.fromOffset(Column[2], 0), Size = UDim2.fromOffset(60, 28), Text = Column[1], TextSize = 11, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Inactive Text" }, Parent = ListPanel }) end Create("Frame", { Position = UDim2.fromOffset(0, 28), Size = UDim2.new(1, 0, 0, 1), Theme = { BackgroundColor3 = "Outline" }, Parent = ListPanel }) local Scroll = Create("ScrollingFrame", { Position = UDim2.fromOffset(0, 29), Size = UDim2.new(1, 0, 1, -30), ScrollBarThickness = 2, Theme = { ScrollBarImageColor3 = "Accent" }, Parent = ListPanel }) ListLayout(Scroll, 0) local Notice = Create("TextLabel", { AnchorPoint = Vector2.new(0.5, 0.5), Position = UDim2.new(0.5, 0, 0.5, 14), Size = UDim2.new(1, -60, 0, 40), Text = "", TextWrapped = true, TextSize = 12, Visible = false, Theme = { TextColor3 = "Inactive Text" }, Parent = ListPanel }) Self.Scroll, Self.Notice = Scroll, Notice local Current = Panel(Page, { AnchorPoint = Vector2.new(0, 1), Position = UDim2.new(0, 10, 1, -10), Size = UDim2.new(1, -20, 0, CURRENT_HEIGHT) }) local Dot = Create("Frame", { Position = UDim2.fromOffset(12, 16), Size = UDim2.fromOffset(7, 7), BackgroundColor3 = PingColors.Good, Parent = Current }) Corner(Dot, 4) Create("TextLabel", { Position = UDim2.fromOffset(26, 10), Size = UDim2.fromOffset(160, 18), Text = "Current server", TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Text" }, Parent = Current }) local StatsLabel = Create("TextLabel", { AnchorPoint = Vector2.new(1, 0), Position = UDim2.new(1, -12, 0, 10), Size = UDim2.new(1, -200, 0, 18), TextSize = 11, TextXAlignment = Enum.TextXAlignment.Right, Theme = { TextColor3 = "Inactive Text" }, Parent = Current }) local JobLabel = Create("TextLabel", { Position = UDim2.fromOffset(12, 30), Size = UDim2.new(1, -24, 0, 14), NoCase = true, TextSize = 11, TextXAlignment = Enum.TextXAlignment.Left, TextTruncate = Enum.TextTruncate.AtEnd, Theme = { TextColor3 = "Inactive Text" }, Parent = Current }) local Buttons = Create("Frame", { Position = UDim2.new(0, 12, 1, -36), Size = UDim2.new(1, -24, 0, 24), BackgroundTransparency = 1, Parent = Current }) local RejoinButton = SmallButton(Buttons, "Rejoin", { Size = UDim2.new(1 / 3, -4, 1, 0) }) local HopButton = SmallButton(Buttons, "Server Hop", { Position = UDim2.new(1 / 3, 2, 0, 0), Size = UDim2.new(1 / 3, -4, 1, 0) }) local CopyButton = SmallButton(Buttons, "Copy Job ID", { Position = UDim2.new(2 / 3, 4, 0, 0), Size = UDim2.new(1 / 3, -4, 1, 0) }) local function Teleport(JobId) local Ok, Error = pcall(function() if JobId then TeleportService:TeleportToPlaceInstance(game.PlaceId, JobId, LocalPlayer) else TeleportService:Teleport(game.PlaceId, LocalPlayer) end end) if Ok then Library:Notify("Teleporting...") else Library:Notify({ Text = "Teleport failed: " .. tostring(Error), Type = "Error" }) end end Self.Teleport = Teleport Connect(RejoinButton.MouseButton1Click, function() if #Players:GetPlayers() <= 1 then Teleport(nil) else Teleport(game.JobId) end end) Connect(HopButton.MouseButton1Click, function() Self:Hop() end) Connect(CopyButton.MouseButton1Click, function() CopyText(game.JobId, "job id") end) Connect(RefreshButton.MouseButton1Click, function() Self:Refresh() end) task.spawn(function() while not Library.Unloaded do if TabObject.Active then local Ping = GetPing() JobLabel.Text = "Job ID " .. (game.JobId ~= "" and game.JobId or "studio") Library:SetText(StatsLabel, string.format("%d / %d players · %d ms · up %s", #Players:GetPlayers(), Players.MaxPlayers, Ping, FormatTime(Workspace.DistributedGameTime))) Dot.BackgroundColor3 = PingColor(Ping) end task.wait(1) end end) Self:SetSort("Players", true) TabObject:OnSelected(function() if not Self.Loaded then Self:Refresh() end end) return Self end function ServerList:SetSort(Sort, Instant) self.Sort = Sort self.Sorter:Set(Sort, Instant) self:_Render() end function ServerList:Refresh() if Library.Unloaded or self.Refreshing then return end self.Loaded = true self.Refreshing = true self.RenderRequest = (self.RenderRequest or 0) + 1 self.Notice.Visible = true Library:SetText(self.Notice, "Loading servers...") Library:SetText(self.RefreshLabel, "Loading...") self.RefreshButton.Active = false task.defer(function() if Library.Unloaded then return end local Ok, Servers = pcall(function() local Body = HttpGet("https://games.roblox.com/v1/games/" .. game.PlaceId .. "/servers/Public?sortOrder=Desc&limit=100&excludeFullGames=false") if Library.Unloaded or not Body then return nil end local Data = HttpService:JSONDecode(Body) if type(Data) ~= "table" or type(Data.data) ~= "table" then return nil end local Result = {} for Index = 1, math.min(#Data.data, 100) do local Server = Data.data[Index] if type(Server) == "table" then table.insert(Result, { Id = Server.id, Playing = Server.playing or 0, Max = Server.maxPlayers or Players.MaxPlayers, Ping = Server.ping or 0, Fps = Server.fps or 0 }) end end return Result end) if Library.Unloaded then return end self.Refreshing = false self.RefreshButton.Active = true Library:SetText(self.RefreshLabel, "Refresh") self.Servers = Ok and Servers or {} if not Ok or not Servers then Library:SetText(self.Notice, "Could not load the server list. It needs HttpGet (executor) and does not work inside Studio.") self:_Render() return end self.Notice.Visible = #self.Servers == 0 Library:SetText(self.Notice, "No public servers found.") self:_Render() end) end function ServerList:_Render() if Library.Unloaded then return end self.RenderRequest = (self.RenderRequest or 0) + 1 local Request = self.RenderRequest local Sorted = table.clone(self.Servers) local Sort = self.Sort task.defer(function() local function Current() return not Library.Unloaded and self.RenderRequest == Request end if not Current() then return end for Index = #self.Rows, 1, -1 do self.Rows[Index]:Destroy() self.Rows[Index] = nil if Index % 5 == 0 then task.wait() if not Current() then return end end end local Connections, Next = Library.Connections, 1 for Index = 1, #Connections do local Connection = Connections[Index] if Connection.Connected ~= false then Connections[Next] = Connection Next += 1 end end for Index = #Connections, Next, -1 do Connections[Index] = nil end table.sort(Sorted, function(A, B) if Sort == "Empty" then return A.Playing < B.Playing end if Sort == "Ping" then return A.Ping < B.Ping end return A.Playing > B.Playing end) local Count = #Sorted Library:SetText(self.CountLabel, Count > 0 and (Count == 1 and "1 server" or (Count .. " servers")) or "") for Index, Server in Sorted do local IsCurrent = Server.Id == game.JobId local Row = Create("TextButton", { Size = UDim2.new(1, 0, 0, 34), Theme = { BackgroundColor3 = "Element" }, BackgroundTransparency = IsCurrent and 0.5 or 1, LayoutOrder = Index, Parent = self.Scroll }) if Index < Count then Create("Frame", { Position = UDim2.new(0, 10, 1, -1), Size = UDim2.new(1, -20, 0, 1), Theme = { BackgroundColor3 = "Outline" }, BackgroundTransparency = 0.4, Parent = Row }) end Create("TextLabel", { Position = UDim2.fromOffset(12, 0), Size = UDim2.fromOffset(30, 34), Text = tostring(Index), TextSize = 11, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Inactive Text" }, Parent = Row }) local BarBack = Create("Frame", { Position = UDim2.fromOffset(44, 15), Size = UDim2.fromOffset(100, 5), Theme = { BackgroundColor3 = "Inline" }, Parent = Row }) Corner(BarBack, 3) local Fill = Create("Frame", { Size = UDim2.fromScale(math.clamp(Server.Playing / math.max(Server.Max, 1), 0.04, 1), 1), Theme = { BackgroundColor3 = "ToggleFill" }, Parent = BarBack }) Corner(Fill, 3) Create("TextLabel", { Position = UDim2.fromOffset(152, 0), Size = UDim2.fromOffset(56, 34), Text = Server.Playing .. "/" .. Server.Max, TextSize = 12, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Text" }, Parent = Row }) Create("TextLabel", { Position = UDim2.fromOffset(214, 0), Size = UDim2.fromOffset(54, 34), Text = math.floor(Server.Ping) .. " ms", TextSize = 11, TextXAlignment = Enum.TextXAlignment.Left, TextColor3 = PingColor(Server.Ping), Parent = Row }) Create("TextLabel", { Position = UDim2.fromOffset(272, 0), Size = UDim2.fromOffset(54, 34), Text = tostring(math.floor(Server.Fps)), TextSize = 11, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Inactive Text" }, Parent = Row }) local Join, JoinLabel = SmallButton(Row, IsCurrent and "You're here" or "Join", { AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, -10, 0.5, 0), Size = UDim2.fromOffset(IsCurrent and 76 or 56, 22) }) if IsCurrent then ThemeTween(JoinLabel, "TextColor3", "Accent", 0) else Connect(Join.MouseButton1Click, function() self.Teleport(Server.Id) end) end Connect(Row.MouseEnter, function() Tween(Row, { BackgroundTransparency = IsCurrent and 0.3 or 0.6 }, 0.12) end) Connect(Row.MouseLeave, function() Tween(Row, { BackgroundTransparency = IsCurrent and 0.5 or 1 }, 0.12) end) table.insert(self.Rows, Row) if Index % 5 == 0 and Index < Count then task.wait() if not Current() then return end end end end) end function ServerList:Hop() local Options = {} for _, Server in self.Servers do if Server.Id ~= game.JobId and Server.Playing < Server.Max then table.insert(Options, Server) end end if #Options == 0 then Library:Notify({ Text = "No other servers available (refresh first).", Type = "Warning" }) return end self.Teleport(Options[math.random(1, #Options)].Id) end end do local SkinChanger = {} SkinChanger.__index = SkinChanger local SkinCategory = {} SkinCategory.__index = SkinCategory local SkinWeapon = {} SkinWeapon.__index = SkinWeapon Library.Classes.SkinChanger = SkinChanger Library.Rarities = { Default = Rgb(148, 148, 148), Consumer = Rgb(176, 195, 217), Industrial = Rgb(94, 152, 217), ["Mil-Spec"] = Rgb(75, 105, 255), Restricted = Rgb(136, 71, 255), Classified = Rgb(211, 44, 230), Covert = Rgb(235, 75, 75), Contraband = Rgb(228, 174, 57), } local function RarityColor(Rarity) return Library.Rarities[Rarity or "Default"] or Library.Rarities.Default end local function EqualGrid(Parent, Columns, Height, Gap) Gap = Gap or 8 local Layout = Create("UIGridLayout", { CellPadding = UDim2.fromOffset(Gap, Gap), SortOrder = Enum.SortOrder.LayoutOrder, Parent = Parent }) local Inset = Create("UIPadding", { Parent = Parent }) local function Fit() local Width = Parent.AbsoluteSize.X local Cell = math.max(1, math.floor((Width - Gap * (Columns - 1)) / Columns)) Layout.CellSize = UDim2.fromOffset(Cell, Height) Inset.PaddingLeft = UDim.new(0, math.max(0, math.floor((Width - Cell * Columns - Gap * (Columns - 1)) / 2))) end Connect(Parent:GetPropertyChangedSignal("AbsoluteSize"), Fit) Fit() return Layout end local function SkinCard(Parent, Data) local StageHeight = Data.StageHeight or 72 local Card = Create("TextButton", { LayoutOrder = Data.Order or 0, Theme = { BackgroundColor3 = "Tab" }, Parent = Parent }) Corner(Card, 6) local CardStroke = Stroke(Card, "Outline") local Stage = Create("Frame", { Position = UDim2.fromOffset(5, 5), Size = UDim2.new(1, -10, 0, StageHeight), Theme = { BackgroundColor3 = "Background" }, Parent = Card }) Corner(Stage, 5) local Glow = Create("Frame", { Size = UDim2.fromScale(1, 1), BackgroundColor3 = RarityColor(Data.Rarity), BackgroundTransparency = Data.Rarity and 0 or 1, Parent = Stage }) Corner(Glow, 5) Create("UIGradient", { Rotation = 90, Transparency = NumberSequence.new({ NumberSequenceKeypoint.new(0, 1), NumberSequenceKeypoint.new(0.4, 1), NumberSequenceKeypoint.new(1, 0.78) }), Parent = Glow }) local Inset = Data.ImageInset or 12 local Image = Create("ImageLabel", { AnchorPoint = Vector2.new(0.5, 0.5), Position = UDim2.fromScale(0.5, 0.5), Size = UDim2.new(1, -Inset * 2, 1, -Inset * 2), ScaleType = Enum.ScaleType.Fit, ImageColor3 = Data.ImageColor or Color3.new(1, 1, 1), ZIndex = 2, Parent = Stage }) SetIcon(Image, Data.Image) local Title = Create("TextLabel", { Position = UDim2.fromOffset(9, StageHeight + 11), Size = UDim2.new(1, -18, 0, 14), Text = Data.Title or "", TextXAlignment = Enum.TextXAlignment.Left, TextTruncate = Enum.TextTruncate.AtEnd, Theme = { TextColor3 = "Text" }, Parent = Card }) local Subtitle = Create("TextLabel", { Position = UDim2.fromOffset(9, StageHeight + 27), Size = UDim2.new(1, -18, 0, 12), Text = Data.Subtitle or "", TextSize = 11, TextXAlignment = Enum.TextXAlignment.Left, TextTruncate = Enum.TextTruncate.AtEnd, Parent = Card }) local Self = { Card = Card, Stroke = CardStroke, Stage = Stage, Glow = Glow, Image = Image, Title = Title, Subtitle = Subtitle, Selected = false, Corners = {} } function Self.SetRarity(_, Rarity) Glow.BackgroundColor3 = RarityColor(Rarity) Glow.BackgroundTransparency = Rarity and 0 or 1 if Rarity then Library:Unthemed(Subtitle, "TextColor3") Subtitle.TextColor3 = RarityColor(Rarity) else Library:Theme(Subtitle, "TextColor3", "Inactive Text") end end function Self.SetSelected(_, Selected) Self.Selected = Selected ThemeTween(CardStroke, "Color", Selected and "Accent" or "Outline", 0.15) end Self:SetRarity(Data.Rarity) local Grow = UDim2.new(1, -Inset * 2 + 8, 1, -Inset * 2 + 8) Connect(Card.MouseEnter, function() ThemeTween(Card, "BackgroundColor3", "Hovered Element", 0.12) Tween(Image, { Size = Grow }, 0.2) for _, Icon in Self.Corners do Tween(Icon, { ImageTransparency = 0 }, 0.12) end end) Connect(Card.MouseLeave, function() ThemeTween(Card, "BackgroundColor3", "Tab", 0.12) Tween(Image, { Size = UDim2.new(1, -Inset * 2, 1, -Inset * 2) }, 0.2) for Button, Icon in Self.Corners do if not Button:GetAttribute("On") then Tween(Icon, { ImageTransparency = 0.5 }, 0.12) end end end) return Self end local function CornerIcon(Card, Icon, Position, Anchor) local Button = Create("ImageButton", { AnchorPoint = Anchor, Position = Position, Size = UDim2.fromOffset(22, 22), BackgroundTransparency = 1, ImageTransparency = 1, ZIndex = 5, Parent = Card.Stage }) local Image = Create("ImageLabel", { AnchorPoint = Vector2.new(0.5, 0.5), Position = UDim2.fromScale(0.5, 0.5), Size = UDim2.fromOffset(12, 12), ImageTransparency = 0.5, Theme = { ImageColor3 = "Inactive Text" }, ZIndex = 6, Parent = Button }) SetIcon(Image, Icon) Card.Corners[Button] = Image Connect(Button.MouseEnter, function() ThemeTween(Image, "ImageColor3", "Text", 0.12) end) Connect(Button.MouseLeave, function() if not Button:GetAttribute("On") then ThemeTween(Image, "ImageColor3", "Inactive Text", 0.12) end end) return Button, Image end function Window:AddSkinChanger(Config) Config = Config or {} local TabObject = Config.Tab or self:AddTab({ Title = Config.Title or "Skins", Icon = Config.Icon or "Brush", Category = Config.Category }) local Page = TabObject:GetCustomPage() local Self = setmetatable({ Tab = TabObject, Window = self, Categories = {}, Weapons = {}, Saved = {}, Callbacks = {}, Counter = 0 }, SkinChanger) Library.SkinChanger = Self local Base = UDim2.fromOffset(10, 42) local Header = Create("Frame", { Position = UDim2.fromOffset(10, 10), Size = UDim2.new(1, -20, 0, 22), BackgroundTransparency = 1, Parent = Page }) local Crumbs = Create("Frame", { Size = UDim2.new(1, -150, 1, 0), BackgroundTransparency = 1, Parent = Header }) ListLayout(Crumbs, 6, Enum.FillDirection.Horizontal, Enum.HorizontalAlignment.Left, Enum.VerticalAlignment.Center) local HeaderIcon = Create("ImageLabel", { Size = UDim2.fromOffset(15, 15), LayoutOrder = 0, Theme = { ImageColor3 = "Inactive Text" }, Parent = Crumbs }) SetIcon(HeaderIcon, Config.Icon or "Brush") local Counter = Create("TextLabel", { AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, 0, 0.5, 0), Size = UDim2.fromOffset(140, 22), TextSize = 12, TextXAlignment = Enum.TextXAlignment.Right, Theme = { TextColor3 = "Inactive Text" }, Parent = Header }) local SearchFrame = Create("Frame", { AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, 0, 0.5, 0), Size = UDim2.fromOffset(140, 22), Theme = { BackgroundColor3 = "Element" }, Visible = false, Parent = Header }) Corner(SearchFrame, 5) Stroke(SearchFrame, "Outline") local SearchIcon = Create("ImageLabel", { AnchorPoint = Vector2.new(0, 0.5), Position = UDim2.new(0, 8, 0.5, 0), Size = UDim2.fromOffset(11, 11), Theme = { ImageColor3 = "Inactive Text" }, Parent = SearchFrame }) SetIcon(SearchIcon, "Search") local SearchBox = Create("TextBox", { Position = UDim2.fromOffset(25, 0), Size = UDim2.new(1, -31, 1, 0), Text = "", PlaceholderText = "Search weapons...", TextSize = 12, ClearTextOnFocus = false, TextXAlignment = Enum.TextXAlignment.Left, TextTruncate = Enum.TextTruncate.AtEnd, Theme = { TextColor3 = "Text", PlaceholderColor3 = "Inactive Text" }, Parent = SearchFrame }) local function View(Name) return Create("CanvasGroup", { Name = Name, Position = Base, Size = UDim2.new(1, -12, 1, -(Base.Y.Offset + 10)), BackgroundTransparency = 1, GroupTransparency = 1, Visible = false, Parent = Page }) end local function Scroll(Parent, Position, Size) local Frame = Create("ScrollingFrame", { Position = Position, Size = Size, ScrollBarThickness = 2, Theme = { ScrollBarImageColor3 = "Accent" }, Parent = Parent }) local Body = Create("Frame", { Size = UDim2.new(1, -8, 0, 0), AutomaticSize = Enum.AutomaticSize.Y, BackgroundTransparency = 1, Parent = Frame }) Padding(Body, 1, 10, 0, 0) return Frame, Body end local Main = View("Saved") local _, MainBody = Scroll(Main, UDim2.new(), UDim2.fromScale(1, 1)) local MainGrid = Create("Frame", { Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y, BackgroundTransparency = 1, Parent = MainBody }) EqualGrid(MainGrid, 3, 128) local CreateCard = Create("TextButton", { LayoutOrder = -1000, Theme = { BackgroundColor3 = "Tab" }, BackgroundTransparency = 0.6, Parent = MainGrid }) Corner(CreateCard, 6) local CreateStroke = Stroke(CreateCard, "Outline") local PlusRing = Create("Frame", { AnchorPoint = Vector2.new(0.5, 0.5), Position = UDim2.new(0.5, 0, 0.5, -10), Size = UDim2.fromOffset(32, 32), Theme = { BackgroundColor3 = "Element" }, Parent = CreateCard }) Corner(PlusRing, 16) local PlusStroke = Stroke(PlusRing, "Outline") local PlusIcon = Create("ImageLabel", { AnchorPoint = Vector2.new(0.5, 0.5), Position = UDim2.fromScale(0.5, 0.5), Size = UDim2.fromOffset(12, 12), Theme = { ImageColor3 = "Inactive Text" }, Parent = PlusRing }) SetIcon(PlusIcon, "Cross") local CreateText = Create("TextLabel", { AnchorPoint = Vector2.new(0.5, 0), Position = UDim2.new(0.5, 0, 0.5, 14), Size = UDim2.new(1, -12, 0, 14), Text = "New skin", TextSize = 12, Theme = { TextColor3 = "Inactive Text" }, Parent = CreateCard }) Connect(CreateCard.MouseEnter, function() for Object, Property in { [CreateText] = "TextColor3", [PlusIcon] = "ImageColor3", [PlusStroke] = "Color", [CreateStroke] = "Color" } do ThemeTween(Object, Property, "Accent", 0.15) end end) Connect(CreateCard.MouseLeave, function() ThemeTween(CreateText, "TextColor3", "Inactive Text", 0.15) ThemeTween(PlusIcon, "ImageColor3", "Inactive Text", 0.15) ThemeTween(PlusStroke, "Color", "Outline", 0.15) ThemeTween(CreateStroke, "Color", "Outline", 0.15) end) local Picker = View("Picker") local _, PickerBody = Scroll(Picker, UDim2.new(), UDim2.fromScale(1, 1)) ListLayout(PickerBody, 14) local NoResults = Create("TextLabel", { Size = UDim2.new(1, 0, 0, 40), Text = "No weapons found.", TextSize = 12, Visible = false, LayoutOrder = 100000, Theme = { TextColor3 = "Inactive Text" }, Parent = PickerBody }) local Gallery = View("Gallery") local Banner = Panel(Gallery, { Size = UDim2.new(1, -8, 0, 132) }) local Stage = Create("Frame", { Position = UDim2.fromOffset(8, 8), Size = UDim2.new(0, 200, 1, -16), Theme = { BackgroundColor3 = "Background" }, Parent = Banner }) Corner(Stage, 5) local StageGlow = Create("Frame", { Size = UDim2.fromScale(1, 1), BackgroundColor3 = Library.Rarities.Default, Parent = Stage }) Corner(StageGlow, 5) Create("UIGradient", { Rotation = 90, Transparency = NumberSequence.new({ NumberSequenceKeypoint.new(0, 1), NumberSequenceKeypoint.new(0.35, 1), NumberSequenceKeypoint.new(1, 0.72) }), Parent = StageGlow }) local Preview = Create("ImageLabel", { AnchorPoint = Vector2.new(0.5, 0.5), Position = UDim2.fromScale(0.5, 0.5), Size = UDim2.new(1, -28, 1, -24), ScaleType = Enum.ScaleType.Fit, ZIndex = 2, Parent = Stage }) local Info = Create("Frame", { Position = UDim2.fromOffset(222, 12), Size = UDim2.new(1, -234, 1, -24), BackgroundTransparency = 1, Parent = Banner }) local SkinName = Create("TextLabel", { Size = UDim2.new(1, 0, 0, 18), TextSize = 16, TextXAlignment = Enum.TextXAlignment.Left, TextTruncate = Enum.TextTruncate.AtEnd, Theme = { TextColor3 = "Text" }, Parent = Info }) local WeaponName = Create("TextLabel", { Position = UDim2.fromOffset(0, 21), Size = UDim2.new(1, 0, 0, 14), TextSize = 12, TextXAlignment = Enum.TextXAlignment.Left, TextTruncate = Enum.TextTruncate.AtEnd, Theme = { TextColor3 = "Inactive Text" }, Parent = Info }) local RarityPill = Create("Frame", { Position = UDim2.fromOffset(0, 43), Size = UDim2.fromOffset(0, 18), AutomaticSize = Enum.AutomaticSize.X, BackgroundColor3 = Library.Rarities.Default, BackgroundTransparency = 0.85, Parent = Info }) Corner(RarityPill, 9) local RarityLabel = Create("TextLabel", { Size = UDim2.new(0, 0, 1, 0), AutomaticSize = Enum.AutomaticSize.X, TextSize = 11, Parent = RarityPill }) Padding(RarityLabel, 0, 0, 8, 8) local BannerButtons = Create("Frame", { AnchorPoint = Vector2.new(0, 1), Position = UDim2.fromScale(0, 1), Size = UDim2.new(1, 0, 0, 26), BackgroundTransparency = 1, Parent = Info }) local ApplyButton, ApplyLabel = SmallButton(BannerButtons, "Apply", { Size = UDim2.new(0.5, -3, 1, 0) }) local CustomizeButton = SmallButton(BannerButtons, "Customize", { Position = UDim2.new(0.5, 3, 0, 0), Size = UDim2.new(0.5, -3, 1, 0) }) local _, SkinBody = Scroll(Gallery, UDim2.fromOffset(0, 142), UDim2.new(1, 0, 1, -142)) local SkinGrid = Create("Frame", { Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y, BackgroundTransparency = 1, Parent = SkinBody }) EqualGrid(SkinGrid, 3, 114) local Dim = Create("TextButton", { Size = UDim2.fromScale(1, 1), BackgroundColor3 = Color3.new(0, 0, 0), BackgroundTransparency = 1, Visible = false, ZIndex = 20, Parent = Page }) local Popup = Create("CanvasGroup", { Active = true, AnchorPoint = Vector2.new(0.5, 0.5), Position = UDim2.fromScale(0.5, 0.5), Size = UDim2.fromOffset(300, 0), AutomaticSize = Enum.AutomaticSize.Y, Theme = { BackgroundColor3 = "Popup" }, GroupTransparency = 1, Visible = false, ZIndex = 21, Parent = Page }) Corner(Popup, 8) Stroke(Popup, "Outline") local PopupItems = Create("Frame", { Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y, BackgroundTransparency = 1, Parent = Popup }) Padding(PopupItems, 12, 12, 12, 12) ListLayout(PopupItems, 8) local PopupTitle = Create("TextLabel", { Size = UDim2.new(1, 0, 0, 18), Text = "Customize", TextSize = 14, TextXAlignment = Enum.TextXAlignment.Left, LayoutOrder = 0, Theme = { TextColor3 = "Text" }, Parent = PopupItems }) local PopupBody = Create("Frame", { Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y, BackgroundTransparency = 1, LayoutOrder = 1, Parent = PopupItems }) local Done = Create("Frame", { Size = UDim2.new(1, 0, 0, 28), BackgroundTransparency = 1, LayoutOrder = 2, Parent = PopupItems }) ListLayout(Done, 0) local DoneContainer = NewContainer(Done, { Path = "" }) DoneContainer.NoIndex = true DoneContainer:AddButton({ Text = "Done", Callback = function() Self:ClosePopup() end }) Self.Parts = { Page = Page, Crumbs = Crumbs, Counter = Counter, SearchFrame = SearchFrame, SearchBox = SearchBox, NoResults = NoResults, Main = Main, MainGrid = MainGrid, Picker = Picker, PickerBody = PickerBody, Gallery = Gallery, Base = Base, StageGlow = StageGlow, Preview = Preview, SkinName = SkinName, WeaponName = WeaponName, RarityPill = RarityPill, RarityLabel = RarityLabel, ApplyLabel = ApplyLabel, SkinGrid = SkinGrid, Dim = Dim, Popup = Popup, PopupTitle = PopupTitle, PopupBody = PopupBody, } Self.View = nil Connect(CreateCard.MouseButton1Click, function() Self:ShowView("Picker") end) Connect(ApplyButton.MouseButton1Click, function() Self:Apply() end) Connect(CustomizeButton.MouseButton1Click, function() Self:OpenPopup() end) Connect(Dim.MouseButton1Click, function() Self:ClosePopup() end) Connect(SearchBox:GetPropertyChangedSignal("Text"), function() Self:_Filter(SearchBox.Text) end) Library:AddConfigExtra(function() local Out = {} for Name, Entry in Self.Saved do table.insert(Out, { Weapon = Name, Skin = Entry.Skin and Entry.Skin.Name, Settings = Entry.Settings, Pinned = Entry.Pinned }) end return "__Skins", Out end, function(Data) if type(Data.__Skins) ~= "table" then return end Self:ClearSkins() for _, Saved in Data.__Skins do local Weapon = Self.Weapons[Saved.Weapon] if Weapon then Self:SetSkin(Weapon, Weapon:GetSkin(Saved.Skin), Saved.Settings, Saved.Pinned) end end end) Self:ShowView("Main", true) return Self end function SkinChanger:_SetCrumbs(List) local Crumbs = self.Parts.Crumbs for _, Child in Crumbs:GetChildren() do if Child:GetAttribute("Crumb") then Child:Destroy() end end for Index, Entry in List do if type(Entry) == "string" then Entry = { Entry } end local Last = Index == #List if Index > 1 then local Slash = Create("TextLabel", { Size = UDim2.fromOffset(0, 22), AutomaticSize = Enum.AutomaticSize.X, Text = "/", LayoutOrder = Index * 2 - 1, Theme = { TextColor3 = "Outline" }, Parent = Crumbs }) Slash:SetAttribute("Crumb", true) end local Button = Create("TextButton", { Size = UDim2.fromOffset(0, 22), AutomaticSize = Enum.AutomaticSize.X, BackgroundTransparency = 1, Text = Entry[1], LayoutOrder = Index * 2, Theme = { TextColor3 = Last and "Text" or "Inactive Text" }, Parent = Crumbs }) Button:SetAttribute("Crumb", true) if not Last and Entry[2] then Connect(Button.MouseEnter, function() ThemeTween(Button, "TextColor3", "Text", 0.12) end) Connect(Button.MouseLeave, function() ThemeTween(Button, "TextColor3", "Inactive Text", 0.12) end) Connect(Button.MouseButton1Click, Entry[2]) end end end function SkinChanger:_Count() local Count = 0 for _ in self.Saved do Count += 1 end return Count end function SkinChanger:ShowView(View, Instant) local Parts = self.Parts local Previous = self.View self.View = View local Views = { Main = Parts.Main, Picker = Parts.Picker, Gallery = Parts.Gallery } for Name, Frame in Views do if Name == View then Frame.Visible = true Frame.ZIndex = 2 Frame.Position = Parts.Base + UDim2.fromOffset(0, (Instant or Previous == View) and 0 or 10) Tween(Frame, { Position = Parts.Base }, Instant and 0 or 0.3, Enum.EasingStyle.Quad) Tween(Frame, { GroupTransparency = 0 }, Instant and 0 or 0.15, Enum.EasingStyle.Quad) elseif Frame.Visible then Frame.ZIndex = 1 Tween(Frame, { Position = Parts.Base - UDim2.fromOffset(0, 10) }, Instant and 0 or 0.3, Enum.EasingStyle.Quad) Tween(Frame, { GroupTransparency = 1 }, Instant and 0 or 0.2, Enum.EasingStyle.Quad).Completed:Connect(function() if self.View ~= Name then Frame.Visible = false end end) end end Parts.SearchFrame.Visible = View == "Picker" Parts.Counter.Visible = View ~= "Picker" if View == "Main" then self.EditingSaved = false self:_SetCrumbs({ "Skins" }) local Count = self:_Count() Library:SetText(Parts.Counter, Count == 1 and "1 saved skin" or (Count .. " saved skins")) elseif View == "Picker" then self.EditingSaved = false Parts.SearchBox.Text = "" self:_SetCrumbs({ { "Skins", function() self:ShowView("Main") end }, "Choose a weapon" }) end end function SkinChanger:_Filter(Query) Query = Query:lower() local Any = false for _, Category in self.Categories do local Shown = 0 for _, Weapon in Category.Weapons do local Match = Query == "" or Weapon.Name:lower():find(Query, 1, true) ~= nil Weapon.Tile.Card.Visible = Match if Match then Shown += 1 end end Category.Holder.Visible = Shown > 0 Any = Any or Shown > 0 end self.Parts.NoResults.Visible = not Any end function SkinChanger:AddCategory(Config) if type(Config) == "string" then Config = { Name = Config } end Config = Config or {} self.Counter += 1 local Holder = Create("Frame", { Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y, BackgroundTransparency = 1, LayoutOrder = self.Counter, Parent = self.Parts.PickerBody }) ListLayout(Holder, 8) Create("TextLabel", { Size = UDim2.new(1, 0, 0, 14), Text = Config.Name or "Category", TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Inactive Text" }, LayoutOrder = 0, Parent = Holder }) local GridHolder = Create("Frame", { Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y, BackgroundTransparency = 1, LayoutOrder = 1, Parent = Holder }) EqualGrid(GridHolder, 4, 104) local Category = setmetatable({ Name = Config.Name, SkinChanger = self, Holder = Holder, Grid = GridHolder, Weapons = {}, Counter = 0 }, SkinCategory) table.insert(self.Categories, Category) return Category end function SkinCategory:AddWeapon(Config) Config = Config or {} self.Counter += 1 local Changer = self.SkinChanger local Weapon = setmetatable({ Name = Config.Name or "Weapon", Icon = Config.Icon, Category = self, SkinChanger = Changer, Skins = { { Name = "Default", Rarity = "Default" } }, Elements = {}, }, SkinWeapon) for _, Skin in Config.Skins or {} do table.insert(Weapon.Skins, Skin) end local Count = #Weapon.Skins - 1 local Tile = SkinCard(self.Grid, { Title = Weapon.Name, Subtitle = Count == 1 and "1 skin" or (Count .. " skins"), Image = Weapon.Icon, StageHeight = 56, ImageInset = 6, Order = self.Counter }) Weapon.Tile = Tile Connect(Tile.Card.MouseButton1Click, function() Changer:OpenWeapon(Weapon) end) local Body = Create("Frame", { Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y, BackgroundTransparency = 1, Visible = false, Parent = Changer.Parts.PopupBody }) local _, Items = SectionBox(Body, { Path = "Skins / " .. Weapon.Name }) Items.NoIndex = true Weapon.Body = Body local Before = {} for Flag in Library.Elements do Before[Flag] = true end SafeCall(Config.Elements or Config.Settings, Items, Weapon) for Flag, Element in Library.Elements do if not Before[Flag] then Weapon.Elements[Flag] = Element Element.NoSave = true end end Changer.Weapons[Weapon.Name] = Weapon table.insert(self.Weapons, Weapon) return Weapon end function SkinWeapon:GetSkin(Name) for _, Skin in self.Skins do if Skin.Name == Name then return Skin end end return self.Skins[1] end function SkinWeapon:ReadSettings() local Settings = {} for Flag, Element in self.Elements do local Ok, Value = pcall(Element.Serialize, Element) if Ok then Settings[Flag] = Value end end return Settings end function SkinWeapon:WriteSettings(Settings) for Flag, Value in Settings or {} do local Element = self.Elements[Flag] if Element then pcall(Element.Deserialize, Element, Value) end end end local function SkinImage(Weapon, Skin) return Skin.Image or Weapon.Icon, Skin.Image and Color3.new(1, 1, 1) or (Skin.Color or Color3.new(1, 1, 1)) end function SkinChanger:OpenWeapon(Weapon, FromSaved) local Parts = self.Parts self.Weapon = Weapon for _, Child in Parts.SkinGrid:GetChildren() do if Child:IsA("GuiObject") then Child:Destroy() end end self.SkinCards = {} local Saved = self.Saved[Weapon.Name] for Index, Skin in Weapon.Skins do local Image, Color = SkinImage(Weapon, Skin) local Card = SkinCard(Parts.SkinGrid, { Title = Skin.Name, Subtitle = Skin.Rarity or "Default", Image = Image, ImageColor = Color, Rarity = Skin.Rarity or "Default", StageHeight = 60, Order = Index }) self.SkinCards[Skin] = Card Connect(Card.Card.MouseButton1Click, function() self:SelectSkin(Skin) end) end if Saved then Weapon:WriteSettings(Saved.Settings) end self:ShowView("Gallery") self.EditingSaved = FromSaved == true local Count = #Weapon.Skins Library:SetText(Parts.Counter, Count == 1 and "1 skin" or (Count .. " skins")) local Crumbs = { { "Skins", function() self:ShowView("Main") end } } if not self.EditingSaved then table.insert(Crumbs, { Weapon.Category.Name or "Weapons", function() self:ShowView("Picker") end }) end table.insert(Crumbs, Weapon.Name) self:_SetCrumbs(Crumbs) self:SelectSkin(Saved and Saved.Skin or Weapon.Skins[math.min(2, #Weapon.Skins)]) end function SkinChanger:SelectSkin(Skin) local Parts, Weapon = self.Parts, self.Weapon if not Weapon or not Skin then return end self.SelectedSkin = Skin for Other, Card in self.SkinCards do Card:SetSelected(Other == Skin) end local Image, Color = SkinImage(Weapon, Skin) local Rarity = RarityColor(Skin.Rarity) SetIcon(Parts.Preview, Image) Parts.Preview.ImageColor3 = Color Parts.Preview.Position = UDim2.fromScale(0.5, 0.56) Parts.Preview.ImageTransparency = 0.6 Tween(Parts.Preview, { Position = UDim2.fromScale(0.5, 0.5), ImageTransparency = 0 }, 0.25) Library:SetText(Parts.SkinName, Skin.Name) Library:SetText(Parts.WeaponName, Weapon.Name .. " · " .. (Weapon.Category.Name or "")) Library:SetText(Parts.RarityLabel, Skin.Rarity or "Default") Parts.RarityLabel.TextColor3 = Rarity Tween(Parts.RarityPill, { BackgroundColor3 = Rarity }, 0.25) Tween(Parts.StageGlow, { BackgroundColor3 = Rarity }, 0.25) local Saved = self.Saved[Weapon.Name] local Applied = Saved and Saved.Skin == Skin Library:SetText(Parts.ApplyLabel, Applied and "Applied" or "Apply") ThemeTween(Parts.ApplyLabel, "TextColor3", Applied and "Accent" or "Text", 0.15) end function SkinChanger:Apply() local Weapon, Skin = self.Weapon, self.SelectedSkin if not Weapon or not Skin then return end self:SetSkin(Weapon, Skin, Weapon:ReadSettings()) Library:Notify("Applied " .. Skin.Name .. " to " .. Weapon.Name .. ".") self:ShowView("Main") end function SkinChanger:SetSkin(Weapon, Skin, Settings, Pinned) if type(Weapon) == "string" then Weapon = self.Weapons[Weapon] end if not Weapon then return end if type(Skin) == "string" then Skin = Weapon:GetSkin(Skin) end local Entry = self.Saved[Weapon.Name] if not Entry then Entry = { Weapon = Weapon, Pinned = false } self.Saved[Weapon.Name] = Entry local Card = SkinCard(self.Parts.MainGrid, { Title = Weapon.Name, Image = Weapon.Icon }) Entry.Card = Card local Trash = CornerIcon(Card, "Trash", UDim2.fromOffset(2, 2), Vector2.new(0, 0)) local Pin, PinImage = CornerIcon(Card, "Lock", UDim2.new(1, -2, 0, 2), Vector2.new(1, 0)) Entry.PinImage, Entry.PinButton = PinImage, Pin Connect(Trash.MouseButton1Click, function() self:RemoveSkin(Weapon.Name) end) Connect(Pin.MouseButton1Click, function() Entry.Pinned = not Entry.Pinned self:_DrawEntry(Entry) end) Connect(Card.Card.MouseButton1Click, function() self:OpenWeapon(Weapon, true) end) end Entry.Skin, Entry.Settings = Skin or Weapon.Skins[1], Settings or {} if Pinned ~= nil then Entry.Pinned = Pinned end self:_DrawEntry(Entry) if self.View == "Main" then self:ShowView("Main", true) end self:_Fire("Changed", Entry) return Entry end function SkinChanger:_DrawEntry(Entry) local Card, Skin = Entry.Card, Entry.Skin local Image, Color = SkinImage(Entry.Weapon, Skin) SetIcon(Card.Image, Image) Card.Image.ImageColor3 = Color Library:SetText(Card.Subtitle, Skin.Name) Card:SetRarity(Skin.Rarity or "Default") Card.Card.LayoutOrder = Entry.Pinned and -100 or 0 Entry.PinButton:SetAttribute("On", Entry.Pinned) ThemeTween(Entry.PinImage, "ImageColor3", Entry.Pinned and "Accent" or "Inactive Text", 0.15) Tween(Entry.PinImage, { ImageTransparency = Entry.Pinned and 0 or 0.5 }, 0.15) end function SkinChanger:RemoveSkin(Name) local Entry = self.Saved[Name] if not Entry then return end self.Saved[Name] = nil Entry.Card.Card:Destroy() if self.View == "Main" then self:ShowView("Main", true) end self:_Fire("Removed", Entry) end function SkinChanger:ClearSkins() for Name in table.clone(self.Saved) do self:RemoveSkin(Name) end end function SkinChanger:GetSkin(Name) return self.Saved[Name] end function SkinChanger:GetAllWeapons() local Out = {} for _, Category in self.Categories do for _, Weapon in Category.Weapons do table.insert(Out, Weapon) end end return Out end function SkinChanger:OpenPopup() local Parts, Weapon = self.Parts, self.Weapon if not Weapon then return end for _, Other in self.Weapons do Other.Body.Visible = Other == Weapon end Library:SetText(Parts.PopupTitle, "Customize " .. Weapon.Name) Parts.Dim.Visible = true Parts.Popup.Visible = true Tween(Parts.Dim, { BackgroundTransparency = 0.45 }, 0.18) Parts.Popup.Position = UDim2.new(0.5, 0, 0.5, 8) Tween(Parts.Popup, { GroupTransparency = 0, Position = UDim2.fromScale(0.5, 0.5) }, 0.2) end function SkinChanger:ClosePopup() local Parts = self.Parts Library:CloseAllPopups() Tween(Parts.Dim, { BackgroundTransparency = 1 }, 0.15) Tween(Parts.Popup, { GroupTransparency = 1 }, 0.15).Completed:Connect(function() if Parts.Popup.GroupTransparency > 0.99 then Parts.Dim.Visible = false Parts.Popup.Visible = false end end) end function SkinChanger:OnChanged(Callback) table.insert(self.Callbacks, Callback) end function SkinChanger:_Fire(Action, Entry) for _, Callback in self.Callbacks do SafeCall(Callback, Action, Entry) end end end do local Preview = {} Preview.__index = Preview Library.Classes.Preview = Preview local function DummyCharacter() local Model = Instance.new("Model") Model.Name = "Dummy" local function Part(Name, Size, CF, Color) local P = Instance.new("Part") P.Name, P.Size, P.CFrame, P.Color = Name, Size, CF, Color P.Anchored, P.CanCollide = true, false P.TopSurface, P.BottomSurface = Enum.SurfaceType.Smooth, Enum.SurfaceType.Smooth P.Parent = Model return P end local Skin, Shirt, Pants = Rgb(234, 184, 146), Rgb(52, 92, 156), Rgb(40, 44, 52) local Root = Part("HumanoidRootPart", Vector3.new(2, 2, 1), CFrame.new(0, 3, 0), Shirt) Root.Transparency = 1 Part("Torso", Vector3.new(2, 2, 1), CFrame.new(0, 3, 0), Shirt) local Head = Part("Head", Vector3.new(1.2, 1.2, 1.2), CFrame.new(0, 4.6, 0), Skin) local Mesh = Instance.new("SpecialMesh") Mesh.MeshType = Enum.MeshType.Head Mesh.Scale = Vector3.new(1.25, 1.25, 1.25) Mesh.Parent = Head Part("Left Arm", Vector3.new(1, 2, 1), CFrame.new(-1.5, 3, 0), Skin) Part("Right Arm", Vector3.new(1, 2, 1), CFrame.new(1.5, 3, 0), Skin) Part("Left Leg", Vector3.new(1, 2, 1), CFrame.new(-0.5, 1, 0), Pants) Part("Right Leg", Vector3.new(1, 2, 1), CFrame.new(0.5, 1, 0), Pants) Model.PrimaryPart = Root return Model end local function CloneCharacter() local Character = LocalPlayer and LocalPlayer.Character if not Character then return nil end local Old = Character.Archivable Character.Archivable = true local Ok, Clone = pcall(Character.Clone, Character) Character.Archivable = Old if not Ok or not Clone then return nil end for _, Child in Clone:GetDescendants() do if Child:IsA("LuaSourceContainer") or Child:IsA("Sound") or Child:IsA("ForceField") then Child:Destroy() elseif Child:IsA("BasePart") then Child.Anchored = true end end local Humanoid = Clone:FindFirstChildOfClass("Humanoid") if Humanoid then Humanoid.DisplayDistanceType = Enum.HumanoidDisplayDistanceType.None end return Clone end local PREVIEW_ZOOM = 1.8 local PreviewWhite, PreviewBlack = Color3.new(1, 1, 1), Color3.new(0, 0, 0) local R15Bones = { { "Head", "UpperTorso" }, { "UpperTorso", "LowerTorso" }, { "UpperTorso", "LeftUpperArm" }, { "LeftUpperArm", "LeftLowerArm" }, { "LeftLowerArm", "LeftHand" }, { "UpperTorso", "RightUpperArm" }, { "RightUpperArm", "RightLowerArm" }, { "RightLowerArm", "RightHand" }, { "LowerTorso", "LeftUpperLeg" }, { "LeftUpperLeg", "LeftLowerLeg" }, { "LeftLowerLeg", "LeftFoot" }, { "LowerTorso", "RightUpperLeg" }, { "RightUpperLeg", "RightLowerLeg" }, { "RightLowerLeg", "RightFoot" }, } local R6Bones = { { "Head", "Torso" }, { "Torso", "Left Arm" }, { "Torso", "Right Arm" }, { "Torso", "Left Leg" }, { "Torso", "Right Leg" } } local function PreviewNumber(State, Key, Default, Minimum, Maximum) local Value = tonumber(State[Key]) if not Value or Value ~= Value or math.abs(Value) == math.huge then Value = Default end return math.clamp(Value, Minimum, Maximum) end local function PreviewAlpha(State, Key) return PreviewNumber(State, Key, 0, 0, 1) end local function PreviewGradient(Object, Enabled, First, Last, Rotation, FirstTransparency, LastTransparency) Object.Enabled = Enabled == true Object.Color = ColorSequence.new(First or PreviewWhite, Last or PreviewWhite) Object.Transparency = NumberSequence.new(FirstTransparency or 0, LastTransparency or 0) Object.Rotation = Rotation or 0 end local function PreviewProject(Camera, Size, Position) local Point = Camera.CFrame:PointToObjectSpace(Position) local Depth = -Point.Z if Depth <= 0.05 then return nil end local Scale = Size.Y * 0.5 / math.tan(math.rad(Camera.FieldOfView * 0.5)) return Vector2.new(Size.X * 0.5 + Point.X * Scale / Depth, Size.Y * 0.5 - Point.Y * Scale / Depth) end local function PreviewLine(Object, First, Last, Thickness) local Delta = Last - First Object.AnchorPoint = Vector2.new(0.5, 0.5) Object.Position = UDim2.fromOffset((First.X + Last.X) * 0.5, (First.Y + Last.Y) * 0.5) Object.Size = UDim2.fromOffset(Delta.Magnitude, Thickness) Object.Rotation = math.deg(math.atan2(Delta.Y, Delta.X)) Object.Visible = true end local function PreviewChamsModel(Model, Parent) local Okay, Clone = pcall(Model.Clone, Model) if not Okay or not Clone then return nil, {} end local Parts = {} for _, Object in Clone:GetDescendants() do if Object:IsA("BasePart") then Object.Material = Enum.Material.Neon if Object:IsA("MeshPart") then Object.TextureID = "" end table.insert(Parts, { Object, Object.Transparency }) elseif Object:IsA("SpecialMesh") then Object.TextureId = "" elseif Object:IsA("Decal") or Object:IsA("Texture") or Object:IsA("SurfaceAppearance") or Object:IsA("Clothing") or Object:IsA("ShirtGraphic") then Object:Destroy() end end Clone.Parent = Parent return Clone, Parts end function Window:AddPreview(Config) Config = Config or {} local Window_ = self local Self = setmetatable({ Window = self, Tab = Config.Tab, State = { Box = true, BoxStyle = "Corner", BoxColor = PreviewWhite, BoxThickness = 1, CornerLength = 0.25, Fill = false, FillColor = Theme.Accent, FillTransparency = 0.7, Name = true, NameColor = PreviewWhite, HealthBar = true, Health = 0.82, HealthWidth = 4, Distance = true, Weapon = true, ArmorValue = 0.65, Ammo = 18, AmmoCapacity = 30, WeaponName = "AK-47", Chams = false, ChamsColor = Theme.Accent, ChamsOpacity = 0.35, TextSize = 11, Font = "Pixel", }, Angle = 0.6, Visible = true, }, Preview) Library.Preview = Self self.PreviewOffset = Vector2.new(10, 0) local PanelFrame = Create("CanvasGroup", { Name = "Preview", Size = UDim2.fromOffset(Config.Width or 220, self.Holder.Size.Y.Offset), Theme = { BackgroundColor3 = "Background" }, Parent = Library.MenuGui }) Layout.Register(self.LayoutKey .. "/Preview", function() local Viewport = Layout.Viewport(PanelFrame) return Viewport and { Kind = "Offset", X = Window_.PreviewOffset.X / Viewport.X, Y = Window_.PreviewOffset.Y / Viewport.Y } end, function(Value) local Viewport = Layout.Viewport(PanelFrame) if Value.Kind == "Offset" and Viewport then Window_.PreviewOffset = Vector2.new(Value.X * Viewport.X, Value.Y * Viewport.Y) end end) Corner(PanelFrame, 8) local PanelOutline = Create("Frame", { Size = UDim2.fromScale(1, 1), BackgroundTransparency = 1, ZIndex = 50, Parent = PanelFrame }) Corner(PanelOutline, 8) Stroke(PanelOutline, "Outline") local Header = Create("Frame", { Size = UDim2.new(1, 0, 0, 40), Theme = { BackgroundColor3 = "Inline" }, Active = true, Parent = PanelFrame }) Create("Frame", { Position = UDim2.new(0, 0, 1, 0), Size = UDim2.new(1, 0, 0, 1), Theme = { BackgroundColor3 = "Outline" }, Parent = Header }) local HeaderIcon = Create("ImageLabel", { AnchorPoint = Vector2.new(0, 0.5), Position = UDim2.new(0, 14, 0.5, 0), Size = UDim2.fromOffset(15, 15), Theme = { ImageColor3 = "Inactive Text" }, Parent = Header }) SetIcon(HeaderIcon, "Eye") Create("TextLabel", { Position = UDim2.fromOffset(36, 0), Size = UDim2.new(1, -40, 1, 0), Text = Config.Title or "ESP Preview", TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Text" }, Parent = Header }) local Stage = Create("Frame", { Position = UDim2.fromOffset(10, 50), Size = UDim2.new(1, -20, 1, -60), Theme = { BackgroundColor3 = "Tab" }, Active = true, ClipsDescendants = true, Parent = PanelFrame }) Corner(Stage, 6) Stroke(Stage, "Outline") local function ModelViewport(ZIndex) local Frame = Create("ViewportFrame", { Size = UDim2.fromScale(1, 1), BackgroundTransparency = 1, Ambient = Rgb(170, 170, 170), LightColor = PreviewWhite, LightDirection = Vector3.new(-1, -1, -1), ZIndex = ZIndex, Parent = Stage }) local ModelWorld = Instance.new("WorldModel") ModelWorld.Parent = Frame return Frame, ModelWorld end local ChamsOutlineViewport, ChamsOutlineWorld = ModelViewport(1) ChamsOutlineViewport.Position = UDim2.fromOffset(-1.5, -1.5) ChamsOutlineViewport.Size = UDim2.new(1, 3, 1, 3) local Viewport, World = ModelViewport(2) local ChamsViewport, ChamsWorld = ModelViewport(3) local Camera = Instance.new("Camera") Camera.FieldOfView = 40 Camera.Parent = Viewport Viewport.CurrentCamera, ChamsViewport.CurrentCamera, ChamsOutlineViewport.CurrentCamera = Camera, Camera, Camera Create("TextLabel", { AnchorPoint = Vector2.new(0.5, 1), Position = UDim2.new(0.5, 0, 1, -6), Size = UDim2.new(1, 0, 0, 12), Text = "drag to rotate", TextSize = 10, Theme = { TextColor3 = "Inactive Text" }, ZIndex = 8, Parent = Stage }) local Overlay = Create("Frame", { Size = UDim2.fromScale(1, 1), BackgroundTransparency = 1, ZIndex = 4, Parent = Stage }) local BoxFrame = Create("Frame", { BackgroundTransparency = 1, ZIndex = 5, Parent = Overlay }) local Glow = Create("ImageLabel", { AnchorPoint = Vector2.new(0.5, 0.5), Position = UDim2.fromScale(0.5, 0.5), BackgroundTransparency = 1, Image = "rbxassetid://5028857084", ScaleType = Enum.ScaleType.Slice, SliceCenter = Rect.new(24, 24, 276, 276), ZIndex = 4, Parent = BoxFrame }) local GlowGradient = Create("UIGradient", { Parent = Glow }) local FillFrame = Create("Frame", { Size = UDim2.fromScale(1, 1), BackgroundTransparency = 1, ZIndex = 5, Parent = BoxFrame }) local FillGradient = Create("UIGradient", { Parent = FillFrame }) local OutlineFrame = Create("Frame", { Size = UDim2.fromScale(1, 1), BackgroundTransparency = 1, ZIndex = 6, Parent = BoxFrame }) local FullOutline = Create("UIStroke", { ApplyStrokeMode = Enum.ApplyStrokeMode.Border, Color = PreviewBlack, Parent = OutlineFrame }) local BorderFrame = Create("Frame", { Size = UDim2.fromScale(1, 1), BackgroundTransparency = 1, ZIndex = 7, Parent = BoxFrame }) local FullStroke = Create("UIStroke", { ApplyStrokeMode = Enum.ApplyStrokeMode.Border, Thickness = 1, Parent = BorderFrame }) local StrokeGradient = Create("UIGradient", { Parent = FullStroke }) local Corners, CornerOutlines, CornerGradients = {}, {}, {} for Index = 1, 8 do Corners[Index] = Create("Frame", { AnchorPoint = Vector2.new(0, 0.5), ZIndex = 7, Parent = BoxFrame }) CornerOutlines[Index] = Create("Frame", { AnchorPoint = Vector2.new(0, 0.5), ZIndex = 6, Parent = BoxFrame }) CornerGradients[Index] = Create("UIGradient", { Parent = Corners[Index] }) end local function Bar(Anchor, Position) local Back = Create("Frame", { AnchorPoint = Anchor, Position = Position, BackgroundColor3 = PreviewBlack, BackgroundTransparency = 0.3, ZIndex = 7, Parent = BoxFrame }) local Fill = Create("Frame", { AnchorPoint = Vector2.new(0, 1), Position = UDim2.fromScale(0, 1), BackgroundColor3 = PreviewWhite, ZIndex = 8, Parent = Back }) return Back, Fill end local HealthBack, HealthFill = Bar(Vector2.new(1, 0), UDim2.new(0, -4, 0, 0)) local HealthGradient = Create("UIGradient", { Rotation = 90, Parent = HealthFill }) local ArmorBack, ArmorFill = Bar(Vector2.new(0, 0), UDim2.new(1, 4, 0, 0)) local AmmoBack, AmmoFill = Bar(Vector2.new(0, 0), UDim2.new(0, 0, 1, 2)) local function OverlayText(Anchor, Position, Text) local Label = Create("TextLabel", { AnchorPoint = Anchor, Position = Position, Size = UDim2.fromOffset(160, 14), Text = Text, NoCase = true, TextSize = 11, TextColor3 = PreviewWhite, ZIndex = 9, Parent = BoxFrame }) Fonts.Registry[Label] = nil return Label end local NameLabel = OverlayText(Vector2.new(0.5, 1), UDim2.new(0.5, 0, 0, -3), LocalPlayer and LocalPlayer.DisplayName or "Player") local DistanceLabel = OverlayText(Vector2.new(0.5, 0), UDim2.new(0.5, 0, 1, 3), "24st") local WeaponLabel = OverlayText(Vector2.new(0.5, 0), UDim2.new(0.5, 0, 1, 16), "") local HealthText = OverlayText(Vector2.new(1, 0.5), UDim2.new(0, -10, 0.18, 0), "82") local AmmoText = OverlayText(Vector2.new(0, 1), UDim2.new(1, 8, 1, 0), "18") AmmoText.TextXAlignment = Enum.TextXAlignment.Left local FlagsLabel = OverlayText(Vector2.new(0, 0), UDim2.new(1, 8, 0, 0), "KIT\nBOMB\nZOOM") FlagsLabel.TextXAlignment, FlagsLabel.TextYAlignment = Enum.TextXAlignment.Left, Enum.TextYAlignment.Top local Icon = Create("ImageLabel", { AnchorPoint = Vector2.new(0.5, 0), BackgroundTransparency = 1, ScaleType = Enum.ScaleType.Fit, ZIndex = 9, Parent = BoxFrame }) local Head = Create("Frame", { AnchorPoint = Vector2.new(0.5, 0.5), ZIndex = 8, Parent = Overlay }) Corner(Head, 100) local SkeletonLines, SkeletonOutlines = {}, {} for Index = 1, #R15Bones do SkeletonLines[Index] = Create("Frame", { AnchorPoint = Vector2.new(0, 0.5), ZIndex = 8, Parent = Overlay }) SkeletonOutlines[Index] = Create("Frame", { AnchorPoint = Vector2.new(0, 0.5), ZIndex = 7, Parent = Overlay }) end Self.Parts = { Panel = PanelFrame, Stage = Stage, Viewport = Viewport, Camera = Camera, World = World, Overlay = Overlay, Box = BoxFrame, Fill = FillFrame, FillGradient = FillGradient, FullStroke = FullStroke, FullOutline = FullOutline, StrokeGradient = StrokeGradient, Corners = Corners, CornerOutlines = CornerOutlines, CornerGradients = CornerGradients, Glow = Glow, GlowGradient = GlowGradient, HealthBack = HealthBack, HealthFill = HealthFill, HealthGradient = HealthGradient, HealthText = HealthText, ArmorBack = ArmorBack, ArmorFill = ArmorFill, AmmoBack = AmmoBack, AmmoFill = AmmoFill, AmmoText = AmmoText, Name = NameLabel, Distance = DistanceLabel, Weapon = WeaponLabel, Flags = FlagsLabel, Icon = Icon, Head = Head, SkeletonLines = SkeletonLines, SkeletonOutlines = SkeletonOutlines, ChamsViewport = ChamsViewport, ChamsWorld = ChamsWorld, ChamsOutlineViewport = ChamsOutlineViewport, ChamsOutlineWorld = ChamsOutlineWorld, } Self.Labels = { { NameLabel, "Name" }, { DistanceLabel, "Distance" }, { WeaponLabel, "Weapon" }, { FlagsLabel, "Flags" }, { HealthText, "HealthText" }, { AmmoText, "Ammo" } } function Self:LoadModel() if Library.Unloaded or not World.Parent or not PanelFrame.Parent then return end if self.Model then self.Model:Destroy() end if self.ChamsModel then self.ChamsModel:Destroy() end if self.ChamsOutlineModel then self.ChamsOutlineModel:Destroy() end local Model = CloneCharacter() or DummyCharacter() Model.Parent = World self.Model = Model self.OriginalColors, self.ModelParts, self.Bones = {}, {}, {} for _, Part in Model:GetDescendants() do if Part:IsA("BasePart") then self.OriginalColors[Part] = { Part.Color, Part.Material, Part.Transparency } if Part.Transparency < 1 and Part.Name ~= "HumanoidRootPart" and Part.Name ~= "CollisionBox" then table.insert(self.ModelParts, Part) end end end self.Head = Model:FindFirstChild("Head", true) if self.Head and not self.Head:IsA("BasePart") then self.Head = nil end for _, Pair in Model:FindFirstChild("UpperTorso", true) and R15Bones or R6Bones do local First, Last = Model:FindFirstChild(Pair[1], true), Model:FindFirstChild(Pair[2], true) if First and Last and First:IsA("BasePart") and Last:IsA("BasePart") then table.insert(self.Bones, { First, Last }) end end local CF, Size = Model:GetBoundingBox() self.ModelCenter, self.ModelSize = CF.Position, Size self.ChamsModel, self.ChamsParts = PreviewChamsModel(Model, ChamsWorld) self.ChamsOutlineModel, self.ChamsOutlineParts = PreviewChamsModel(Model, ChamsOutlineWorld) self:Update() end local Dragging, DragStart, PanelStart Connect(Header.InputBegan, function(Input) if Input.UserInputType == Enum.UserInputType.MouseButton1 or Input.UserInputType == Enum.UserInputType.Touch then Dragging, DragStart, PanelStart = true, MousePosition(), Window_.PreviewOffset end end) Connect(UserInputService.InputChanged, function(Input) if Dragging and (Input.UserInputType == Enum.UserInputType.MouseMovement or Input.UserInputType == Enum.UserInputType.Touch) then Window_.PreviewOffset = PanelStart + (MousePosition() - DragStart) end end) Connect(UserInputService.InputEnded, function(Input) if Input.UserInputType == Enum.UserInputType.MouseButton1 or Input.UserInputType == Enum.UserInputType.Touch then if Dragging then Library:SaveLayout() end Dragging = false end end) local Rotating, RotateStart, AngleStart Connect(Stage.InputBegan, function(Input) if Input.UserInputType == Enum.UserInputType.MouseButton1 then Rotating, RotateStart, AngleStart = true, MousePosition().X, Self.Angle end end) Connect(UserInputService.InputChanged, function(Input) if Rotating and Input.UserInputType == Enum.UserInputType.MouseMovement then Self.Angle = AngleStart + (MousePosition().X - RotateStart) * 0.012 end end) Connect(UserInputService.InputEnded, function(Input) if Input.UserInputType == Enum.UserInputType.MouseButton1 then Rotating = false end end) Connect(RunService.RenderStepped, function(Delta) if Library.Unloaded or not PanelFrame.Parent or not World.Parent then return end local Holder = Window_.Holder local Shown = Window_.Open and (not Self.Tab or Self.Tab.Active) and Self.Visible if Shown ~= Self._Shown then Self._Shown = Shown if Shown then PanelFrame.Visible = true end Tween(PanelFrame, { GroupTransparency = Shown and 0 or 1 }, 0.16).Completed:Connect(function() if not Self._Shown then PanelFrame.Visible = false end end) end if not PanelFrame.Visible then return end local MenuPosition = Holder.AbsolutePosition - Library.MenuGui.AbsolutePosition local Offset = Window_.PreviewOffset PanelFrame.Position = UDim2.fromOffset(MenuPosition.X + Holder.AbsoluteSize.X + Offset.X, MenuPosition.Y + Offset.Y) local Position = Layout.ReadPosition(PanelFrame) if Position then Layout.SetPosition(PanelFrame, Position) local Viewport = Layout.Viewport(PanelFrame) Window_.PreviewOffset = Vector2.new(PanelFrame.Position.X.Scale * Viewport.X - MenuPosition.X - Holder.AbsoluteSize.X, PanelFrame.Position.Y.Scale * Viewport.Y - MenuPosition.Y) end if not Rotating and Self.State.AutoRotate ~= false then Self.Angle += Delta * 0.5 end if not Shown or not Self:RefreshState() then Self:Render() end end) task.defer(function() Self:LoadModel() end) if LocalPlayer then Connect(LocalPlayer.CharacterAdded, function(Character) task.wait(1) if Library.Unloaded or LocalPlayer.Character ~= Character then return end Self:LoadModel() end) end return Self end function Preview:SetStateProvider(Callback) self.StateProvider = type(Callback) == "function" and Callback or nil return self end function Preview:RefreshState() if not self.StateProvider then return false end local Okay, Values = pcall(self.StateProvider) if not Okay or type(Values) ~= "table" then return false end for Key, Value in Values do if self.State[Key] ~= Value then self:Update(Values) return true end end return false end function Preview:Update(State) if State then for Key, Value in State do self.State[Key] = Value end end local S, P = self.State, self.Parts local CornerStyle = S.BoxStyle == "Corner" local BoxGradient, FillGradient, GlowGradient = S.BoxGradient == true, S.FillGradient == true, S.GlowGradient == true P.FullStroke.Enabled = S.Box == true and not CornerStyle P.FullStroke.Color = BoxGradient and PreviewWhite or S.BoxColor or PreviewWhite P.FullStroke.Thickness = PreviewNumber(S, "BoxThickness", 1, 1, 10) P.FullStroke.Transparency = BoxGradient and 0 or PreviewAlpha(S, "BoxTransparency") P.FullOutline.Enabled = P.FullStroke.Enabled and S.BoxOutline == true P.FullOutline.Color = S.BoxOutlineColor or PreviewBlack P.FullOutline.Thickness = PreviewNumber(S, "BoxOutlineThickness", 3, 1, 12) P.FullOutline.Transparency = PreviewAlpha(S, "BoxOutlineTransparency") PreviewGradient(P.StrokeGradient, BoxGradient, S.BoxGradientStart, S.BoxGradientEnd, S.BoxGradientRotation, PreviewAlpha(S, "BoxGradientStartTransparency"), PreviewAlpha(S, "BoxGradientEndTransparency")) for Index, Line in P.Corners do Line.Visible = S.Box == true and CornerStyle Line.BackgroundColor3 = P.FullStroke.Color Line.BackgroundTransparency = P.FullStroke.Transparency local Outline = P.CornerOutlines[Index] Outline.Visible = Line.Visible and S.BoxOutline == true Outline.BackgroundColor3 = S.BoxOutlineColor or PreviewBlack Outline.BackgroundTransparency = PreviewAlpha(S, "BoxOutlineTransparency") PreviewGradient(P.CornerGradients[Index], BoxGradient, S.BoxGradientStart, S.BoxGradientEnd, S.BoxGradientRotation, PreviewAlpha(S, "BoxGradientStartTransparency"), PreviewAlpha(S, "BoxGradientEndTransparency")) end P.Fill.Visible = S.Box == true and S.Fill == true P.Fill.BackgroundTransparency = FillGradient and 0 or PreviewAlpha(S, "FillTransparency") P.Fill.BackgroundColor3 = FillGradient and PreviewWhite or S.FillColor or Theme.Accent PreviewGradient(P.FillGradient, FillGradient, S.FillGradientStart, S.FillGradientEnd, S.FillGradientRotation, PreviewAlpha(S, "FillGradientStartTransparency"), PreviewAlpha(S, "FillGradientEndTransparency")) P.Glow.Visible = S.Box == true and S.Glow == true P.Glow.ImageColor3 = GlowGradient and PreviewWhite or S.GlowColor or PreviewWhite P.Glow.ImageTransparency = 1 - (GlowGradient and 1 or 1 - PreviewAlpha(S, "GlowTransparency")) * PreviewNumber(S, "GlowOpacity", 0.2, 0, 1) local GlowSize = PreviewNumber(S, "GlowSize", 45, 0, 200) P.Glow.Size = UDim2.new(1, GlowSize, 1, GlowSize) PreviewGradient(P.GlowGradient, GlowGradient, S.GlowGradientStart, S.GlowGradientEnd, S.GlowGradientRotation, PreviewAlpha(S, "GlowGradientStartTransparency"), PreviewAlpha(S, "GlowGradientEndTransparency")) local Health = PreviewNumber(S, "Health", 0.82, 0, 1) local HealthColor = S.HealthColor or Rgb(96, 220, 120) local HealthTransparency = PreviewAlpha(S, "HealthTransparency") P.HealthGradient.Enabled = S.HealthGradient == true if P.HealthGradient.Enabled then local Low, Mid, High = S.HealthLow or Rgb(240, 84, 84), S.HealthMid or Rgb(242, 188, 72), S.HealthHigh or Rgb(96, 220, 120) local LowTransparency, MidTransparency, HighTransparency = PreviewAlpha(S, "HealthLowTransparency"), PreviewAlpha(S, "HealthMidTransparency"), PreviewAlpha(S, "HealthHighTransparency") P.HealthGradient.Color = ColorSequence.new({ ColorSequenceKeypoint.new(0, High), ColorSequenceKeypoint.new(0.5, Mid), ColorSequenceKeypoint.new(1, Low) }) P.HealthGradient.Transparency = NumberSequence.new({ NumberSequenceKeypoint.new(0, HighTransparency), NumberSequenceKeypoint.new(0.5, MidTransparency), NumberSequenceKeypoint.new(1, LowTransparency) }) HealthColor = Health < 0.5 and Low:Lerp(Mid, Health * 2) or Mid:Lerp(High, Health * 2 - 1) HealthTransparency = Health < 0.5 and LowTransparency + (MidTransparency - LowTransparency) * Health * 2 or MidTransparency + (HighTransparency - MidTransparency) * (Health * 2 - 1) end P.HealthBack.Visible = S.HealthBar == true P.HealthBack.Size = UDim2.new(0, PreviewNumber(S, "HealthWidth", 4, 1, 20), 1, 0) P.HealthFill.Size = UDim2.fromScale(1, Health) P.HealthFill.BackgroundColor3 = P.HealthGradient.Enabled and PreviewWhite or HealthColor P.HealthFill.BackgroundTransparency = P.HealthGradient.Enabled and 0 or HealthTransparency P.HealthText.Visible = P.HealthBack.Visible and S.HealthText == true P.HealthText.Text = tostring(math.floor(Health * 100 + 0.5)) P.HealthText.Position = UDim2.new(0, -PreviewNumber(S, "HealthWidth", 4, 1, 20) - 6, 1 - Health, 0) P.ArmorBack.Visible = S.Armor == true P.ArmorBack.Size = UDim2.new(0, PreviewNumber(S, "ArmorWidth", 4, 1, 20), 1, 0) P.ArmorFill.Size = UDim2.fromScale(1, PreviewNumber(S, "ArmorValue", 0.65, 0, 1)) P.ArmorFill.BackgroundColor3 = S.ArmorColor or Rgb(90, 150, 255) P.ArmorFill.BackgroundTransparency = PreviewAlpha(S, "ArmorTransparency") P.AmmoBack.Visible = S.AmmoBar == true P.AmmoBack.Size = UDim2.new(1, 0, 0, PreviewNumber(S, "AmmoBarHeight", 4, 1, 20)) local Capacity = PreviewNumber(S, "AmmoCapacity", 30, 1, 1000) local Ammo = PreviewNumber(S, "Ammo", 18, 0, Capacity) P.AmmoFill.Size = UDim2.fromScale(Ammo / Capacity, 1) P.AmmoFill.BackgroundColor3 = S.AmmoColor or PreviewWhite P.AmmoFill.BackgroundTransparency = PreviewAlpha(S, "AmmoTransparency") P.AmmoText.Visible = S.AmmoText == true P.AmmoText.Text = tostring(math.floor(Ammo)) P.AmmoText.Position = UDim2.new(1, S.Armor and PreviewNumber(S, "ArmorWidth", 4, 1, 20) + 8 or 4, 1, 0) P.Name.Visible = S.Name == true P.Name.Text = S.NameText or (LocalPlayer and LocalPlayer.DisplayName or "Player") P.Distance.Visible = S.Distance == true P.Distance.Text = S.DistanceText or "24st" P.Weapon.Visible = S.Weapon == true P.Weapon.Text = S.WeaponName or "" P.Flags.Visible = S.Flags == true and tostring(S.FlagsText or "") ~= "" P.Flags.Text = S.FlagsText or "" P.Flags.Position = UDim2.new(1, S.Armor and PreviewNumber(S, "ArmorWidth", 4, 1, 20) + 8 or 4, 0, 0) P.Icon.Visible = S.Icon == true and tostring(S.IconImage or "") ~= "" local Image = tostring(S.IconImage or "") P.Icon.Image = Image:match("^%d+$") and "rbxassetid://" .. Image or Image P.Icon.ImageColor3 = S.IconColor or PreviewWhite P.Icon.ImageTransparency = PreviewAlpha(S, "IconTransparency") P.Icon.Size = UDim2.new(1, 10, 0, PreviewNumber(S, "IconSize", 20, 1, 100)) P.Head.BackgroundColor3 = S.HeadDotColor or PreviewWhite P.Head.BackgroundTransparency = PreviewAlpha(S, "HeadDotTransparency") local HeadSize = PreviewNumber(S, "HeadDotSize", 5, 1, 50) P.Head.Size = UDim2.fromOffset(HeadSize, HeadSize) local TextSize = PreviewNumber(S, "TextSize", 11, 6, 40) local TextHeight = TextSize + 4 local Bottom = P.AmmoBack.Visible and PreviewNumber(S, "AmmoBarHeight", 4, 1, 20) + 5 or 3 P.Distance.Position = UDim2.new(0.5, 0, 1, Bottom) if P.Distance.Visible then Bottom += TextHeight end P.Weapon.Position = UDim2.new(0.5, 0, 1, Bottom) if P.Weapon.Visible then Bottom += TextHeight end P.Icon.Position = UDim2.new(0.5, 0, 1, Bottom) local TextFont = Fonts:ESPFace(S.Font or "Pixel") for _, Entry in self.Labels do local Label, Key = Entry[1], Entry[2] Label.FontFace = TextFont Label.TextSize = TextSize Label.Size = UDim2.fromOffset(160, Key == "Flags" and TextHeight * (select(2, Label.Text:gsub("\n", "")) + 1) or TextHeight) Label.TextColor3 = Key == "HealthText" and S.HealthTextColorMode ~= "Custom" and HealthColor or S[Key .. "Color"] or PreviewWhite Label.TextTransparency = Key == "HealthText" and S.HealthTextColorMode ~= "Custom" and HealthTransparency or PreviewAlpha(S, Key .. "Transparency") Label.TextStrokeColor3 = S.TextOutlineColor or PreviewBlack Label.TextStrokeTransparency = S.TextOutline == true and 1 - (1 - PreviewAlpha(S, "TextOutlineTransparency")) * (1 - Label.TextTransparency) or 1 end for Index, Line in P.SkeletonLines do Line.BackgroundColor3 = S.SkeletonColor or PreviewWhite Line.BackgroundTransparency = PreviewAlpha(S, "SkeletonTransparency") P.SkeletonOutlines[Index].BackgroundColor3 = S.SkeletonOutlineColor or PreviewBlack P.SkeletonOutlines[Index].BackgroundTransparency = PreviewAlpha(S, "SkeletonOutlineTransparency") end local FillOpacity = (1 - PreviewAlpha(S, "ChamsTransparency")) * PreviewNumber(S, "ChamsOpacity", 0.35, 0, 1) local OutlineOpacity = 1 - PreviewAlpha(S, "ChamsOutlineTransparency") P.ChamsViewport.Visible = S.Chams == true and FillOpacity > 0 and self.ChamsModel ~= nil P.ChamsOutlineViewport.Visible = S.Chams == true and OutlineOpacity > 0 and self.ChamsOutlineModel ~= nil for _, Entry in self.ChamsParts or {} do Entry[1].Color = S.ChamsColor or Theme.Accent Entry[1].Transparency = 1 - (1 - Entry[2]) * FillOpacity end for _, Entry in self.ChamsOutlineParts or {} do Entry[1].Color = S.ChamsOutlineColor or PreviewBlack Entry[1].Transparency = 1 - (1 - Entry[2]) * OutlineOpacity end self:Render() end function Preview:Render() local S, P = self.State, self.Parts local Size, Camera = P.Stage.AbsoluteSize, P.Camera P.Overlay.Visible = false P.Head.Visible = false for Index, Line in P.SkeletonLines do Line.Visible, P.SkeletonOutlines[Index].Visible = false, false end if not self.ModelCenter or not self.ModelSize or not self.ModelParts or #self.ModelParts == 0 or Size.X < 1 or Size.Y < 1 then return end local Width = math.sqrt(self.ModelSize.X * self.ModelSize.X + self.ModelSize.Z * self.ModelSize.Z) local Distance = math.max(self.ModelSize.Y, Width * Size.Y / Size.X) / (2 * math.tan(math.rad(Camera.FieldOfView * 0.5))) * PREVIEW_ZOOM local Center = self.ModelCenter Camera.CFrame = CFrame.new(Center + Vector3.new(math.sin(self.Angle) * Distance, 0, math.cos(self.Angle) * Distance), Center) local Low, High = Vector2.new(math.huge, math.huge), Vector2.new(-math.huge, -math.huge) for _, Part in self.ModelParts or {} do if not Part.Parent then continue end for X = -1, 1, 2 do for Y = -1, 1, 2 do for Z = -1, 1, 2 do local Point = PreviewProject(Camera, Size, Part.CFrame * Vector3.new(Part.Size.X * X * 0.5, Part.Size.Y * Y * 0.5, Part.Size.Z * Z * 0.5)) if Point then Low = Vector2.new(math.min(Low.X, Point.X), math.min(Low.Y, Point.Y)) High = Vector2.new(math.max(High.X, Point.X), math.max(High.Y, Point.Y)) end end end end end if Low.X == math.huge then return end local X, Y = math.floor(Low.X), math.floor(Low.Y) local BoxWidth, BoxHeight = math.max(2, math.ceil(High.X) - X), math.max(2, math.ceil(High.Y) - Y) P.Box.Position, P.Box.Size = UDim2.fromOffset(X, Y), UDim2.fromOffset(BoxWidth, BoxHeight) P.Overlay.Visible = true local Ratio = PreviewNumber(S, "CornerLength", 0.25, 0.1, 0.5) local A, B = BoxWidth * Ratio, BoxHeight * Ratio local Segments = { { 0, 0, A, 0 }, { 0, 0, 0, B }, { BoxWidth - A, 0, BoxWidth, 0 }, { BoxWidth, 0, BoxWidth, B }, { 0, BoxHeight, A, BoxHeight }, { 0, BoxHeight - B, 0, BoxHeight }, { BoxWidth - A, BoxHeight, BoxWidth, BoxHeight }, { BoxWidth, BoxHeight - B, BoxWidth, BoxHeight }, } for Index, Segment in Segments do local First, Last = Vector2.new(Segment[1], Segment[2]), Vector2.new(Segment[3], Segment[4]) local Line, Outline = P.Corners[Index], P.CornerOutlines[Index] PreviewLine(Line, First, Last, PreviewNumber(S, "BoxThickness", 1, 1, 10)) PreviewLine(Outline, First, Last, PreviewNumber(S, "BoxOutlineThickness", 3, 1, 12)) Line.Visible = S.Box == true and S.BoxStyle == "Corner" Outline.Visible = Line.Visible and S.BoxOutline == true P.CornerGradients[Index].Rotation = (S.BoxGradientRotation or 0) - Line.Rotation end if S.HeadDot == true and self.Head and self.Head.Parent then local Point = PreviewProject(Camera, Size, self.Head.Position) if Point then P.Head.Position, P.Head.Visible = UDim2.fromOffset(Point.X, Point.Y), true end end if S.Skeleton ~= true then return end for Index, Pair in self.Bones or {} do if not Pair[1].Parent or not Pair[2].Parent then continue end local First, Last = PreviewProject(Camera, Size, Pair[1].Position), PreviewProject(Camera, Size, Pair[2].Position) if First and Last then PreviewLine(P.SkeletonLines[Index], First, Last, PreviewNumber(S, "SkeletonThickness", 1, 1, 10)) if S.SkeletonOutline == true then PreviewLine(P.SkeletonOutlines[Index], First, Last, PreviewNumber(S, "SkeletonOutlineThickness", 3, 1, 12)) end end end end function Preview:SetVisible(Visible) self.Visible = Visible end end do local Loader = {} Loader.__index = Loader Library.Classes.Loader = Loader local LoaderStatusColors = { Undetected = Rgb(96, 220, 120), Updating = Rgb(242, 188, 72), Detected = Rgb(240, 84, 84) } local function Spinner(Parent, Size) local Holder = Create("Frame", { Size = UDim2.fromOffset(Size, Size), BackgroundTransparency = 1, Parent = Parent }) local TrackFrame = Create("Frame", { Size = UDim2.fromScale(1, 1), BackgroundTransparency = 1, Parent = Holder }) Corner(TrackFrame, Size) Create("UIStroke", { Thickness = 3, Transparency = 0.6, Theme = { Color = "Outline" }, Parent = TrackFrame }) local Ring = Create("Frame", { Size = UDim2.fromScale(1, 1), BackgroundTransparency = 1, Parent = Holder }) Corner(Ring, Size) local RingStroke = Create("UIStroke", { Thickness = 3, Theme = { Color = "Accent" }, Parent = Ring }) local Gradient = Create("UIGradient", { Transparency = NumberSequence.new({ NumberSequenceKeypoint.new(0, 0), NumberSequenceKeypoint.new(0.6, 0.2), NumberSequenceKeypoint.new(0.75, 1), NumberSequenceKeypoint.new(1, 1) }), Parent = RingStroke }) local Connection = RunService.RenderStepped:Connect(function(Delta) Gradient.Rotation = (Gradient.Rotation + Delta * 360) % 360 end) Holder.Destroying:Connect(function() Connection:Disconnect() end) return Holder end function Library:CreateLoader(Config) Config = Config or {} local Self = setmetatable({ Games = {}, Selected = nil, Done = false, Callback = Config.Callback }, Loader) local Frame = Create("CanvasGroup", { AnchorPoint = Vector2.new(0.5, 0.5), Position = UDim2.fromScale(0.5, 0.5), Size = UDim2.fromOffset(540, 330), Theme = { BackgroundColor3 = "Background" }, GroupTransparency = 1, Parent = Library.MenuGui }) Corner(Frame, 10) local Scale = Create("UIScale", { Scale = 0.94, Parent = Frame }) local Outline = Create("Frame", { Size = UDim2.fromScale(1, 1), BackgroundTransparency = 1, ZIndex = 50, Parent = Frame }) Corner(Outline, 10) Stroke(Outline, "Outline") local Side = Create("Frame", { Size = UDim2.new(0, 176, 1, 0), Theme = { BackgroundColor3 = "Inline" }, Parent = Frame }) Create("Frame", { Position = UDim2.new(1, 0, 0, 0), Size = UDim2.new(0, 1, 1, 0), Theme = { BackgroundColor3 = "Outline" }, Parent = Side }) local Logo = Library:Logo(Side, 26) Logo.Position = UDim2.fromOffset(18, 20) Create("TextLabel", { Position = UDim2.fromOffset(54, 18), Size = UDim2.new(1, -60, 0, 20), Text = Config.Title or "Swift", TextSize = 18, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Text" }, Parent = Side }) Create("TextLabel", { Position = UDim2.fromOffset(54, 37), Size = UDim2.new(1, -60, 0, 13), Text = Config.Version or ("v" .. Library.Version), NoCase = true, TextSize = 11, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Inactive Text" }, Parent = Side }) Create("TextLabel", { Position = UDim2.fromOffset(18, 76), Size = UDim2.new(1, -36, 0, 120), Text = Config.Description or "Pick a game on the right and press Launch. Your settings and configs load automatically.", TextWrapped = true, TextSize = 12, TextXAlignment = Enum.TextXAlignment.Left, TextYAlignment = Enum.TextYAlignment.Top, Theme = { TextColor3 = "Inactive Text" }, Parent = Side }) local UserCard = Create("Frame", { Position = UDim2.new(0, 12, 1, -62), Size = UDim2.new(1, -24, 0, 50), Theme = { BackgroundColor3 = "Tab" }, Parent = Side }) Corner(UserCard, 6) Stroke(UserCard, "Outline") local Avatar = Create("ImageLabel", { AnchorPoint = Vector2.new(0, 0.5), Position = UDim2.new(0, 8, 0.5, 0), Size = UDim2.fromOffset(32, 32), Theme = { BackgroundColor3 = "Element" }, BackgroundTransparency = 0, Parent = UserCard }) Corner(Avatar, 16) local UserName = Create("TextLabel", { Position = UDim2.fromOffset(48, 9), Size = UDim2.new(1, -54, 0, 15), Text = LocalPlayer and LocalPlayer.DisplayName or "User", NoCase = true, TextSize = 12, TextXAlignment = Enum.TextXAlignment.Left, TextTruncate = Enum.TextTruncate.AtEnd, Theme = { TextColor3 = "Text" }, Parent = UserCard }) Library:SetPlayerText(UserName, LocalPlayer, LocalPlayer and LocalPlayer.DisplayName or "User") Library:SetPlayerAvatar(Avatar, LocalPlayer, "") Create("TextLabel", { Position = UDim2.fromOffset(60, 25), Size = UDim2.new(1, -66, 0, 14), Text = "Online", TextSize = 11, TextXAlignment = Enum.TextXAlignment.Left, TextColor3 = LoaderStatusColors.Undetected, Parent = UserCard }) local Dot = Create("Frame", { Position = UDim2.fromOffset(48, 29), Size = UDim2.fromOffset(7, 7), BackgroundColor3 = LoaderStatusColors.Undetected, Parent = UserCard }) Corner(Dot, 4) local AvatarRequest = {} Self.AvatarRequest = AvatarRequest if LocalPlayer then task.spawn(function() if Library.Unloaded or Self.AvatarRequest ~= AvatarRequest then return end local Ok, Image = pcall(Players.GetUserThumbnailAsync, Players, LocalPlayer.UserId, Enum.ThumbnailType.HeadShot, Enum.ThumbnailSize.Size48x48) if Ok and not Library.Unloaded and Avatar.Parent and Self.AvatarRequest == AvatarRequest then Library:SetPlayerAvatar(Avatar, LocalPlayer, Image) end end) end local Picker = Create("CanvasGroup", { Position = UDim2.fromOffset(177, 0), Size = UDim2.new(1, -177, 1, 0), BackgroundTransparency = 1, Parent = Frame }) Create("TextLabel", { Position = UDim2.fromOffset(18, 16), Size = UDim2.new(1, -36, 0, 18), Text = "Select a game", TextSize = 15, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Text" }, Parent = Picker }) local Subtitle = Create("TextLabel", { Position = UDim2.fromOffset(18, 35), Size = UDim2.new(1, -36, 0, 14), Text = "", TextSize = 11, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Inactive Text" }, Parent = Picker }) local List = Create("ScrollingFrame", { Position = UDim2.fromOffset(14, 58), Size = UDim2.new(1, -24, 1, -112), ScrollBarThickness = 2, Theme = { ScrollBarImageColor3 = "Accent" }, Parent = Picker }) ListLayout(List, 6) Padding(List, 1, 1, 1, 6) local LaunchButton = Create("TextButton", { Position = UDim2.new(0, 14, 1, -44), Size = UDim2.new(1, -28, 0, 30), Theme = { BackgroundColor3 = "Element" }, Parent = Picker }) Corner(LaunchButton, 6) Shade(LaunchButton) local LaunchStroke = Stroke(LaunchButton, "Outline") local LaunchText = Create("TextLabel", { Size = UDim2.fromScale(1, 1), Text = "Select a game", Theme = { TextColor3 = "Inactive Text" }, Parent = LaunchButton }) local Loading = Create("CanvasGroup", { Position = UDim2.fromOffset(177, 0), Size = UDim2.new(1, -177, 1, 0), BackgroundTransparency = 1, GroupTransparency = 1, Visible = false, Parent = Frame }) local SpinnerHolder = Spinner(Loading, 44) SpinnerHolder.AnchorPoint = Vector2.new(0.5, 0) SpinnerHolder.Position = UDim2.new(0.5, 0, 0, 58) local LoadingTitle = Create("TextLabel", { Position = UDim2.fromOffset(0, 116), Size = UDim2.new(1, 0, 0, 18), Text = "Launching", TextSize = 15, Theme = { TextColor3 = "Text" }, Parent = Loading }) local Steps = Create("Frame", { AnchorPoint = Vector2.new(0.5, 0), Position = UDim2.new(0.5, 0, 0, 148), Size = UDim2.fromOffset(200, 80), BackgroundTransparency = 1, Parent = Loading }) ListLayout(Steps, 6) local Progress = Create("Frame", { AnchorPoint = Vector2.new(0.5, 1), Position = UDim2.new(0.5, 0, 1, -26), Size = UDim2.new(1, -60, 0, 6), Theme = { BackgroundColor3 = "Element" }, Parent = Loading }) Corner(Progress, 3) Stroke(Progress, "Outline") local ProgressFill = Create("Frame", { Size = UDim2.fromScale(0, 1), Theme = { BackgroundColor3 = "Accent" }, Parent = Progress }) Corner(ProgressFill, 3) Self.Parts = { Frame = Frame, Scale = Scale, Picker = Picker, List = List, Subtitle = Subtitle, LaunchButton = LaunchButton, LaunchStroke = LaunchStroke, LaunchText = LaunchText, Loading = Loading, LoadingTitle = LoadingTitle, Steps = Steps, ProgressFill = ProgressFill } Connect(LaunchButton.MouseEnter, function() if Self.Selected then ThemeTween(LaunchButton, "BackgroundColor3", "Hovered Element", 0.15) end end) Connect(LaunchButton.MouseLeave, function() ThemeTween(LaunchButton, "BackgroundColor3", "Element", 0.15) end) Connect(LaunchButton.MouseButton1Click, function() Self:Load() end) Tween(Frame, { GroupTransparency = 0 }, 0.35) Tween(Scale, { Scale = 1 }, 0.35, Enum.EasingStyle.Back) for _, Game in Config.Games or {} do Self:AddGame(Game) end Self:_UpdateSubtitle() return Self end function Loader:_UpdateSubtitle() self.Parts.Subtitle.Text = #self.Games .. (#self.Games == 1 and " game available" or " games available") end function Loader:AddGame(Config) Config = Config or {} local Row = Create("TextButton", { Size = UDim2.new(1, 0, 0, 54), Theme = { BackgroundColor3 = "Tab" }, LayoutOrder = #self.Games + 1, Parent = self.Parts.List }) Corner(Row, 6) local RowStroke = Stroke(Row, "Outline") local Icon = Create("ImageLabel", { AnchorPoint = Vector2.new(0, 0.5), Position = UDim2.new(0, 9, 0.5, 0), Size = UDim2.fromOffset(36, 36), ScaleType = Enum.ScaleType.Crop, Theme = { BackgroundColor3 = "Element" }, BackgroundTransparency = 0, Parent = Row }) Corner(Icon, 6) if Config.PlaceId then Icon.Image = "rbxthumb://type=GameIcon&id=" .. Config.PlaceId .. "&w=150&h=150" elseif Config.Icon then local Glyph = Create("ImageLabel", { AnchorPoint = Vector2.new(0.5, 0.5), Position = UDim2.fromScale(0.5, 0.5), Size = UDim2.fromOffset(20, 20), Theme = { ImageColor3 = "Accent" }, Parent = Icon }) SetIcon(Glyph, Config.Icon) end Create("TextLabel", { Position = UDim2.fromOffset(55, 10), Size = UDim2.new(1, -150, 0, 16), Text = Config.Name or Config.Text or "Game", NoCase = true, TextXAlignment = Enum.TextXAlignment.Left, TextTruncate = Enum.TextTruncate.AtEnd, Theme = { TextColor3 = "Text" }, Parent = Row }) Create("TextLabel", { Position = UDim2.fromOffset(55, 28), Size = UDim2.new(1, -150, 0, 14), Text = Config.Description or "", NoCase = true, TextSize = 11, TextXAlignment = Enum.TextXAlignment.Left, TextTruncate = Enum.TextTruncate.AtEnd, Theme = { TextColor3 = "Inactive Text" }, Parent = Row }) local Status = Config.Status or "Undetected" local Color = LoaderStatusColors[Status] or Theme.Accent local Pill = Create("Frame", { AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, -10, 0.5, 0), Size = UDim2.fromOffset(0, 20), AutomaticSize = Enum.AutomaticSize.X, Theme = { BackgroundColor3 = "Element" }, Parent = Row }) Corner(Pill, 10) Padding(Pill, 0, 0, 8, 8) ListLayout(Pill, 5, Enum.FillDirection.Horizontal, Enum.HorizontalAlignment.Left, Enum.VerticalAlignment.Center) local PillDot = Create("Frame", { Size = UDim2.fromOffset(6, 6), BackgroundColor3 = Color, Parent = Pill }) Corner(PillDot, 3) Create("TextLabel", { Size = UDim2.fromOffset(0, 20), AutomaticSize = Enum.AutomaticSize.X, Text = Status, TextSize = 10, TextColor3 = Color, LayoutOrder = 2, Parent = Pill }) local Game = { Config = Config, Row = Row, Stroke = RowStroke } Connect(Row.MouseEnter, function() if self.Selected ~= Game then ThemeTween(Row, "BackgroundColor3", "Hovered Element", 0.15) end end) Connect(Row.MouseLeave, function() if self.Selected ~= Game then ThemeTween(Row, "BackgroundColor3", "Tab", 0.15) end end) Connect(Row.MouseButton1Click, function() self:Select(Game) end) table.insert(self.Games, Game) self:_UpdateSubtitle() if Config.PlaceId and Config.PlaceId == game.PlaceId and not self.Selected then self:Select(Game) end return Game end Loader.CreateGame = Loader.AddGame function Loader:Select(Game) if self.Loading then return end if self.Selected then ThemeTween(self.Selected.Row, "BackgroundColor3", "Tab", 0.15) ThemeTween(self.Selected.Stroke, "Color", "Outline", 0.15) end self.Selected = Game ThemeTween(Game.Row, "BackgroundColor3", "Hovered Element", 0.15) ThemeTween(Game.Stroke, "Color", "Accent", 0.15) Library:SetText(self.Parts.LaunchText, "Launch " .. (Game.Config.Name or Game.Config.Text or "game")) ThemeTween(self.Parts.LaunchText, "TextColor3", "Accent", 0.15) ThemeTween(self.Parts.LaunchStroke, "Color", "Accent", 0.15) end function Loader:Load() if self.Loading or not self.Selected then return end self.Loading = true local Parts = self.Parts Library:SetText(Parts.LoadingTitle, "Launching " .. (self.Selected.Config.Name or "game")) Tween(Parts.Picker, { GroupTransparency = 1 }, 0.2) Parts.Loading.Visible = true Tween(Parts.Loading, { GroupTransparency = 0 }, 0.25) local StepNames = self.Selected.Config.Steps or { "Authenticating", "Downloading script", "Building interface" } local Rows = {} for Index, Name in StepNames do local Row = Create("Frame", { Size = UDim2.new(1, 0, 0, 16), BackgroundTransparency = 1, LayoutOrder = Index, Parent = Parts.Steps }) local Mark = Create("ImageLabel", { AnchorPoint = Vector2.new(0, 0.5), Position = UDim2.new(0, 0, 0.5, 0), Size = UDim2.fromOffset(11, 11), ImageTransparency = 1, Theme = { ImageColor3 = "Accent" }, Parent = Row }) SetIcon(Mark, "Check") local Label = Create("TextLabel", { Position = UDim2.fromOffset(18, 0), Size = UDim2.new(1, -18, 1, 0), Text = Name, TextSize = 12, TextXAlignment = Enum.TextXAlignment.Left, Theme = { TextColor3 = "Inactive Text" }, Parent = Row }) Rows[Index] = { Mark = Mark, Label = Label } end task.spawn(function() for Index, Row in Rows do ThemeTween(Row.Label, "TextColor3", "Text", 0.2) Tween(Parts.ProgressFill, { Size = UDim2.fromScale(Index / #Rows, 1) }, 0.55, Enum.EasingStyle.Quad) task.wait(0.6) Tween(Row.Mark, { ImageTransparency = 0 }, 0.2) ThemeTween(Row.Label, "TextColor3", "Inactive Text", 0.2) end task.wait(0.25) Tween(Parts.Scale, { Scale = 0.96 }, 0.25) Tween(Parts.Frame, { GroupTransparency = 1 }, 0.25).Completed:Wait() Parts.Frame:Destroy() self.Done = true SafeCall(self.Selected.Config.Callback) SafeCall(self.Callback, self.Selected.Config) end) end function Loader:Wait() repeat task.wait() until self.Done return self.Selected and self.Selected.Config end end do function Library:SetScale(Scale) for _, Gui in { Library.MenuGui, Library.OverlayGui, Library.HudGui } do local Object = Gui:FindFirstChildOfClass("UIScale") or Instance.new("UIScale") Object.Scale = Scale Object.Parent = Gui end end Library.CreateMenu = Library.CreateWindow end end local SwiftRuntime = {Mode = "Actor"} local Hooks = {} local Functions = {Combat = {}, Character = {}, Visuals = {}, Cosmetics = {}} local State = {Library = Library, Flags = Library.Flags, Runtime = SwiftRuntime, Alive = true, Controllers = {}, Errors = {}, PlayerSettings = {}} State.Functions, State.Hooks = Functions, Hooks function Functions.Initialize() if SwiftRuntime.Mode ~= "Actor" or type(SwiftRuntime.API) ~= "string" or type(SwiftRuntime.Actor) ~= "string" then return false, "run the complete Actor launcher" end do local Environment = type(getgenv) == "function" and getgenv() or _G local Globals = getfenv() local Names = {"filtergc", "getgc", "getloadedmodules", "getupvalues", "getconstants", "hookfunction", "restorefunction", "newcclosure", "cloneref", "gethui", "protectgui", "getthreadidentity", "setthreadidentity", "mousemoverel", "setclipboard"} local Executor = {Environment = Environment, APIs = {}} for _, Name in Names do local Value = Environment[Name] or Globals[Name] if type(Value) == "function" then Executor.APIs[Name] = Value end end Functions.Environment = {} function Functions.Environment.Get(Name) return Executor.APIs[Name] or Environment[Name] or Globals[Name] end State.Executor = Executor State.Services = {} for _, Name in {"Players", "Workspace", "ReplicatedStorage", "RunService", "UserInputService", "Lighting", "Debris", "HttpService", "TextChatService", "TweenService", "GuiService", "VirtualUser", "Stats", "CoreGui"} do local Service = game:GetService(Name) State.Services[Name] = Executor.APIs.cloneref and Executor.APIs.cloneref(Service) or Service end State.LocalPlayer = State.Services.Players.LocalPlayer if not State.LocalPlayer then return false, "join the game before running the script" end State.Shared = State.Services.ReplicatedStorage:WaitForChild("Shared", 8) State.GameClient = State.Services.ReplicatedStorage:WaitForChild("GameClient", 8) State.GameStats = State.Services.ReplicatedStorage:FindFirstChild("GameStats") State.Characters = State.Services.Workspace:FindFirstChild("Characters") end if State.Executor.Environment.Swift2 and type(State.Executor.Environment.Swift2.Destroy) == "function" then State.Executor.Environment.Swift2.Destroy() end do local API = State.Executor.APIs State.Connections, State.Instances, State.Order, State.Styles = {}, {}, {}, {} Functions.Utility = {} function Functions.Utility.Identity(Callback, Identity, ...) local Previous if API.getthreadidentity then local Okay, Value = pcall(API.getthreadidentity) if Okay and type(Value) == "number" then Previous = Value else State.Errors.Identity = "thread identity unavailable" end end local Changed = false if API.setthreadidentity and Previous ~= nil then local Okay, Reason = pcall(API.setthreadidentity, Identity or 8) Changed = Okay if not Okay then State.Errors.Identity = tostring(Reason) end end local Results = table.pack(pcall(Callback, ...)) if Changed then local Okay, Reason = pcall(API.setthreadidentity, Previous) if not Okay then State.Errors.Identity = tostring(Reason) end end return table.unpack(Results, 1, Results.n) end Functions.Utility.WithIdentity = Functions.Utility.Identity function Functions.Utility.Connect(Signal, Callback) if not Signal or type(Signal.Connect) ~= "function" then return nil end local Connection = Signal:Connect(function(...) if not State.Alive then return end local Okay, Reason = Functions.Utility.Identity(Callback, 8, ...) if not Okay then warn("Swift 2: " .. tostring(Reason)) end end) table.insert(State.Connections, Connection) return Connection end function Functions.Utility.Own(Object) if Object then table.insert(State.Instances, Object) end return Object end function Functions.Utility.Notify(Text, Kind) if State.Alive then Functions.Utility.Identity(function() State.Library:Notify({Text = Text, Type = Kind or "Info", Duration = 4}) end, 8) end end function Functions.Utility.Register(Name, Controller, Style) if not Controller then return end State.Controllers[Name] = Controller State.Styles[Name] = Style or "Dot" table.insert(State.Order, Name) return Controller end function Functions.Utility.Destroy() if not State.Alive then return end State.Alive = false for Index = #State.Order, 1, -1 do local Controller = State.Controllers[State.Order[Index]] if Controller and type(Controller.Destroy) == "function" then pcall(Controller.Destroy, Controller) end end for _, Connection in State.Connections do pcall(function() Connection:Disconnect() end) end if Functions.Hooks then Functions.Hooks.Clear() end for Index = #State.Instances, 1, -1 do pcall(function() State.Instances[Index]:Destroy() end) end table.clear(State.Connections) table.clear(State.Instances) table.clear(State.Controllers) if State.Executor.Environment.Swift2 == State then State.Executor.Environment.Swift2 = nil end end end State.Executor.Environment.Swift2 = State if not State.Executor.APIs.hookfunction then return false, "executor hookfunction is unavailable" end if not State.Executor.APIs.newcclosure then return false, "executor newcclosure is unavailable" end State.Flags = State.Library.Flags State.Library:OnUnload(Functions.Utility.Destroy) function State.Destroy() if not State.Alive then return end State.Library:Unload() Functions.Utility.Destroy() end do local API = State.Executor.APIs local Order = {} Functions.Hooks = {} function Functions.Hooks.Add(Name, Target, Callback) if Hooks[Name] and Hooks[Name].Target == Target then return Hooks[Name].Original end if Hooks[Name] then Functions.Hooks.Remove(Name) end if type(API.hookfunction) ~= "function" or type(Target) ~= "function" then State.Errors[Name] = "hook target or executor API unavailable" return nil end local Entry = {Target = Target, Active = true} local Replacement = function(...) if not State.Alive or not Entry.Active then return Entry.Original(...) end local Called, InOriginal, Results = false, false, nil local function Invoke(...) Called, InOriginal = true, true Results = table.pack(Entry.Original(...)) InOriginal = false return table.unpack(Results, 1, Results.n) end local Output = table.pack(pcall(Callback, Invoke, ...)) if Output[1] then return table.unpack(Output, 2, Output.n) end if InOriginal then State.Errors[Name] = tostring(Output[2]); return nil end Entry.Active = false State.Errors[Name] = tostring(Output[2]) warn("Swift 2 " .. Name .. ": " .. tostring(Output[2])) if Called then return table.unpack(Results, 1, Results.n) end return Entry.Original(...) end local Okay, Original = pcall(API.hookfunction, Target, Replacement) if not Okay or type(Original) ~= "function" then Entry.Active = false State.Errors[Name] = tostring(Original) return nil end Entry.Original, Entry.Replacement = Original, Replacement Hooks[Name] = Entry table.insert(Order, Name) return Original end function Functions.Hooks.Remove(Name) local Entry = Hooks[Name] if not Entry then return end Entry.Active = false if API.restorefunction then local Okay, Result = pcall(API.restorefunction, Entry.Target) if not Okay or Result == false then State.Errors[Name] = "hook restoration failed: " .. tostring(Result); Entry.RestoreFailed = true end else Entry.RestoreFailed = true State.Errors[Name] = "restorefunction unavailable; hook disabled" end Hooks[Name] = nil end function Functions.Hooks.Clear() for Index = #Order, 1, -1 do Functions.Hooks.Remove(Order[Index]) end table.clear(Order) end function Functions.Hooks.Status(Name) return Hooks[Name] end if API.hookfunction and API.newcclosure then local Entry = {Target = bit32.bor, Active = true} local Okay, Original = pcall(function() local hookfunction, newcclosure = API.hookfunction, API.newcclosure local _Bor; _Bor = hookfunction(bit32.bor, newcclosure(function(...) local CallerSource: string = debug.info(3, "s") if State.Alive and Entry.Active and (CallerSource and CallerSource:find("Tattle")) then return 0 end return _Bor(...) end)) return _Bor end) if Okay and type(Original) == "function" then Entry.Original = Original Hooks.Bor = Entry table.insert(Order, "Bor") else Entry.Active = false State.Errors.Bor = tostring(Original) end end end if not Hooks.Bor then return false, "required Bor hook could not be installed: " .. tostring(State.Errors.Bor) end do local Directions = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}} Functions.Angles = {} function Functions.Angles.Encode(Yaw, Pitch) return math.floor(((Yaw + math.pi) % (2 * math.pi)) * 65535 / (2 * math.pi)), math.floor((math.clamp(Pitch, -1.55334, 1.55334) + 1.55334) * 65535 / 3.10668) end function Functions.Angles.Decode(Yaw, Pitch) return -math.pi + Yaw * (2 * math.pi) / 65535, -1.55334 + Pitch * 3.10668 / 65535 end function Functions.Angles.Direction(Yaw, Pitch) return CFrame.fromEulerAnglesYXZ(-Pitch, Yaw, 0).LookVector end function Functions.Angles.LookAt(Origin, Position) if (Position - Origin).Magnitude <= 0.000001 then return nil end local Pitch, Yaw = CFrame.lookAt(Origin, Position):ToOrientation() return Yaw, -Pitch end function Functions.Angles.RotateInputs(Inputs, From, To) local Forward = (Inputs.Forward and 1 or 0) - (Inputs.Backward and 1 or 0) local Right = (Inputs.Right and 1 or 0) - (Inputs.Left and 1 or 0) local Delta, Result = To - From, table.clone(Inputs) local X, Y = Forward * math.cos(Delta) - Right * math.sin(Delta), Forward * math.sin(Delta) + Right * math.cos(Delta) Result.Forward, Result.Backward, Result.Left, Result.Right = false, false, false, false if X == 0 and Y == 0 then return Result end local Best, Choice = -math.huge, nil for _, Direction in Directions do local Dot = (X * Direction[1] + Y * Direction[2]) / math.sqrt(Direction[1] ^ 2 + Direction[2] ^ 2) if Dot > Best then Best, Choice = Dot, Direction end end Result.Forward, Result.Backward = Choice[1] > 0, Choice[1] < 0 Result.Right, Result.Left = Choice[2] > 0, Choice[2] < 0 return Result end end do local API, Modules = State.Executor.APIs, {} local Definitions = { Character = {Path = "GameClient.CharacterController", Keys = {"GetCharacter", "IsAlive"}, Required = true}, Entities = {Path = "GameClient.Entities", Keys = {"GetEntity", "GetAllCategoryEntities", "GetPlayheadTick"}, Required = true}, Weapon = {Path = "GameClient.WeaponController", Keys = {"GetCurrentWeapon", "UpdateKeyState"}, Required = true}, Networking = {Path = "GameClient.CharacterController.CharacterNetworking", Keys = {"ProcessPacket", "FlushPacket"}, Required = true}, WeaponInput = {Path = "GameClient.WeaponController.WeaponInput", Keys = {"GetCommandMap"}, Required = true}, Camera = {Path = "GameClient.CameraController", Keys = {"GetAngles", "SetAngles", "GetTarget"}, Required = true}, PlayerCamera = {Path = "GameClient.CameraController.CameraTypes.PlayerCamera", Keys = {"Update", "RefreshRecoilConfig"}}, WeaponEffects = {Path = "GameClient.WeaponController.WeaponEffects", Keys = {"Muzzle", "Process", "Tracer"}}, Viewmodel = {Path = "GameClient.WeaponController.Viewmodel", Keys = {"CalculateView", "SetSkin", "SetVisible"}}, GunWeapon = {Path = "Shared.WeaponConstructor.Types.GunWeapon", Keys = {"Fire", "TickCommand", "Reload"}, Required = true}, Bullet = {Path = "Shared.WeaponConstructor.Bullet", Keys = {"SpreadOffset", "Knife"}, Required = true}, Math = {Path = "Shared.Utility.Math", Keys = {"UniformRandomStream", "Approach", "DeltaAngle"}, Required = true}, GameConfig = {Path = "Shared.GameConfiguration", Keys = {"Get", "GetEntityTiming"}, Required = true}, WeaponManager = {Path = "Shared.Managers.WeaponManager", Keys = {"GetAllWeapons", "Get"}}, SkinManager = {Path = "Shared.Managers.SkinManager", Keys = {"GetAllSkins", "GetWeaponSkin"}}, CharacterModel = {Path = "Shared.CharacterModel", Keys = {"GetHitboxParts", "GetHitboxBox"}}, Movement = {Path = "Shared.Simulation.Movement", Keys = {"AirMove", "CheckJumpButton", "WalkMove"}}, Simulation = {Path = "Shared.Simulation", Keys = {"ProcessCommand", "BuildShotCFrame"}}, Collision = {Path = "Shared.Simulation.Collision", Keys = {"TryPlayerMove", "StepMove"}}, CollisionModule = {Path = "Shared.CollisionModule", Keys = {"SweepBox", "BoxSolid"}}, SimulationConfig = {Path = "Shared.Simulation.Config", Keys = {"CFG", "ConstantsTemplate", "CollisionHeightDelta", "CollisionHeightDeltaVector", "HalfStandCollisionBox", "HalfDuckCollisionBox", "Init"}, Types = {CFG = "table", ConstantsTemplate = "table", CollisionHeightDelta = "number", CollisionHeightDeltaVector = "Vector3", HalfStandCollisionBox = "Vector3", HalfDuckCollisionBox = "Vector3"}}, Enums = {Path = "Shared.Enums", Keys = {"MaterialPenetrationData", "MaterialVariantPenetrationData"}}, Legs = {Path = "Shared.LegSystem", Keys = {"UpdateClimbAnim", "EnableTransforms"}}, Roles = {Path = "Shared.Roles", Keys = {"GetRole", "IsModerator", "GetRank"}}, Sound = {Path = "Shared.Managers.SoundManager", Keys = {"GetWeaponSound", "PlayAudio"}}, KillFeed = {Path = "GameClient.Gui.HUD.KillFeed", Keys = {"NewKill"}}, } local Objects, Sources, Linked = nil, {}, {} local function Matches(Value, Definition, Name) if type(Value) ~= "table" then return false end for _, Key in Definition.Keys do local Member = rawget(Value, Key) if Member == nil then return false end local Kind = Definition.Types and Definition.Types[Key] if Kind then if typeof(Member) ~= Kind then return false end elseif Name ~= "Enums" and type(Member) ~= "function" then return false end end return true end local function Upvalues(Function) if not API.getupvalues or type(Function) ~= "function" then return {} end local Okay, Values = pcall(API.getupvalues, Function) return Okay and type(Values) == "table" and Values or {} end local function Signal(Value) return (type(Value) == "table" or typeof(Value) == "RBXScriptSignal") and type(Value.Connect) == "function" end local function Initialized(Name, Value) if Name == "Character" then return Signal(Value.OnCharacterSpawn) and Signal(Value.OnCharacterDestroy) elseif Name == "Weapon" then return Signal(Value.OnWeaponChanged) and Signal(Value.OnWeaponShoot) elseif Name == "Entities" then return Signal(Value.OnEntityCreated) and Signal(Value.OnEntityDestroyed) elseif Name == "SimulationConfig" then local Config = Value.CFG return type(Config) == "table" and type(Config.TickRate) == "number" and Config.TickRate > 0 and Config.TickRate < math.huge and type(Config.InterpolationDelay) == "number" and Config.InterpolationDelay >= 0 and Config.InterpolationDelay < math.huge and type(Config.EnableBunnyHop) == "boolean" elseif Name == "Camera" then local Okay, Yaw, Pitch = pcall(Value.GetAngles) return Signal(Value.CameraTargetUpdate) and Okay and type(Yaw) == "number" and type(Pitch) == "number" and Yaw == Yaw and Pitch == Pitch and math.abs(Yaw) < math.huge and math.abs(Pitch) < math.huge elseif Name == "Networking" and API.getupvalues then local Packed, Network, Weapon, Config = false, false, false, false for _, Member in Upvalues(Value.ProcessPacket) do if type(Member) ~= "table" then continue end Packed = Packed or type(rawget(Member, "PackTables")) == "function" Network = Network or type(rawget(Member, "Character")) == "table" and Member.Character.CommandArray ~= nil Weapon = Weapon or type(rawget(Member, "GetKeyState")) == "function" and type(rawget(Member, "UpdateKeyState")) == "function" Config = Config or type(rawget(Member, "TickRate")) == "number" and Member.TickRate > 0 end return Packed and Network and Weapon and Config end return true end local function Link(Value) if not API.getupvalues or type(Value) ~= "table" then return end local Queue, SeenFunctions = {{Value, 0}}, {} local Index = 1 while Index <= #Queue and Index <= 500 do local Entry = Queue[Index] Index += 1 for _, Member in Entry[1] do if type(Member) ~= "function" or SeenFunctions[Member] then continue end SeenFunctions[Member] = true for _, Reference in Upvalues(Member) do if type(Reference) == "table" and not Linked[Reference] then Linked[Reference] = true if Entry[2] < 2 then table.insert(Queue, {Reference, Entry[2] + 1}) end end end end end end local function Score(Name, Value, Definition) local Points = Linked[Value] and 1000 or 0 for _, Key in Definition.Keys do local Member = rawget(Value, Key) if type(Member) == "function" then local Okay, Source = pcall(debug.info, Member, "s") if Okay and type(Source) == "string" and Source:find(Definition.Path:match("[^.]+$"), 1, true) then Points += 10 end end end if Name == "Character" then local Okay, Character = pcall(Value.GetCharacter) if Okay and type(Character) == "table" and Character.Simulation then Points += 100 end if Value.OnCharacterSpawn then Points += 10 end elseif Name == "Weapon" then local Okay, Weapon = pcall(Value.GetCurrentWeapon) if Okay and type(Weapon) == "table" and Weapon.Data then Points += 100 end if Value.OnWeaponShoot then Points += 10 end elseif Name == "Entities" then local Okay, Entities = pcall(Value.GetAllCategoryEntities, "Character") if Okay and type(Entities) == "table" then Points += 20; if next(Entities) then Points += 30 end end if Value.OnEntityCreated then Points += 10 end elseif Name == "GameConfig" then local Okay, Rate = pcall(Value.Get, "Game", "TickRate") if Okay and type(Rate) == "number" and Rate > 0 then Points += 100 end elseif Name == "Camera" then local Okay, Yaw, Pitch = pcall(Value.GetAngles) if Okay and type(Yaw) == "number" and type(Pitch) == "number" then Points += 100 end end return Points end local function Find(Name, Definition) Definition = Definition or Definitions[Name] if not Definition then return nil end local Candidates, Seen = {}, {} local function Add(Value, Source) if Seen[Value] or not Matches(Value, Definition, Name) or not Initialized(Name, Value) then return end Seen[Value] = true table.insert(Candidates, {Value = Value, Source = Source}) end if #Definition.Keys > 0 then for Value in Linked do Add(Value, "upvalue") end end if #Definition.Keys > 0 and API.filtergc then local Okay, Result = pcall(API.filtergc, "table", {Keys = Definition.Keys}, false) if Okay and type(Result) == "table" then if Matches(Result, Definition, Name) then Add(Result, "filtergc") else for _, Candidate in Result do Add(Candidate, "filtergc") end end end end if #Candidates == 0 and #Definition.Keys > 0 and API.getgc then if not Objects then local Okay, Result = pcall(API.getgc, true) Objects = Okay and type(Result) == "table" and Result or {} end for _, Candidate in Objects do Add(Candidate, "getgc") end end local Best, Value, Source = -1, nil, nil for _, Candidate in Candidates do local Points = Score(Name, Candidate.Value, Definition) if Points > Best then Best, Value, Source = Points, Candidate.Value, Candidate.Source end end if Value then Sources[Name] = Source; Link(Value); return Value end return nil end local Sequence = {"Character", "Weapon", "Entities", "Camera", "Networking", "WeaponInput", "GunWeapon", "Bullet", "Math", "GameConfig", "PlayerCamera", "WeaponEffects", "Viewmodel", "WeaponManager", "SkinManager", "CharacterModel", "Movement", "Simulation", "Collision", "CollisionModule", "SimulationConfig", "Enums", "Legs", "Roles", "Sound", "KillFeed"} local Deadline = os.clock() + 6 repeat Objects = nil for _, Name in Sequence do Modules[Name] = Modules[Name] or Find(Name) end State.Missing = {} for Name, Definition in Definitions do if Definition.Required and not Modules[Name] then table.insert(State.Missing, Name) end end if #State.Missing == 0 or os.clock() >= Deadline then break end task.wait(0.25) until not State.Alive for _, Name in Sequence do Modules[Name] = Find(Name) or Modules[Name] end State.Modules, State.ModuleSources = Modules, Sources Functions.Game = {} function Functions.Game.Character() return Modules.Character and Modules.Character.GetCharacter and Modules.Character.GetCharacter() end function Functions.Game.Simulation() local Character = Functions.Game.Character() return Character and Character.Simulation, Character end function Functions.Game.Weapon() return Modules.Weapon and Modules.Weapon.GetCurrentWeapon() end function Functions.Game.Camera() return State.Services.Workspace.CurrentCamera end function Functions.Game.Config(Category, Name, Default) if Modules.GameConfig then local Okay, Value = pcall(Modules.GameConfig.Get, Category, Name) if Okay and Value ~= nil and (Default == nil or typeof(Value) == typeof(Default)) then return Value end end return Default end function Functions.Game.ManualFire() local Input = State.Services.UserInputService return Input:GetFocusedTextBox() == nil and Input:IsMouseButtonPressed(Enum.UserInputType.MouseButton1) end Functions.Game.Notify = Functions.Utility.Notify Functions.Game.Discover = Find State.ModuleReady = Initialized table.sort(State.Missing) end if #State.Missing > 0 then return false, "initialized game modules unavailable: " .. table.concat(State.Missing, ", ") end do Functions.Config = {} function Functions.Config.Get(Name, Default) local Weapon = Name:match("^(.*) Skin$") local Skins = State.UI and State.UI.Skins if Weapon and Skins then local Entry = Skins:GetSkin(Weapon) if Entry and Entry.Skin then return Entry.Skin.Name end end if State.WeaponConfigs then local Value = State.WeaponConfigs:Resolve(Name) if Value ~= nil then return Value end end local Value = State.Flags[Name] if Value == nil then return Default end return Value end function Functions.Config.Color(Name, Default) local Picker = State.UI and State.UI.Colors[Name] local Value, Alpha if Picker and type(Picker.GetColor) == "function" then Value, Alpha = Picker:GetColor() else Value = State.Flags[Name] if type(Value) == "table" then Value, Alpha = Value.Color, Value.Alpha end end return typeof(Value) == "Color3" and Value or Default or Color3.new(1, 1, 1), type(Alpha) == "number" and 1 - math.clamp(Alpha, 0, 1) or 1 end end do local Game = Functions.Game local function Identifier(Value) return type(Value) == "number" and Value == Value and math.abs(Value) < math.huge and Value % 1 == 0 end local function Read(Name, ...) local Native = State.Modules and State.Modules.Entities local Callback = Native and Native[Name] if type(Callback) ~= "function" then return nil end local Okay, Value = pcall(Callback, ...) return Okay and type(Value) == "table" and Value or nil end function Game.Entity(Category, Id) if type(Category) ~= "string" or Category == "" or not Identifier(Id) then return nil end return Read("GetEntity", Category, Id) end function Game.Entities(Category) Category = Category or "Character" if type(Category) ~= "string" or Category == "" then return {} end return Read("GetAllCategoryEntities", Category) or {} end function Game.CharacterEntity(UserId) if not Identifier(UserId) then return nil end local Entity = Read("GetCharacterByUserId", UserId) if Entity and Entity.UserId == UserId and Game.Entity("Character", Entity.Identifier) == Entity then return Entity end return nil end local function Snapshot(Entity, Tick) local Ring = Entity and Entity.Snapshots if type(Ring) ~= "table" or type(Ring.Count) ~= "number" or Ring.Count <= 0 then return nil end if Tick ~= nil and not Identifier(Tick) then return nil end local Callback = Tick ~= nil and Ring.GetByTick or Ring.Newest if type(Callback) ~= "function" then return nil end local Okay, Entry = pcall(Callback, Ring, Tick) return Okay and type(Entry) == "table" and type(Entry.Snapshot) == "table" and (Tick == nil or Entry.Tick == Tick) and Entry or nil end function Game.EntityCurrent(Entity, Category) if type(Entity) ~= "table" or Entity.FogCulled or Entity.InterpolationFailed or Entity.DecodeGap then return false end if Game.Entity(Category or "Character", Entity.Identifier) ~= Entity then return false end local Ring = Entity.Snapshots if type(Ring) == "table" then if not Identifier(Ring.Count) or Ring.Count < 0 then return false end if Ring.Count == 0 then return Entity.PendingFogCulled ~= true end local Latest = Snapshot(Entity) if not Latest or Latest.FogCulled then return false end return true end return Entity.PendingFogCulled ~= true end function Game.EntitySnapshot(Entity, Tick) if not Game.EntityCurrent(Entity) then return nil end local Entry = Snapshot(Entity, Tick) if not Entry or Entry.FogCulled then return nil end return Entry end Functions.Game = Game end do local Game, Get = Functions.Game, Functions.Config.Get local Transforms = setmetatable({}, {__mode = "k"}) local Parameters = RaycastParams.new() Parameters.IgnoreWater = true local Multipliers = {Head = 4, UpperTorso = 1, Torso = 1, LowerTorso = 1.25, LeftUpperArm = 1, LeftLowerArm = 1, LeftHand = 1, RightUpperArm = 1, RightLowerArm = 1, RightHand = 1, LeftUpperLeg = 0.75, LeftLowerLeg = 0.75, LeftFoot = 0.75, RightUpperLeg = 0.75, RightLowerLeg = 0.75, RightFoot = 0.75} Functions.Target = {} function Functions.Target.Range(Weapon) local Range = Weapon and Weapon.Data and Weapon.Data.Range if type(Range) ~= "number" or Range ~= Range or Range <= 0 or Range >= math.huge then return 0 end return Range end function Functions.Target.Enemy(Entity) if not Entity or Entity.UserId == State.LocalPlayer.UserId then return false end local Stats = State.GameStats if Stats and Stats:GetAttribute("Gamemode") == "Deathmatch" then return true end local Simulation = Game.Simulation() local Team = State.LocalPlayer:GetAttribute("Team") or Simulation and Simulation.Team local Other = Entity.Data and Entity.Data.Team return Team ~= nil and Other ~= nil and Team ~= Other end function Functions.Target.Current(Entity) if type(Game.EntityCurrent) == "function" then return Game.EntityCurrent(Entity, "Character") end if not Entity or Entity.FogCulled or Entity.InterpolationFailed or Entity.DecodeGap then return false end return not (Entity.Snapshots and Entity.Snapshots.Count == 0 and Entity.PendingFogCulled) end function Functions.Target.Valid(Entity) if not Entity or not Entity.Model or not Entity.Model.Parent or (Entity.Health or 0) <= 0 then return false end if Entity.Culled or not Functions.Target.Current(Entity) then return false end return not (Get("Ignore Protected", false) and Entity.Model:FindFirstChild("SpawnProtection")) end function Functions.Target.Parts(Entity) if not Entity or not Entity.Model then return {} end local CharacterModel = State.Modules.CharacterModel if CharacterModel and type(CharacterModel.GetHitboxParts) == "function" then local Okay, Parts = pcall(CharacterModel.GetHitboxParts, Entity.Model) if Okay and type(Parts) == "table" then return Parts end end local Parts = {} for _, Part in Entity.Model:GetChildren() do if Part:IsA("BasePart") and Multipliers[Part.Name] then table.insert(Parts, Part) end end return Parts end function Game.PartFrame(Entity, Part) if not Entity or not Part or not Part.Parent then return nil end if not Entity.Culled then return Part.CFrame end local Anchor = Entity.PrimaryPart or Entity.Model and Entity.Model.PrimaryPart if not Anchor or not Entity.CFrame then return nil end local Cached = Transforms[Entity] if not Cached or Cached.Anchor ~= Anchor.CFrame or Cached.Target ~= Entity.CFrame then Cached = {Anchor = Anchor.CFrame, Target = Entity.CFrame, Correction = Entity.CFrame * Anchor.CFrame:Inverse()} Transforms[Entity] = Cached end return Cached.Correction * Part.CFrame end function Game.PartPosition(Entity, Part) local Frame = Game.PartFrame(Entity, Part) return Frame and Frame.Position end function Game.Hitbox(Entity, Part) local Frame = Game.PartFrame(Entity, Part) if not Frame then return nil end local Half, Model = Part.Size * 0.5, State.Modules.CharacterModel if Game.Config("LagCompensation", "MathHitboxes", false) and Model and type(Model.GetHitboxBox) == "function" then local Okay, Offset, Extents = pcall(function() local Index = table.find(Functions.Target.Parts(Entity), Part) if Index then return Model.GetHitboxBox(Entity.Model, Index, Part) end end) if Okay then if typeof(Offset) == "CFrame" then Frame *= Offset end if typeof(Extents) == "Vector3" then Half = Extents end end end return Frame, Half end function Functions.Target.RayHitsHitbox(Target, Origin, Direction, Range) if not Target or not Target.Frame or not Target.Half or Direction.Magnitude <= 0.000001 then return false end local Start = Target.Frame:PointToObjectSpace(Origin) local Ray = Target.Frame:VectorToObjectSpace(Direction) local Near, Far = 0, Range or math.huge for _, Axis in {"X", "Y", "Z"} do local Position, Step, Half = Start[Axis], Ray[Axis], Target.Half[Axis] if math.abs(Step) < 0.000001 then if math.abs(Position) > Half then return false end else local Entry, Exit = (-Half - Position) / Step, (Half - Position) / Step if Entry > Exit then Entry, Exit = Exit, Entry end Near, Far = math.max(Near, Entry), math.min(Far, Exit) if Near > Far then return false end end end return Far >= 0, Near end function Functions.Target.Visible(Part, Origin, Position) local Camera = Game.Camera() if not Part or not Part.Parent or not Origin and not Camera then return false end Origin = Origin or Camera.CFrame.Position local Workspace = State.Services.Workspace local Map = Workspace:FindFirstChild("Map") local Geometry = Map and Map:FindFirstChild("Geometry") Parameters.FilterType = Geometry and Enum.RaycastFilterType.Include or Enum.RaycastFilterType.Exclude local Excluded = {} for _, Object in {Camera, State.Characters, State.ThirdPersonModel, State.LocalPlayer.Character} do if Object then table.insert(Excluded, Object) end end Parameters.FilterDescendantsInstances = Geometry and {Geometry} or Excluded local Result = Workspace:Raycast(Origin, (Position or Part.Position) - Origin, Parameters) return not Result or Result.Instance:IsDescendantOf(Part.Parent), Result end function Functions.Target.Damage(Entity, Part, Distance, Weapon, Remaining) local Data = Weapon and Weapon.Data local Range = Functions.Target.Range(Weapon) if not Data or not Part or type(Distance) ~= "number" or Distance ~= Distance or Distance < 0 or Range <= 0 or Distance > Range + 2.776 then return 0 end local Name = Part.Name local Overrides = Game.Config("Damage", "HitboxMultipliers", Multipliers) local Multiplier = Data.HitboxMultipliers and Data.HitboxMultipliers[Name] or Overrides[Name] or Multipliers[Name] or 1 local Damage = (Remaining or (tonumber(Data.Damage) or 0) * math.clamp(tonumber(Data.RangeModifier) or 1, 0, 1) ^ (Distance * Range / (Range + 2.776) / math.max(0.01, Game.Config("Weapon", "DistanceFallOff", 34.7)))) * Multiplier local Player = type(Entity.UserId) == "number" and State.Services.Players:GetPlayerByUserId(Entity.UserId) local Armor = tonumber(Player and Player:GetAttribute("ArmorValue") or Entity.ArmorValue) or 0 local Helmet = Entity.HasHelmet if Player then Helmet = Player:GetAttribute("HasHelmet") end local Rules = Game.Config("Damage", "HitboxArmorApply", {ApplyArmor = {}, RequireHelmet = {Head = true}}) local Armored = Rules.ApplyArmor and Rules.ApplyArmor[Name] if Armored == nil then Armored = not (Name:find("Leg") or Name:find("Foot")) end local HelmetRequired = Rules.RequireHelmet and Rules.RequireHelmet[Name] if HelmetRequired == nil then HelmetRequired = Name == "Head" end if Armor > 0 and Armored and (not HelmetRequired or Helmet) and type(Data.ArmorRatio) == "number" then local Ratio = math.clamp(Data.ArmorRatio * Game.Config("Damage", "ArmorRatioDivisor", 0.5), 0, 1) local Bonus = math.max(0.01, Game.Config("Damage", "ArmorBonusMultiplier", 0.5)) local Reduced = Damage * Ratio Damage = (Damage - Reduced) * Bonus > Armor and Damage - Armor / Bonus or Reduced end return math.max(0, Damage) end end do local Gui = Functions.Utility.Own(Instance.new("ScreenGui")) Gui.Name, Gui.ResetOnSpawn, Gui.IgnoreGuiInset, Gui.DisplayOrder = "Swift2Overlay", false, true, 5 local Parent = State.Library.OverlayGui and State.Library.OverlayGui.Parent if not Parent and State.Executor.APIs.gethui then local Okay, Container = pcall(State.Executor.APIs.gethui) if Okay then Parent = Container end end if State.Executor.APIs.protectgui then pcall(State.Executor.APIs.protectgui, Gui) end Gui.Parent = Parent or State.Services.CoreGui State.GuiParent = Gui end do local Library = State.Library local Window = Library:CreateWindow({Title = "Swift"}) local Self = {Window = Window, Tabs = {}, Colors = {}} State.UI = Self State.PlayerSettings = State.PlayerSettings or {} Window:SetLogo("Logo") Window:AddCategory("Combat") Self.Tabs.Rage = Window:AddTab({Title = "Rage", Icon = "Bullseye"}) Self.Tabs.Legit = Window:AddTab({Title = "Legit", Icon = "Bullet"}) Window:AddCategory("Visuals") Self.Tabs.Players = Window:AddTab({Title = "Players", Icon = "Smile"}) Self.Tabs.World = Window:AddTab({Title = "World", Icon = "Globe"}) Self.Tabs.Effects = Window:AddTab({Title = "Effects", Icon = "HeartCrack"}) Self.Tabs.Local = Window:AddTab({Title = "Local", Icon = "User"}) Self.Skins = Window:AddSkinChanger({Title = "Skins", Icon = "Brush"}) Window:AddCategory("Player") Self.Tabs.Movement = Window:AddTab({Title = "Movement", Icon = "Smile"}) Self.Tabs.Utility = Window:AddTab({Title = "Utility", Icon = "Bomb"}) Window:AddCategory("Misc") Self.Playerlist = Window:AddPlayerlist({Title = "Playerlist", Icon = "Users"}) Self.Servers = Window:AddServerList({Title = "Servers", Icon = "Globe"}) Self.Preview = Window:AddPreview({Tab = Self.Tabs.Players}) local Selected local BodyAim BodyAim = Self.Playerlist.Section:AddToggle({Text = "Body Aim", Flag = "Player Body Aim", NoSave = true, Callback = function(Value) if not Selected then return end local Settings = State.PlayerSettings[Selected.UserId] or {} Settings.BodyAim = Value State.PlayerSettings[Selected.UserId] = Settings end}) if Library.Elements["Player Body Aim"] then Library.Elements["Player Body Aim"].NoSave = true end Self.Playerlist:OnSelected(function(Player) Selected = Player BodyAim:Set((State.PlayerSettings[Player.UserId] or {}).BodyAim == true, true) end) Self.Playerlist:OnStatusChanged(function(Player, Status) local Settings = State.PlayerSettings[Player.UserId] or {} Settings.Ignore = Status == "Friendly" Settings.Priority = Status == "Priority" State.PlayerSettings[Player.UserId] = Settings end) Library:AddConfigExtra(function() local Settings = {} for UserId, Entry in State.PlayerSettings do Settings[tostring(UserId)] = table.clone(Entry) end return "__PlayerSettings", Settings end, function(Data) if type(Data.__PlayerSettings) ~= "table" then return end table.clear(State.PlayerSettings) for UserId, Entry in Data.__PlayerSettings do if tonumber(UserId) and type(Entry) == "table" then State.PlayerSettings[tonumber(UserId)] = {Ignore = Entry.Ignore == true, Priority = Entry.Priority == true, BodyAim = Entry.BodyAim == true} end end if Selected then BodyAim:Set((State.PlayerSettings[Selected.UserId] or {}).BodyAim == true, true) end end) Self.Playerlist:Select(State.LocalPlayer or State.Services.Players.LocalPlayer) local PreviewState = {Health = 0.82, DistanceText = "24st", WeaponName = "AK-47", ArmorValue = 0.65, Ammo = 18, AmmoCapacity = 30, IconImage = "rbxassetid://103328569146383"} local Tags = {} local TagOptions = {{"Defuse kit", "KIT"}, {"Bomb", "BOMB"}, {"Planting", "PLANT"}, {"Defusing", "DEFUSE"}, {"Aiming", "ZOOM"}, {"Yaw", "Y 45"}, {"Pitch", "P 10"}, {"Team", "CT"}} local VisibleFields = { {"Box", "Box"}, {"HealthBar", "Healthbar"}, {"Name", "Names"}, {"Distance", "Distance Text"}, {"Weapon", "Weapon Text"}, {"Flags", "Flags"}, {"Skeleton", "Skeletons"}, {"Armor", "Player Armor"}, {"AmmoBar", "Player Ammo Bar"}, {"AmmoText", "Player Ammo Text"}, {"HeadDot", "Player Head Dot"}, {"Icon", "Player Icon"}, {"Chams", "Player Chams"}, } local SettingFields = { {"BoxThickness", "Box Thickness", 1}, {"BoxOutline", "Box Outline Enabled", false}, {"BoxOutlineThickness", "Box Outline Thickness", 3}, {"BoxGradient", "Box Gradient", false}, {"BoxGradientRotation", "Box Gradient Rotation", 0}, {"Fill", "Box Fill", false}, {"FillGradient", "Box Fill Gradient", false}, {"FillGradientRotation", "Box Fill Rotation", 0}, {"Glow", "Box Glow", false}, {"GlowOpacity", "Glow Opacity", 0.2}, {"GlowSize", "Glow Size", 45}, {"GlowGradient", "Box Glow Gradient", false}, {"GlowGradientRotation", "Box Glow Rotation", 0}, {"HealthWidth", "Healthbar Width", 4}, {"HealthGradient", "Health Gradient", false}, {"HealthText", "Healthbar Text", false}, {"HealthTextColorMode", "Health Text Color Mode", "Health"}, {"SkeletonThickness", "Skeleton Thickness", 1}, {"SkeletonOutline", "Skeleton Outline", false}, {"SkeletonOutlineThickness", "Skeleton Outline Thickness", 3}, {"ArmorWidth", "Player Armor Width", 4}, {"AmmoBarHeight", "Player Ammo Bar Height", 4}, {"HeadDotSize", "Player Head Dot Size", 5}, {"IconSize", "Player Icon Size", 20}, {"TextSize", "Text Size", 10}, {"Font", "ESP Font", "Pixel"}, {"TextOutline", "ESP Text Outline", false}, {"ChamsOpacity", "Player Chams Opacity", 0.35}, } local ColorFields = { {"Box", "Box Color"}, {"BoxOutline", "Box Outline Color"}, {"BoxGradientStart", "High Contrast Box"}, {"BoxGradientEnd", "Low Contrast Box"}, {"Fill", "Fill Color"}, {"FillGradientStart", "High Contrast Fill"}, {"FillGradientEnd", "Low Contrast Fill"}, {"Glow", "Glow Color"}, {"GlowGradientStart", "High Contrast Glow"}, {"GlowGradientEnd", "Low Contrast Glow"}, {"Health", "Health Color"}, {"HealthHigh", "High Health"}, {"HealthMid", "Mid Health"}, {"HealthLow", "Low Health"}, {"HealthText", "Health Text Color"}, {"Name", "Names Text Color"}, {"Distance", "Distance Text Color"}, {"Weapon", "Weapon Text Color"}, {"Flags", "Flags Text Color"}, {"Skeleton", "Skeleton Color"}, {"SkeletonOutline", "Skeleton Outline Color"}, {"Armor", "Player Armor Color"}, {"Ammo", "Player Ammo Color"}, {"HeadDot", "Player Head Dot Color"}, {"Icon", "Player Icon Color"}, {"TextOutline", "ESP Text Outline Color"}, {"Chams", "Player Chams Color"}, {"ChamsOutline", "Player Chams Outline Color"}, } for _, Entry in ColorFields do local Key = Entry[1] Entry[3] = Key:match("Start$") or Key:match("End$") or Key == "HealthHigh" or Key == "HealthMid" or Key == "HealthLow" Entry[5] = Key .. "Transparency" if not Entry[3] then Entry[4] = Key .. "Color" end end local White = Color3.new(1, 1, 1) local function Get(Name, Default) local Value = Library.Flags[Name] if Value == nil then return Default end return Value end local function Color(Name) local Picker, Value = Self.Colors[Name], Library.Flags[Name] if type(Value) == "table" and (not Picker or Value ~= Picker.Value) then return Value.Color, Value.Alpha end if Picker and Picker.GetColor then return Picker:GetColor() end return White, 0 end function Self:GetPreviewState() local Flags = Library.Flags local Enabled = Flags["Esp Enabled"] == true local Player = State.LocalPlayer or State.Services.Players.LocalPlayer local Username = Player and Player.Name or "Player" local Name = Player and Player.DisplayName or Username if Flags["ESP Name Type"] == "Username" then Name = Username elseif Flags["ESP Name Type"] == "Both" then Name = Name .. " (@" .. Username .. ")" end if Library.AnonymousMode then Name = Library.AnonymousName or "..." end table.clear(Tags) local Selected = Flags["ESP Flags"] for _, Entry in TagOptions do if type(Selected) == "table" and (Selected[Entry[1]] == true or table.find(Selected, Entry[1])) then table.insert(Tags, Entry[2]) end end for _, Entry in VisibleFields do PreviewState[Entry[1]] = Enabled and Flags[Entry[2]] == true end for _, Entry in SettingFields do PreviewState[Entry[1]] = Get(Entry[2], Entry[3]) end PreviewState.BoxStyle = Get("Box Style", "Full") == "Corners" and "Corner" or "Full" PreviewState.CornerLength = Get("Box Corner Length", 25) / 100 PreviewState.NameText, PreviewState.FlagsText = Name, table.concat(Tags, "\n") for _, Entry in ColorFields do local ColorValue, Transparency = Color(Entry[2]) if Entry[3] then PreviewState[Entry[1]] = ColorValue else PreviewState[Entry[4]] = ColorValue end PreviewState[Entry[5]] = Transparency or 0 end return PreviewState end function Self:RefreshPreview() Self.Preview:Update(Self:GetPreviewState()) end Self.Preview:SetStateProvider(function() return Self:GetPreviewState() end) function Self:Finish() if not Self.Settings then Self.Settings = Window:AddSettingsTab({Title = "Settings", Icon = "Gear", Watermark = false, KeybindList = false, MenuKeybind = Enum.KeyCode.RightShift}) end Self:RefreshPreview() Self.Tabs.Legit:Select(true) return Self end State.UI = Self end State.UI.Parent = State.GuiParent do local Library = State.Library local Window = State.UI.Window local Colors = State.UI.Colors local White, Black = Color3.new(1, 1, 1), Color3.new(0, 0, 0) local AimPage, TriggerPage, RagePage, AntiAimPage = State.UI.Tabs.Legit, State.UI.Tabs.Legit, State.UI.Tabs.Rage, State.UI.Tabs.Rage local AimSection = AimPage:AddSection({Title = "Aim Assist", Icon = "Bullseye", Side = 1}) local Aimbot = AimSection:AddToggle({Text = "Aimbot", Flag = "Aimbot", Default = false}) Aimbot:AddKeybind({Mode = "Toggle"}) local AimSettings = Aimbot:Settings() AimSettings:AddDropdown({Text = "Mode", Flag = "Aim Mode", Options = {"Camera", "Mouse"}, Default = "Camera"}) AimSettings:AddMultiDropdown({Text = "Hitboxes", Flag = "Aim Hitboxes", Options = {"Head", "Torso", "Arms", "Legs", "Random", "Closest"}, Default = {"Head"}}) AimSettings:AddSlider({Text = "Smoothing", Flag = "Aim Speed", Min = 0, Max = 20, Default = 0, Increment = 0.1}) AimSettings:AddSlider({Text = "FOV", Flag = "Aim FOV", Min = 10, Max = 1000, Default = 160, Increment = 1, Suffix = " px"}) AimSettings:AddSlider({Text = "Deadzone", Flag = "Aim Deadzone", Min = 0, Max = 25, Default = 0, Increment = 1, Suffix = " px"}) AimSettings:AddSlider({Text = "Random Change Interval", Flag = "Aim Random Interval", Min = 0.1, Max = 2, Default = 0.5, Increment = 0.05, Suffix = " s"}) local SilentAim = AimSection:AddToggle({Text = "Silent Aim", Flag = "Silent Aim", Default = false}) SilentAim:AddKeybind({Mode = "Toggle"}) local SilentSettings = SilentAim:Settings() SilentSettings:AddMultiDropdown({Text = "Hitboxes", Flag = "Silent Aim Hitboxes", Options = {"Head", "Torso", "Arms", "Legs", "Random", "Closest"}, Default = {"Head"}}) SilentSettings:AddSlider({Text = "FOV", Flag = "Silent Aim FOV", Min = 10, Max = 1000, Default = 160, Increment = 1, Suffix = " px"}) SilentSettings:AddToggle({Text = "Visible Check", Flag = "Silent Aim Visible Check", Default = false}) SilentSettings:AddSlider({Text = "Random Change Interval", Flag = "Silent Aim Random Interval", Min = 0.1, Max = 2, Default = 0.5, Increment = 0.05, Suffix = " s"}) AimSection:AddToggle({Text = "Wall Check", Flag = "Wall Check", Default = false}) AimSection:AddToggle({Text = "Ignore Protected", Flag = "Ignore Protected", Default = false}) AimSection:AddToggle({Text = "Seed Prediction", Flag = "Seed Prediction", Default = false}) local Recoil = AimSection:AddToggle({Text = "Recoil Control", Flag = "Legit Recoil Control", Default = false}) local RecoilSettings = Recoil:Settings() RecoilSettings:AddSlider({Text = "Horizontal (X)", Flag = "Legit Recoil X", Min = 0, Max = 100, Default = 100, Increment = 1, Suffix = "%"}) RecoilSettings:AddSlider({Text = "Vertical (Y)", Flag = "Legit Recoil Y", Min = 0, Max = 100, Default = 100, Increment = 1, Suffix = "%"}) local FOVSection = AimPage:AddSection({Title = "FOV Circle", Icon = "Bullseye", Side = 2}) local FOVCircle = FOVSection:AddToggle({Text = "Show Circle", Flag = "Aim FOV Circle", Default = false}) Colors["Aim FOV Color A"] = FOVCircle:AddColorPicker({Text = "Circle Color", Flag = "Aim FOV Color A", Default = White}) local FOVSettings = FOVCircle:Settings() FOVSettings:AddDropdown({Text = "Position", Flag = "Aim FOV Position", Options = {"Center", "Mouse"}, Default = "Center"}) FOVSettings:AddSlider({Text = "Thickness", Flag = "Aim FOV Thickness", Min = 1, Max = 5, Default = 1, Increment = 1}) local FOVGradient = FOVSettings:AddToggle({Text = "Gradient", Flag = "Aim FOV Gradient", Default = false}) Colors["Aim FOV Color B"] = FOVGradient:AddColorPicker({Text = "End Color", Flag = "Aim FOV Color B", Default = White}) FOVGradient:Settings():AddSlider({Text = "Rotation", Flag = "Aim FOV Rotation", Min = -180, Max = 180, Default = 0, Increment = 1, Suffix = "°"}) local FOVFill = FOVSettings:AddToggle({Text = "Fill", Flag = "Aim FOV Fill", Default = false}) FOVFill:Settings():AddSlider({Text = "Opacity", Flag = "Aim FOV Fill Opacity", Min = 0, Max = 1, Default = 0.15, Increment = 0.01}) local SilentCircle = FOVSection:AddToggle({Text = "Silent Aim Circle", Flag = "Silent Aim FOV Circle", Default = false}) Colors["Silent Aim FOV Color"] = SilentCircle:AddColorPicker({Text = "Circle Color", Flag = "Silent Aim FOV Color", Default = White}) local SilentCircleSettings = SilentCircle:Settings() SilentCircleSettings:AddSlider({Text = "Thickness", Flag = "Silent Aim FOV Thickness", Min = 1, Max = 5, Default = 1, Increment = 1}) local SilentFill = SilentCircleSettings:AddToggle({Text = "Fill", Flag = "Silent Aim FOV Fill", Default = false}) SilentFill:Settings():AddSlider({Text = "Opacity", Flag = "Silent Aim FOV Fill Opacity", Min = 0, Max = 1, Default = 0.15, Increment = 0.01}) local Snapline = AimPage:AddSection({Title = "Target", Icon = "HeartCrack", Side = 2}):AddToggle({Text = "Snapline", Flag = "Target Snapline", Default = false}) Colors["Target Snapline Color"] = Snapline:AddColorPicker({Text = "Line Color", Flag = "Target Snapline Color", Default = White}) local Trigger = TriggerPage:AddSection({Title = "Triggerbot", Icon = "HeartCrack", Side = 1}):AddToggle({Text = "Triggerbot", Flag = "Triggerbot", Default = false}) Trigger:AddKeybind({Mode = "Toggle"}) local TriggerSettings = Trigger:Settings() TriggerSettings:AddDropdown({Text = "Mode", Flag = "Trigger Mode", Options = {"Mouse", "Seed"}, Default = "Mouse"}) TriggerSettings:AddDropdown({Text = "Position", Flag = "Trigger Position", Options = {"Center", "Mouse"}, Default = "Center"}) TriggerSettings:AddToggle({Text = "Head Only", Flag = "Trigger Head Only", Default = false}) local RageSection = RagePage:AddSection({Title = "Rage", Icon = "Robot", Side = 1}) local Rage = RageSection:AddToggle({Text = "Ragebot", Flag = "Ragebot", Default = false}) Rage:AddKeybind({Mode = "Toggle"}) local RageSettings = Rage:Settings() RageSettings:AddSlider({Text = "Range", Flag = "Rage Range", Min = 10, Max = 2000, Default = 300, Increment = 1, Suffix = " st"}) RageSettings:AddSlider({Text = "Minimum Damage", Flag = "Rage Minimum Damage", Min = 0, Max = 200, Default = 0, Increment = 1, Suffix = " HP"}) local RageSmoothing = RageSettings:AddToggle({Text = "Smooth Aim", Flag = "Rage Smooth Aim", Default = false}) RageSmoothing:Settings():AddSlider({Text = "Turn Speed", Flag = "Rage Smooth Aim Speed", Min = 90, Max = 1080, Default = 720, Increment = 10, Suffix = " deg/s"}) RageSection:AddDropdown({Text = "Target Priority", Flag = "Rage Target Priority", Options = {"Highest Damage", "Closest", "Crosshair", "Lowest Health"}, Default = "Highest Damage"}) RageSection:AddDropdown({Text = "Hitbox", Flag = "Rage Hitbox", Options = {"Highest Damage", "Head", "Torso", "Arms", "Legs"}, Default = "Highest Damage"}) RageSection:AddToggle({Text = "Hitscan", Flag = "Rage Hitscan", Default = false}) RageSection:AddToggle({Text = "Wallbang", Flag = "Rage Wallbang", Default = false}) RageSection:AddToggle({Text = "Auto Stop", Flag = "Rage Auto Stop", Default = false}) RageSection:AddToggle({Text = "Auto Scope", Flag = "Rage Auto Scope", Default = false}) RageSection:AddToggle({Text = "Auto Reload", Flag = "Rage Auto Reload", Default = false}) local Crouch = RageSection:AddToggle({Text = "Auto Crouch", Flag = "Rage Auto Crouch", Default = false}) Crouch:Settings():AddSlider({Text = "Peek Lead Time", Flag = "Rage Crouch Lead Time", Min = 0.05, Max = 0.35, Default = 0.15, Increment = 0.01, Suffix = " s"}) RageSection:AddToggle({Text = "Auto Peek", Flag = "Auto Peek", Default = false}):AddKeybind({Mode = "Hold", Default = Enum.KeyCode.X}) local Accuracy = RagePage:AddSection({Title = "Accuracy", Icon = "Bullseye", Side = 2}) local AccuracyCheck = Accuracy:AddToggle({Text = "Accuracy Check", Flag = "Rage Accuracy Check", Default = false}) AccuracyCheck:Settings():AddSlider({Text = "Minimum Estimated Chance", Flag = "Rage Minimum Hit Chance", Min = 1, Max = 100, Default = 65, Increment = 1, Suffix = "%"}) Accuracy:AddToggle({Text = "No Recoil", Flag = "No Recoil", Default = false}) local NoSpread = Accuracy:AddToggle({Text = "No Spread", Flag = "No Spread", Default = false}) local SpreadSettings = NoSpread:Settings() SpreadSettings:AddToggle({Text = "Fixed Pattern Only", Flag = "No Spread Fixed Pattern", Default = false}) SpreadSettings:AddToggle({Text = "Vary Head Point", Flag = "No Spread Random Head", Default = true}) Accuracy:AddToggle({Text = "Rapid Fire", Flag = "Rapid Fire", Default = false}) Accuracy:AddToggle({Text = "Instant Reload", Flag = "Instant Reload", Default = false}) local Knife = RagePage:AddSection({Title = "Knife", Icon = "Knife", Side = 2}):AddToggle({Text = "Knifebot", Flag = "Knifebot", Default = false}) Knife:AddKeybind({Mode = "Toggle"}) local KnifeSettings = Knife:Settings() KnifeSettings:AddDropdown({Text = "Attack", Flag = "Knife Mode", Options = {"Stab", "Slash"}, Default = "Stab"}) KnifeSettings:AddSlider({Text = "Range", Flag = "Knife Range", Min = 1, Max = 12, Default = 7, Increment = 0.5, Suffix = " st"}) local AntiAim = AntiAimPage:AddSection({Title = "Anti Aim", Icon = "Wrench", Side = 1}):AddToggle({Text = "Anti Aim", Flag = "Anti Aim", Default = false}) AntiAim:AddKeybind({Mode = "Toggle"}) local AntiSettings = AntiAim:Settings() AntiSettings:AddDropdown({Text = "Yaw", Flag = "Anti Aim Yaw", Options = {"Backward", "Left", "Right", "Spin", "Jitter", "Random"}, Default = "Backward"}) AntiSettings:AddDropdown({Text = "Pitch", Flag = "Anti Aim Pitch", Options = {"None", "Up", "Down"}, Default = "None"}) AntiSettings:AddSlider({Text = "Spin Speed", Flag = "Spin Speed", Min = 30, Max = 720, Default = 180, Increment = 1, Suffix = "°/s"}) AntiSettings:AddSlider({Text = "Jitter Angle", Flag = "Jitter Angle", Min = 0, Max = 180, Default = 90, Increment = 1, Suffix = "°"}) AntiSettings:AddToggle({Text = "Defensive", Flag = "Defensive Anti Aim", Default = false}) local FakeYaw = AntiAimPage:AddSection({Title = "Fake Angles", Icon = "Wrench", Side = 2}):AddToggle({Text = "Fake Yaw", Flag = "Fake Yaw", Default = false}) FakeYaw:Settings():AddSlider({Text = "Offset", Flag = "Fake Yaw Offset", Min = -180, Max = 180, Default = 90, Increment = 1, Suffix = "°"}) local FakePitch = AntiAimPage:AddSection({Title = "Fake Pitch", Icon = "Wrench", Side = 2}):AddToggle({Text = "Fake Pitch", Flag = "Fake Pitch", Default = false}) FakePitch:Settings():AddSlider({Text = "Angle", Flag = "Fake Pitch Angle", Min = -89, Max = 89, Default = 0, Increment = 1, Suffix = "°"}) end do local Library = State.Library local Window = State.UI.Window local Colors = State.UI.Colors local Existing = {} for Flag in Library.Elements do Existing[Flag] = true end local White, Black = Color3.new(1, 1, 1), Color3.new(0, 0, 0) local PlayersPage, C4Page = State.UI.Tabs.Players, State.UI.Tabs.Players local ESP = PlayersPage:AddSection({Title = "ESP", Icon = "Smile", Side = 1}) local Enabled = ESP:AddToggle({Text = "Enabled", Flag = "Esp Enabled", Default = false}) local Base = Enabled:Settings() Base:AddToggle({Text = "Visible Check", Flag = "ESP Visible Check", Default = false}) local Limit = Base:AddToggle({Text = "Distance Limit", Flag = "Distance Limit", Default = false}) Limit:Settings():AddSlider({Text = "Max Distance", Flag = "Max Distance", Min = 0, Max = 10000, Default = 1000, Increment = 1, Suffix = " st"}) Base:AddSlider({Text = "Text Size", Flag = "Text Size", Min = 8, Max = 24, Default = 10, Increment = 1, Suffix = " px"}) Base:AddDropdown({Text = "Font", Flag = "ESP Font", Options = {"Pixel", "Code", "Gotham", "Arial"}, Default = "Pixel"}) local TextOutline = Base:AddToggle({Text = "Text Outline", Flag = "ESP Text Outline", Default = false}) Colors["ESP Text Outline Color"] = TextOutline:AddColorPicker({Text = "Outline Color", Flag = "ESP Text Outline Color", Default = Black}) local Box = ESP:AddToggle({Text = "Box", Flag = "Box", Default = false}) Colors["Box Color"] = Box:AddColorPicker({Text = "Box Color", Flag = "Box Color", Default = White}) local BoxSettings = Box:Settings() BoxSettings:AddDropdown({Text = "Style", Flag = "Box Style", Options = {"Full", "Corners"}, Default = "Full"}) BoxSettings:AddSlider({Text = "Corner Length", Flag = "Box Corner Length", Min = 10, Max = 50, Default = 25, Increment = 1, Suffix = "%"}) BoxSettings:AddSlider({Text = "Thickness", Flag = "Box Thickness", Min = 1, Max = 4, Default = 1, Increment = 1}) local BoxGradient = BoxSettings:AddToggle({Text = "Gradient", Flag = "Box Gradient", Default = false}) Colors["High Contrast Box"] = BoxGradient:AddColorPicker({Text = "Start Color", Flag = "High Contrast Box", Default = White}) Colors["Low Contrast Box"] = BoxGradient:AddColorPicker({Text = "End Color", Flag = "Low Contrast Box", Default = White}) BoxGradient:Settings():AddSlider({Text = "Rotation", Flag = "Box Gradient Rotation", Min = -180, Max = 180, Default = 0, Increment = 1, Suffix = "°"}) local Outline = BoxSettings:AddToggle({Text = "Outline", Flag = "Box Outline Enabled", Default = false}) Colors["Box Outline Color"] = Outline:AddColorPicker({Text = "Outline Color", Flag = "Box Outline Color", Default = Black, Alpha = 0.5}) Outline:Settings():AddSlider({Text = "Thickness", Flag = "Box Outline Thickness", Min = 1, Max = 6, Default = 3, Increment = 1}) local Fill = BoxSettings:AddToggle({Text = "Fill", Flag = "Box Fill", Default = false}) Colors["Fill Color"] = Fill:AddColorPicker({Text = "Fill Color", Flag = "Fill Color", Default = White, Alpha = 0.5}) local FillGradient = Fill:Settings():AddToggle({Text = "Gradient", Flag = "Box Fill Gradient", Default = false}) Colors["High Contrast Fill"] = FillGradient:AddColorPicker({Text = "Start Color", Flag = "High Contrast Fill", Default = White}) Colors["Low Contrast Fill"] = FillGradient:AddColorPicker({Text = "End Color", Flag = "Low Contrast Fill", Default = White}) FillGradient:Settings():AddSlider({Text = "Rotation", Flag = "Box Fill Rotation", Min = -180, Max = 180, Default = 0, Increment = 1, Suffix = "°"}) local Glow = BoxSettings:AddToggle({Text = "Glow", Flag = "Box Glow", Default = false}) Colors["Glow Color"] = Glow:AddColorPicker({Text = "Glow Color", Flag = "Glow Color", Default = White, Alpha = 0.5}) local GlowSettings = Glow:Settings() GlowSettings:AddSlider({Text = "Opacity", Flag = "Glow Opacity", Min = 0, Max = 1, Default = 0.2, Increment = 0.01}) GlowSettings:AddSlider({Text = "Size", Flag = "Glow Size", Min = 10, Max = 100, Default = 45, Increment = 1}) local GlowGradient = GlowSettings:AddToggle({Text = "Gradient", Flag = "Box Glow Gradient", Default = false}) Colors["High Contrast Glow"] = GlowGradient:AddColorPicker({Text = "Start Color", Flag = "High Contrast Glow", Default = White}) Colors["Low Contrast Glow"] = GlowGradient:AddColorPicker({Text = "End Color", Flag = "Low Contrast Glow", Default = White}) GlowGradient:Settings():AddSlider({Text = "Rotation", Flag = "Box Glow Rotation", Min = -180, Max = 180, Default = 0, Increment = 1, Suffix = "°"}) local Health = ESP:AddToggle({Text = "Healthbar", Flag = "Healthbar", Default = false}) Colors["Health Color"] = Health:AddColorPicker({Text = "Health Color", Flag = "Health Color", Default = Color3.fromRGB(0, 255, 0)}) local HealthSettings = Health:Settings() HealthSettings:AddSlider({Text = "Width", Flag = "Healthbar Width", Min = 1, Max = 8, Default = 4, Increment = 1}) local HealthGradient = HealthSettings:AddToggle({Text = "Gradient", Flag = "Health Gradient", Default = false}) Colors["High Health"] = HealthGradient:AddColorPicker({Text = "High Health", Flag = "High Health", Default = Color3.fromRGB(0, 255, 0)}) Colors["Mid Health"] = HealthGradient:AddColorPicker({Text = "Mid Health", Flag = "Mid Health", Default = Color3.fromRGB(255, 165, 0)}) Colors["Low Health"] = HealthGradient:AddColorPicker({Text = "Low Health", Flag = "Low Health", Default = Color3.fromRGB(255, 0, 0)}) local HealthText = HealthSettings:AddToggle({Text = "Text", Flag = "Healthbar Text", Default = false}) Colors["Health Text Color"] = HealthText:AddColorPicker({Text = "Text Color", Flag = "Health Text Color", Default = White}) HealthText:Settings():AddDropdown({Text = "Color Mode", Flag = "Health Text Color Mode", Options = {"Health", "Custom"}, Default = "Health"}) local Names = ESP:AddToggle({Text = "Names", Flag = "Names", Default = false}) Colors["Names Text Color"] = Names:AddColorPicker({Text = "Name Color", Flag = "Names Text Color", Default = White}) Names:Settings():AddDropdown({Text = "Name Type", Flag = "ESP Name Type", Options = {"Display Name", "Username", "Both"}, Default = "Display Name"}) local Distance = ESP:AddToggle({Text = "Distance", Flag = "Distance Text", Default = false}) Colors["Distance Text Color"] = Distance:AddColorPicker({Text = "Distance Color", Flag = "Distance Text Color", Default = White}) local Weapon = ESP:AddToggle({Text = "Weapon", Flag = "Weapon Text", Default = false}) Colors["Weapon Text Color"] = Weapon:AddColorPicker({Text = "Weapon Color", Flag = "Weapon Text Color", Default = White}) local Status = ESP:AddToggle({Text = "Flags", Flag = "Flags", Default = false}) Colors["Flags Text Color"] = Status:AddColorPicker({Text = "Flags Color", Flag = "Flags Text Color", Default = White}) Status:Settings():AddMultiDropdown({Text = "Show", Flag = "ESP Flags", Options = {"Defuse kit", "Bomb", "Planting", "Defusing", "Aiming", "Yaw", "Pitch", "Team"}, Default = {"Defuse kit", "Bomb", "Planting", "Defusing", "Aiming"}}) local Skeleton = ESP:AddToggle({Text = "Skeleton", Flag = "Skeletons", Default = false}) Colors["Skeleton Color"] = Skeleton:AddColorPicker({Text = "Skeleton Color", Flag = "Skeleton Color", Default = White}) local SkeletonSettings = Skeleton:Settings() SkeletonSettings:AddSlider({Text = "Thickness", Flag = "Skeleton Thickness", Min = 1, Max = 4, Default = 1, Increment = 1}) local SkeletonOutline = SkeletonSettings:AddToggle({Text = "Outline", Flag = "Skeleton Outline", Default = false}) Colors["Skeleton Outline Color"] = SkeletonOutline:AddColorPicker({Text = "Outline Color", Flag = "Skeleton Outline Color", Default = Black}) SkeletonOutline:Settings():AddSlider({Text = "Thickness", Flag = "Skeleton Outline Thickness", Min = 1, Max = 6, Default = 3, Increment = 1}) local PlayerExtras = PlayersPage:AddSection({Title = "Extras", Icon = "Smile", Side = 2}) local Armor = PlayerExtras:AddToggle({Text = "Armor Bar", Flag = "Player Armor", Default = false}) Colors["Player Armor Color"] = Armor:AddColorPicker({Text = "Armor Color", Flag = "Player Armor Color", Default = Color3.fromRGB(60, 160, 255)}) Armor:Settings():AddSlider({Text = "Width", Flag = "Player Armor Width", Min = 3, Max = 8, Default = 4, Increment = 1, Suffix = " px"}) local WeaponIcon = PlayerExtras:AddToggle({Text = "Gun Icon", Flag = "Player Icon", Default = false}) Colors["Player Icon Color"] = WeaponIcon:AddColorPicker({Text = "Icon Color", Flag = "Player Icon Color", Default = White}) WeaponIcon:Settings():AddSlider({Text = "Size", Flag = "Player Icon Size", Min = 12, Max = 32, Default = 20, Increment = 1, Suffix = " px"}) local AmmoText = PlayerExtras:AddToggle({Text = "Ammo Text", Flag = "Player Ammo Text", Default = false}) Colors["Player Ammo Color"] = AmmoText:AddColorPicker({Text = "Ammo Color", Flag = "Player Ammo Color", Default = White}) PlayerExtras:AddToggle({Text = "Ammo Bar", Flag = "Player Ammo Bar", Default = false}):Settings():AddSlider({Text = "Height", Flag = "Player Ammo Bar Height", Min = 3, Max = 8, Default = 4, Increment = 1, Suffix = " px"}) local HeadDot = PlayerExtras:AddToggle({Text = "Head Dot", Flag = "Player Head Dot", Default = false}) Colors["Player Head Dot Color"] = HeadDot:AddColorPicker({Text = "Dot Color", Flag = "Player Head Dot Color", Default = White}) HeadDot:Settings():AddSlider({Text = "Size", Flag = "Player Head Dot Size", Min = 2, Max = 15, Default = 5, Increment = 1, Suffix = " px"}) local Offscreen = PlayersPage:AddSection({Title = "Offscreen", Icon = "Bullseye", Side = 2}) local Arrows = Offscreen:AddToggle({Text = "Offscreen Arrows", Flag = "Player Offscreen Arrows", Default = false}) Colors["Player Arrow Color"] = Arrows:AddColorPicker({Text = "Arrow Color", Flag = "Player Arrow Color", Default = White}) local ChamsSection = PlayersPage:AddSection({Title = "Chams", Icon = "Cube", Side = 2}) local Chams = ChamsSection:AddToggle({Text = "Chams", Flag = "Player Chams", Default = false}) Colors["Player Chams Color"] = Chams:AddColorPicker({Text = "Fill Color", Flag = "Player Chams Color", Default = Color3.fromRGB(255, 70, 70)}) Colors["Player Chams Outline Color"] = Chams:AddColorPicker({Text = "Outline Color", Flag = "Player Chams Outline Color", Default = White}) Chams:Settings():AddSlider({Text = "Opacity", Flag = "Player Chams Opacity", Min = 0, Max = 1, Default = 0.35, Increment = 0.01}) local C4 = C4Page:AddSection({Title = "C4", Icon = "Bomb", Side = 1}) C4:AddToggle({Text = "Enabled", Flag = "Bomb ESP", Default = false}) local C4Box = C4:AddToggle({Text = "Box", Flag = "C4 Box", Default = false}) Colors["C4 Box Color"] = C4Box:AddColorPicker({Text = "Box Color", Flag = "C4 Box Color", Default = White}) local C4BoxSettings = C4Box:Settings() C4BoxSettings:AddSlider({Text = "Thickness", Flag = "C4 Box Thickness", Min = 1, Max = 4, Default = 1, Increment = 1}) C4BoxSettings:AddToggle({Text = "Outline", Flag = "C4 Box Outline", Default = false}) local C4Fill = C4BoxSettings:AddToggle({Text = "Fill", Flag = "C4 Box Fill", Default = false}) Colors["C4 Box Fill Color"] = C4Fill:AddColorPicker({Text = "Fill Color", Flag = "C4 Box Fill Color", Default = White}) C4Fill:Settings():AddSlider({Text = "Opacity", Flag = "C4 Box Fill Opacity", Min = 0, Max = 1, Default = 0.2, Increment = 0.01}) local C4Gradient = C4Fill:Settings():AddToggle({Text = "Gradient", Flag = "C4 Box Gradient", Default = false}) Colors["C4 Box Gradient Color"] = C4Gradient:AddColorPicker({Text = "End Color", Flag = "C4 Box Gradient Color", Default = White}) C4Gradient:Settings():AddSlider({Text = "Rotation", Flag = "C4 Box Gradient Rotation", Min = -180, Max = 180, Default = 90, Increment = 1, Suffix = "°"}) local C4Name = C4:AddToggle({Text = "Name", Flag = "C4 Name", Default = false}) Colors["C4 Name Color"] = C4Name:AddColorPicker({Text = "Name Color", Flag = "C4 Name Color", Default = White}) local C4Distance = C4:AddToggle({Text = "Distance", Flag = "C4 Distance", Default = false}) Colors["C4 Distance Color"] = C4Distance:AddColorPicker({Text = "Distance Color", Flag = "C4 Distance Color", Default = White}) local C4Icon = C4:AddToggle({Text = "Icon", Flag = "C4 Icon", Default = false}) Colors["C4 Icon Color"] = C4Icon:AddColorPicker({Text = "Icon Color", Flag = "C4 Icon Color", Default = White}) local C4Timer = C4:AddToggle({Text = "Explosion Time", Flag = "C4 Timer Text", Default = false}) Colors["C4 Timer Color"] = C4Timer:AddColorPicker({Text = "Timer Color", Flag = "C4 Timer Color", Default = Color3.fromRGB(255, 120, 90)}) C4:AddToggle({Text = "Explosion Bar", Flag = "C4 Timer Bar", Default = false}) for Flag, Element in Library.Elements do if not Existing[Flag] and Element.OnChanged then Element:OnChanged(function() State.UI:RefreshPreview() end) end end end do local Library = State.Library local Window = State.UI.Window local Colors = State.UI.Colors local White, Black = Color3.new(1, 1, 1), Color3.new(0, 0, 0) local WorldPage, DroppedPage, EffectsPage = State.UI.Tabs.World, State.UI.Tabs.World, State.UI.Tabs.Effects local Dropped = DroppedPage:AddSection({Title = "Dropped Weapons", Icon = "Gun", Side = 1}) Dropped:AddToggle({Text = "Enabled", Flag = "DroppedWeapon ESP", Default = false}) local DroppedBox = Dropped:AddToggle({Text = "Box", Flag = "Dropped Box", Default = false}) Colors["Dropped Box Color"] = DroppedBox:AddColorPicker({Text = "Box Color", Flag = "Dropped Box Color", Default = White}) local DroppedBoxSettings = DroppedBox:Settings() DroppedBoxSettings:AddSlider({Text = "Thickness", Flag = "Dropped Box Thickness", Min = 1, Max = 4, Default = 1, Increment = 1}) DroppedBoxSettings:AddToggle({Text = "Outline", Flag = "Dropped Box Outline", Default = false}) local DroppedFill = DroppedBoxSettings:AddToggle({Text = "Fill", Flag = "Dropped Box Fill", Default = false}) Colors["Dropped Box Fill Color"] = DroppedFill:AddColorPicker({Text = "Fill Color", Flag = "Dropped Box Fill Color", Default = White}) DroppedFill:Settings():AddSlider({Text = "Opacity", Flag = "Dropped Box Fill Opacity", Min = 0, Max = 1, Default = 0.2, Increment = 0.01}) local DroppedGradient = DroppedFill:Settings():AddToggle({Text = "Gradient", Flag = "Dropped Box Gradient", Default = false}) Colors["Dropped Box Gradient Color"] = DroppedGradient:AddColorPicker({Text = "End Color", Flag = "Dropped Box Gradient Color", Default = White}) DroppedGradient:Settings():AddSlider({Text = "Rotation", Flag = "Dropped Box Gradient Rotation", Min = -180, Max = 180, Default = 90, Increment = 1, Suffix = "°"}) local DroppedName = Dropped:AddToggle({Text = "Name", Flag = "Dropped Name", Default = false}) Colors["Dropped Name Color"] = DroppedName:AddColorPicker({Text = "Name Color", Flag = "Dropped Name Color", Default = White}) local DroppedDistance = Dropped:AddToggle({Text = "Distance", Flag = "Dropped Distance", Default = false}) Colors["Dropped Distance Color"] = DroppedDistance:AddColorPicker({Text = "Distance Color", Flag = "Dropped Distance Color", Default = White}) local DroppedIcon = Dropped:AddToggle({Text = "Icon", Flag = "Dropped Icon", Default = false}) Colors["Dropped Icon Color"] = DroppedIcon:AddColorPicker({Text = "Icon Color", Flag = "Dropped Icon Color", Default = White}) local DroppedAmmo = Dropped:AddToggle({Text = "Ammo Text", Flag = "Dropped Ammo Text", Default = false}) Colors["Dropped Ammo Color"] = DroppedAmmo:AddColorPicker({Text = "Ammo Color", Flag = "Dropped Ammo Color", Default = White}) Dropped:AddToggle({Text = "Ammo Bar", Flag = "Dropped Ammo Bar", Default = false}) local HitEffects = EffectsPage:AddSection({Title = "Hits", Icon = "Globe", Side = 1}) local HitNotification = HitEffects:AddToggle({Text = "Hit Notification", Flag = "Hit Notification", Default = false}) Colors["Hit Notification Color"] = HitNotification:AddColorPicker({Text = "Notification Color", Flag = "Hit Notification Color", Default = White}) local HitSound = HitEffects:AddToggle({Text = "Hit Sound", Flag = "Hit Sound", Default = false}) local HitSoundSettings = HitSound:Settings() HitSoundSettings:AddDropdown({Text = "Headshot Preset", Flag = "Headshot Sound Preset", Options = {"Custom", "Primordial", "Neverlose", "Sparkle", "MC Bow", "Skeet", "Break", "Rust"}, Default = "Custom"}) HitSoundSettings:AddDropdown({Text = "Bodyshot Preset", Flag = "Bodyshot Sound Preset", Options = {"Custom", "Primordial", "Neverlose", "Sparkle", "MC Bow", "Skeet", "Break", "Rust"}, Default = "Custom"}) HitSoundSettings:AddInput({Text = "Headshot Sound ID Or File", Flag = "Headshot Sound", Default = ""}) HitSoundSettings:AddInput({Text = "Bodyshot Sound ID Or File", Flag = "Bodyshot Sound", Default = ""}) HitSoundSettings:AddSlider({Text = "Volume", Flag = "Hit Sound Volume", Min = 0, Max = 5, Default = 1, Increment = 0.1}) HitSoundSettings:AddSlider({Text = "Speed", Flag = "Hit Sound Speed", Min = 0.5, Max = 2, Default = 1, Increment = 0.05}) HitSoundSettings:AddButton({Text = "Preview Headshot", Callback = function() if State.Controllers.Effects then State.Controllers.Effects:PreviewHitSound(true) end end}) HitSoundSettings:AddButton({Text = "Preview Bodyshot", Callback = function() if State.Controllers.Effects then State.Controllers.Effects:PreviewHitSound(false) end end}) local Tracer = EffectsPage:AddSection({Title = "Bullets", Icon = "Globe", Side = 2}):AddToggle({Text = "Bullet Tracer", Flag = "Bullet Tracer", Default = false}) Colors["Bullet Tracer Color"] = Tracer:AddColorPicker({Text = "Tracer Color", Flag = "Bullet Tracer Color", Default = White}) local TracerSettings = Tracer:Settings() TracerSettings:AddDropdown({Text = "Style", Flag = "Bullet Tracer Style", Options = {"Solid", "Laser", "Light", "Flow"}, Default = "Solid"}) TracerSettings:AddSlider({Text = "Lifetime", Flag = "Bullet Tracer Lifetime", Min = 0.1, Max = 10, Default = 2, Increment = 0.1, Suffix = " s"}) TracerSettings:AddSlider({Text = "Width", Flag = "Bullet Tracer Width", Min = 0.01, Max = 1, Default = 0.05, Increment = 0.01}) TracerSettings:AddSlider({Text = "Opacity", Flag = "Bullet Tracer Opacity", Min = 0, Max = 1, Default = 0.9, Increment = 0.01}) TracerSettings:AddSlider({Text = "Texture Speed", Flag = "Bullet Tracer Texture Speed", Min = 0, Max = 5, Default = 1.5, Increment = 0.1}) Colors["Bullet Tracer End Color"] = TracerSettings:AddToggle({Text = "Gradient", Flag = "Bullet Tracer Gradient", Default = false}):AddColorPicker({Text = "End Color", Flag = "Bullet Tracer End Color", Default = Color3.fromRGB(180, 130, 255)}) local Impact = EffectsPage:AddSection({Title = "Impacts", Icon = "Globe", Side = 2}):AddToggle({Text = "Bullet Impact", Flag = "Bullet Impact", Default = false}) Colors["Bullet Impact Color"] = Impact:AddColorPicker({Text = "Impact Color", Flag = "Bullet Impact Color", Default = Color3.fromRGB(255, 70, 70)}) local ImpactSettings = Impact:Settings() ImpactSettings:AddSlider({Text = "Lifetime", Flag = "Bullet Impact Lifetime", Min = 0.1, Max = 10, Default = 2, Increment = 0.1, Suffix = " s"}) ImpactSettings:AddSlider({Text = "Size", Flag = "Bullet Impact Size", Min = 0.1, Max = 1, Default = 0.3, Increment = 0.05}) local SoundESP = EffectsPage:AddSection({Title = "Sound ESP", Icon = "Globe", Side = 1}):AddToggle({Text = "Sound ESP", Flag = "Sound ESP", Default = false}) Colors["Sound ESP Color"] = SoundESP:AddColorPicker({Text = "Text Color", Flag = "Sound ESP Color", Default = White}) local SoundSettings = SoundESP:Settings() SoundSettings:AddMultiDropdown({Text = "Sounds", Flag = "Sound ESP Types", Options = {"Weapons", "Bomb", "Footsteps", "Impacts", "Items", "Misc", "Other"}, Default = {}}) SoundSettings:AddSlider({Text = "Lifetime", Flag = "Sound ESP Lifetime", Min = 1, Max = 15, Default = 4, Increment = 1, Suffix = " s"}) local ShootSound = EffectsPage:AddSection({Title = "Shoot Sound", Icon = "Globe", Side = 1}):AddToggle({Text = "Custom Shoot Sound", Flag = "Custom Shoot Sound", Default = false}) local ShootSettings = ShootSound:Settings() ShootSettings:AddInput({Text = "Sound ID Or File", Flag = "Shoot Sound Id", Default = ""}) ShootSettings:AddSlider({Text = "Volume", Flag = "Shoot Sound Volume", Min = 0, Max = 5, Default = 1, Increment = 0.1}) ShootSettings:AddSlider({Text = "Speed", Flag = "Shoot Sound Speed", Min = 0.5, Max = 2, Default = 1, Increment = 0.05}) ShootSettings:AddToggle({Text = "Replace Original", Flag = "Replace Shoot Sound", Default = false}) do local World = WorldPage:AddSection({Title = "Lighting", Icon = "Globe", Side = 1}) local Bright = World:AddToggle({Text = "Fullbright", Flag = "Fullbright", Default = false}) local BrightSettings = Bright:Settings() BrightSettings:AddSlider({Text = "Brightness", Flag = "World Brightness", Min = 0, Max = 10, Default = 2, Increment = 0.1}) BrightSettings:AddDropdown({Text = "Shadows", Flag = "World Shadows", Options = {"Off", "On"}, Default = "Off"}) local Shadows = World:AddToggle({Text = "Global Shadows", Flag = "Global Shadows Enabled", Default = false}) Shadows:Settings():AddDropdown({Text = "State", Flag = "Global Shadows", Options = {"Off", "On"}, Default = "On"}) local Time = World:AddToggle({Text = "Time Changer", Flag = "Custom Time", Default = false}) Time:Settings():AddSlider({Text = "Clock Time", Flag = "Clock Time", Min = 0, Max = 24, Default = 12, Increment = 0.1, Suffix = " h"}) local Ambient = World:AddToggle({Text = "Ambient Changer", Flag = "Ambient Override", Default = false}) Colors["Ambient Color"] = Ambient:AddColorPicker({Text = "Ambient Color", Flag = "Ambient Color", Default = Color3.fromRGB(178, 178, 178)}) local Fog = World:AddToggle({Text = "Remove Fog", Flag = "Remove Fog", Default = false}) Fog:Settings():AddSlider({Text = "Distance", Flag = "Fog Distance", Min = 1000, Max = 1000000, Default = 1000000, Increment = 1000, Suffix = " st"}) local Exposure = World:AddToggle({Text = "Exposure", Flag = "Exposure Changer", Default = false}) Exposure:Settings():AddSlider({Text = "Compensation", Flag = "World Exposure", Min = -3, Max = 3, Default = 0, Increment = 0.05}) local Environment = World:AddToggle({Text = "Environment Lighting", Flag = "Environment Changer", Default = false}) Colors["Light Top Color"] = Environment:AddColorPicker({Text = "Top Light", Flag = "Light Top Color", Default = Color3.new(0, 0, 0)}) Colors["Light Bottom Color"] = Environment:AddColorPicker({Text = "Bottom Light", Flag = "Light Bottom Color", Default = Color3.new(0, 0, 0)}) local EnvironmentSettings = Environment:Settings() EnvironmentSettings:AddSlider({Text = "Diffuse", Flag = "Environment Diffuse", Min = 0, Max = 1, Default = 1, Increment = 0.01}) EnvironmentSettings:AddSlider({Text = "Reflections", Flag = "Environment Specular", Min = 0, Max = 1, Default = 1, Increment = 0.01}) EnvironmentSettings:AddSlider({Text = "Sun Latitude", Flag = "Sun Latitude", Min = -90, Max = 90, Default = 41.73, Increment = 0.1, Suffix = "°"}) local Post = WorldPage:AddSection({Title = "Post Processing", Icon = "Globe", Side = 2}) local Bloom = Post:AddToggle({Text = "Bloom", Flag = "Bloom Changer", Default = false}) local BloomSettings = Bloom:Settings() BloomSettings:AddSlider({Text = "Intensity", Flag = "Bloom Intensity", Min = 0, Max = 5, Default = 0.6, Increment = 0.01}) BloomSettings:AddSlider({Text = "Size", Flag = "Bloom Size", Min = 0, Max = 56, Default = 24, Increment = 1}) BloomSettings:AddSlider({Text = "Threshold", Flag = "Bloom Threshold", Min = 0, Max = 4, Default = 0.9, Increment = 0.01}) local Grade = Post:AddToggle({Text = "Color Grading", Flag = "Color Grading", Default = false}) Colors["Grade Tint"] = Grade:AddColorPicker({Text = "Tint", Flag = "Grade Tint", Default = White}) local GradeSettings = Grade:Settings() GradeSettings:AddSlider({Text = "Brightness", Flag = "Grade Brightness", Min = -1, Max = 1, Default = 0, Increment = 0.01}) GradeSettings:AddSlider({Text = "Contrast", Flag = "Grade Contrast", Min = -1, Max = 1, Default = 0.15, Increment = 0.01}) GradeSettings:AddSlider({Text = "Saturation", Flag = "Grade Saturation", Min = -1, Max = 1, Default = 0.2, Increment = 0.01}) local Depth = Post:AddToggle({Text = "Depth Of Field", Flag = "Depth Of Field", Default = false}) local DepthSettings = Depth:Settings() DepthSettings:AddSlider({Text = "Focus Distance", Flag = "Focus Distance", Min = 0, Max = 500, Default = 25, Increment = 1, Suffix = " st"}) DepthSettings:AddSlider({Text = "Focus Radius", Flag = "Focus Radius", Min = 0, Max = 500, Default = 20, Increment = 1, Suffix = " st"}) DepthSettings:AddSlider({Text = "Near Blur", Flag = "Near Blur", Min = 0, Max = 1, Default = 0.1, Increment = 0.01}) DepthSettings:AddSlider({Text = "Far Blur", Flag = "Far Blur", Min = 0, Max = 1, Default = 0.3, Increment = 0.01}) local Air = WorldPage:AddSection({Title = "Atmosphere And Fog", Icon = "Globe", Side = 1}) local Atmosphere = Air:AddToggle({Text = "Atmosphere", Flag = "Atmosphere Changer", Default = false}) Colors["Atmosphere Color"] = Atmosphere:AddColorPicker({Text = "Color", Flag = "Atmosphere Color", Default = Color3.fromRGB(204, 217, 255)}) Colors["Atmosphere Decay"] = Atmosphere:AddColorPicker({Text = "Decay", Flag = "Atmosphere Decay", Default = Color3.fromRGB(102, 115, 140)}) local AtmosphereSettings = Atmosphere:Settings() AtmosphereSettings:AddSlider({Text = "Density", Flag = "Atmosphere Density", Min = 0, Max = 1, Default = 0.3, Increment = 0.01}) AtmosphereSettings:AddSlider({Text = "Offset", Flag = "Atmosphere Offset", Min = -1, Max = 1, Default = 0, Increment = 0.01}) AtmosphereSettings:AddSlider({Text = "Haze", Flag = "Atmosphere Haze", Min = 0, Max = 10, Default = 1, Increment = 0.1}) AtmosphereSettings:AddSlider({Text = "Glare", Flag = "Atmosphere Glare", Min = 0, Max = 10, Default = 0, Increment = 0.1}) local CustomFog = Air:AddToggle({Text = "Custom Fog", Flag = "Fog Changer", Default = false}) Colors["World Fog Color"] = CustomFog:AddColorPicker({Text = "Fog Color", Flag = "World Fog Color", Default = Color3.fromRGB(178, 191, 204)}) local FogSettings = CustomFog:Settings() FogSettings:AddSlider({Text = "Start", Flag = "World Fog Start", Min = 0, Max = 5000, Default = 0, Increment = 1, Suffix = " st"}) FogSettings:AddSlider({Text = "End", Flag = "World Fog End", Min = 1, Max = 10000, Default = 500, Increment = 1, Suffix = " st"}) local Water = WorldPage:AddSection({Title = "Water", Icon = "Globe", Side = 2}):AddToggle({Text = "Water Changer", Flag = "Water Changer", Default = false}) Colors["Water Color"] = Water:AddColorPicker({Text = "Water Color", Flag = "Water Color", Default = Color3.fromRGB(26, 102, 128)}) local WaterSettings = Water:Settings() WaterSettings:AddSlider({Text = "Transparency", Flag = "Water Transparency", Min = 0, Max = 1, Default = 0.3, Increment = 0.01}) WaterSettings:AddSlider({Text = "Reflectance", Flag = "Water Reflectance", Min = 0, Max = 1, Default = 0.5, Increment = 0.01}) WaterSettings:AddSlider({Text = "Wave Size", Flag = "Water Wave Size", Min = 0, Max = 1, Default = 0.15, Increment = 0.01}) WaterSettings:AddSlider({Text = "Wave Speed", Flag = "Water Wave Speed", Min = 0, Max = 100, Default = 10, Increment = 1}) local Sun = WorldPage:AddSection({Title = "Sun And Clouds", Icon = "Globe", Side = 2}):AddToggle({Text = "Sunrays Changer", Flag = "Sunrays Changer", Default = false}) local SunSettings = Sun:Settings() SunSettings:AddSlider({Text = "Intensity", Flag = "Sunrays Intensity", Min = 0, Max = 1, Default = 0.25, Increment = 0.01}) SunSettings:AddSlider({Text = "Spread", Flag = "Sunrays Spread", Min = 0, Max = 1, Default = 1, Increment = 0.01}) local Clouds = WorldPage:AddSection({Title = "Clouds", Icon = "Globe", Side = 2}):AddToggle({Text = "Cloud Changer", Flag = "Cloud Changer", Default = false}) Colors["Cloud Color"] = Clouds:AddColorPicker({Text = "Cloud Color", Flag = "Cloud Color", Default = White}) local CloudSettings = Clouds:Settings() CloudSettings:AddSlider({Text = "Cover", Flag = "Cloud Cover", Min = 0, Max = 1, Default = 0.5, Increment = 0.01}) CloudSettings:AddSlider({Text = "Density", Flag = "Cloud Density", Min = 0, Max = 1, Default = 0.6, Increment = 0.01}) local Weather = WorldPage:AddSection({Title = "Weather", Icon = "Globe", Side = 1}) local Rain = Weather:AddToggle({Text = "Rain", Flag = "Rain", Default = false}) Colors["Rain Color"] = Rain:AddColorPicker({Text = "Rain Color", Flag = "Rain Color", Default = Color3.fromRGB(204, 217, 255), EnableAlpha = true}) local RainSettings = Rain:Settings() RainSettings:AddSlider({Text = "Intensity", Flag = "Rain Intensity", Min = 0, Max = 1, Default = 0.45, Increment = 0.01}) RainSettings:AddSlider({Text = "Opacity", Flag = "Rain Opacity", Min = 0, Max = 1, Default = 0.65, Increment = 0.01}) RainSettings:AddSlider({Text = "Speed", Flag = "Rain Speed", Min = 0.1, Max = 1, Default = 0.8, Increment = 0.01}) RainSettings:AddSlider({Text = "Radius", Flag = "Rain Radius", Min = 24, Max = 80, Default = 48, Increment = 1, Suffix = " studs"}) RainSettings:AddSlider({Text = "Light Emission", Flag = "Rain Light Emission", Min = 0, Max = 1, Default = 0.05, Increment = 0.01}) RainSettings:AddSlider({Text = "Light Influence", Flag = "Rain Light Influence", Min = 0, Max = 1, Default = 0.9, Increment = 0.01}) RainSettings:AddToggle({Text = "Roof Check", Flag = "Rain Roof Check", Default = false}) Weather:AddToggle({Text = "Splashes", Flag = "Rain Splashes", Default = false}) local RainWind = Weather:AddToggle({Text = "Wind", Flag = "Rain Wind", Default = false}) local WindSettings = RainWind:Settings() WindSettings:AddSlider({Text = "Strength", Flag = "Rain Wind Strength", Min = 0, Max = 2, Default = 0.25, Increment = 0.01}) WindSettings:AddSlider({Text = "Direction", Flag = "Rain Wind Direction", Min = 0, Max = 360, Default = 0, Increment = 1, Suffix = "°"}) local RainSound = Weather:AddToggle({Text = "Rain Sound", Flag = "Rain Sound", Default = false}) RainSound:Settings():AddSlider({Text = "Volume", Flag = "Rain Volume", Min = 0, Max = 1, Default = 0.2, Increment = 0.01}) local Snow = Weather:AddToggle({Text = "Snow", Flag = "Snow", Default = false}) Colors["Snow Color"] = Snow:AddColorPicker({Text = "Snow Color", Flag = "Snow Color", Default = White, EnableAlpha = true}) local SnowSettings = Snow:Settings() SnowSettings:AddSlider({Text = "Density", Flag = "Snow Density", Min = 1, Max = 250, Default = 90, Increment = 1}) SnowSettings:AddSlider({Text = "Size", Flag = "Snow Size", Min = 0.05, Max = 1, Default = 0.15, Increment = 0.01}) SnowSettings:AddSlider({Text = "Speed", Flag = "Snow Speed", Min = 1, Max = 20, Default = 6, Increment = 0.1}) SnowSettings:AddSlider({Text = "Radius", Flag = "Snow Radius", Min = 10, Max = 80, Default = 35, Increment = 1}) SnowSettings:AddSlider({Text = "Drift", Flag = "Snow Drift", Min = -10, Max = 10, Default = 1, Increment = 0.1}) SnowSettings:AddSlider({Text = "Glow", Flag = "Snow Glow", Min = 0, Max = 1, Default = 0.2, Increment = 0.01}) SnowSettings:AddInput({Text = "Custom Texture ID", Flag = "Snow Texture", Default = ""}) do local Orbs = Weather:AddToggle({Text = "Floating Orbs", Flag = "Orbs", Default = false}) Colors["Orbs Color"] = Orbs:AddColorPicker({Text = "Orb Color", Flag = "Orbs Color", Default = Color3.fromRGB(170, 150, 255), EnableAlpha = true}) local OrbSettings = Orbs:Settings() OrbSettings:AddSlider({Text = "Count", Flag = "Orbs Count", Min = 5, Max = 100, Default = 24, Increment = 1}) OrbSettings:AddSlider({Text = "Size", Flag = "Orbs Size", Min = 0.05, Max = 2, Default = 0.22, Increment = 0.01}) OrbSettings:AddSlider({Text = "Speed", Flag = "Orbs Speed", Min = 0, Max = 5, Default = 0.6, Increment = 0.1}) OrbSettings:AddSlider({Text = "Radius", Flag = "Orbs Radius", Min = 5, Max = 80, Default = 12, Increment = 1}) OrbSettings:AddSlider({Text = "Glow", Flag = "Orbs Glow", Min = 0, Max = 1, Default = 0.7, Increment = 0.01}) OrbSettings:AddInput({Text = "Custom Texture ID", Flag = "Orbs Texture", Default = ""}) end local Sky = WorldPage:AddSection({Title = "Sky", Icon = "Globe", Side = 2}):AddToggle({Text = "Custom Sky", Flag = "Custom Sky", Default = false}) local SkySettings = Sky:Settings() local SkyFields, SkyPreset = {}, nil local function ShowSkyFields(Value) local Selected = type(Value) == "string" and Value or SkyPreset and SkyPreset:Get() for _, Field in SkyFields do Field:SetVisible(Selected == "Custom") end end SkyPreset = SkySettings:AddDropdown({Text = "Preset", Flag = "Sky Preset", Options = {"Sunset", "Galaxy", "Red Night", "Warm Horizon", "Custom"}, Default = "Sunset", Callback = ShowSkyFields}) table.insert(SkyFields, SkySettings:AddInput({Text = "All Faces ID", Flag = "Sky All Faces", Default = ""})) for _, Face in {"Back", "Down", "Front", "Left", "Right", "Up"} do table.insert(SkyFields, SkySettings:AddInput({Text = Face .. " ID", Flag = "Sky " .. Face, Default = ""})) end ShowSkyFields() end end do local Library = State.Library local Window = State.UI.Window local Colors = State.UI.Colors local White, Black = Color3.new(1, 1, 1), Color3.new(0, 0, 0) local LocalPage = State.UI.Tabs.Local local Cosmetics = LocalPage:AddSection({Title = "Cosmetics", Icon = "Brush", Side = 1}) local Skins = Cosmetics:AddToggle({Text = "Skin Changer", Flag = "Skin Changer", Default = false}) local KnifeModel = Skins:Settings():AddDropdown({Text = "Knife Model", Flag = "Knife Model", Options = {"Default"}, Default = "Default"}) State.UI.KnifeModel = KnifeModel local Avatar Avatar = Cosmetics:AddToggle({Text = "Avatar Replacer", Flag = "Avatar Replacer", Default = false, Callback = function(Enabled) local Controller = State.Controllers.Avatar if not Controller then return end if Enabled then Controller:Apply(Library.Flags["Avatar User ID"], function(Okay) if Okay == false then Avatar:Set(false, true) end end) else Controller:Disable() end end}) Avatar:Settings():AddInput({Text = "User ID", Flag = "Avatar User ID", Default = "", Placeholder = "Roblox user ID"}) Avatar:Settings():AddButton({Text = "Apply Avatar", Callback = function() local Controller = State.Controllers.Avatar if Controller then Controller:Apply(Library.Flags["Avatar User ID"], function(Okay) Avatar:Set(Okay == true, true) end) end end}) State.UI.AvatarToggle = Avatar local Camera = LocalPage:AddSection({Title = "Camera", Icon = "User", Side = 1}) local FOV = Camera:AddToggle({Text = "FOV Changer", Flag = "FOV Override", Default = false}) FOV:Settings():AddSlider({Text = "Field Of View", Flag = "Field of View", Min = 40, Max = 120, Default = 90, Increment = 1, Suffix = "°"}) local Aspect = Camera:AddToggle({Text = "Aspect Ratio", Flag = "Aspect Ratio Enabled", Default = false}) local AspectSettings = Aspect:Settings() AspectSettings:AddSlider({Text = "Horizontal", Flag = "Aspect Horizontal", Min = 0.25, Max = 3, Default = 1, Increment = 0.01, Suffix = "x"}) AspectSettings:AddSlider({Text = "Vertical", Flag = "Aspect Vertical", Min = 0.25, Max = 3, Default = 1, Increment = 0.01, Suffix = "x"}) local Zoom = Camera:AddToggle({Text = "Zoom Override", Flag = "Zoom Override", Default = false}) Zoom:Settings():AddSlider({Text = "Distance", Flag = "Max Zoom", Min = 0, Max = 128, Default = 16, Increment = 0.5, Suffix = " st"}) local ThirdPerson = LocalPage:AddSection({Title = "Third Person", Icon = "Eye", Side = 2}):AddToggle({Text = "Third Person", Flag = "Third Person", Default = false}) ThirdPerson:AddKeybind({Mode = "Toggle"}) ThirdPerson:Settings():AddSlider({Text = "Distance", Flag = "Third Person Distance", Min = 3, Max = 30, Default = 12, Increment = 1, Suffix = " st"}) local Viewmodel = LocalPage:AddSection({Title = "Viewmodel", Icon = "User", Side = 2}) Viewmodel:AddToggle({Text = "Remove Gloves", Flag = "Remove Viewmodel Gloves", Default = false}) Viewmodel:AddToggle({Text = "Remove Sleeves", Flag = "Remove Viewmodel Sleeves", Default = false}) do local Reticle = LocalPage:AddSection({Title = "Crosshair & Scope", Icon = "Bullseye", Side = 2}) local Crosshair = Reticle:AddToggle({Text = "Custom Crosshair", Flag = "Custom Crosshair", Default = false}) Colors["Crosshair Color"] = Crosshair:AddColorPicker({Text = "Color", Flag = "Crosshair Color", Default = White, EnableAlpha = true}) local Options = Crosshair:Settings() Options:AddSlider({Text = "Length", Flag = "Crosshair Length", Min = 1, Max = 30, Default = 6, Increment = 1}) Options:AddSlider({Text = "Gap", Flag = "Crosshair Gap", Min = 0, Max = 30, Default = 4, Increment = 1}) Options:AddSlider({Text = "Thickness", Flag = "Crosshair Thickness", Min = 1, Max = 6, Default = 2, Increment = 1}) Options:AddToggle({Text = "Center Dot", Flag = "Crosshair Dot", Default = true}) Options:AddToggle({Text = "Hide While Scoped", Flag = "Crosshair Hide Scoped", Default = true}) Reticle:AddToggle({Text = "Override Scope Image", Flag = "Override Scope Image", Default = false}):Settings() :AddInput({Text = "Image Asset ID", Flag = "Scope Image", Default = "", Placeholder = "Roblox image asset ID"}) end do local LocalChams = LocalPage:AddSection({Title = "Local Chams", Icon = "Cube", Side = 2}) local CharacterChams = LocalChams:AddToggle({Text = "Character", Flag = "Local Character Chams", Default = false}) Colors["Local Character Chams Color"] = CharacterChams:AddColorPicker({Text = "Fill Color", Flag = "Local Character Chams Color", Default = Color3.fromRGB(160, 110, 255), EnableAlpha = true}) local CharacterSettings = CharacterChams:Settings() CharacterSettings:AddDropdown({Text = "Style", Flag = "Local Character Chams Style", Options = {"Flat", "Neon", "ForceField", "Glass", "Metal"}, Default = "Flat"}) CharacterSettings:AddSlider({Text = "Opacity", Flag = "Local Character Chams Opacity", Min = 0, Max = 1, Default = 0.65, Increment = 0.01}) local CharacterWire = CharacterSettings:AddToggle({Text = "Wireframe", Flag = "Local Character Chams Wireframe", Default = false}) Colors["Local Character Chams Wireframe Color"] = CharacterWire:AddColorPicker({Text = "Wireframe Color", Flag = "Local Character Chams Wireframe Color", Default = White, EnableAlpha = true}) local CharacterWireSettings = CharacterWire:Settings() CharacterWireSettings:AddSlider({Text = "Opacity", Flag = "Local Character Chams Wireframe Opacity", Min = 0, Max = 1, Default = 1, Increment = 0.01}) CharacterWireSettings:AddSlider({Text = "Thickness", Flag = "Local Character Chams Wireframe Thickness", Min = 0.5, Max = 4, Default = 1, Increment = 0.1, Suffix = " px"}) local CharacterPulse = CharacterSettings:AddToggle({Text = "Pulse", Flag = "Local Character Chams Pulse", Default = false}) local CharacterPulseSettings = CharacterPulse:Settings() CharacterPulseSettings:AddSlider({Text = "Speed", Flag = "Local Character Chams Pulse Speed", Min = 0.1, Max = 5, Default = 1, Increment = 0.1, Suffix = " Hz"}) CharacterPulseSettings:AddSlider({Text = "Minimum Opacity", Flag = "Local Character Chams Pulse Minimum", Min = 0, Max = 1, Default = 0.25, Increment = 0.01}) local ArmsChams = LocalChams:AddToggle({Text = "Arms", Flag = "Local Arms Chams", Default = false}) Colors["Local Arms Chams Color"] = ArmsChams:AddColorPicker({Text = "Fill Color", Flag = "Local Arms Chams Color", Default = Color3.fromRGB(160, 110, 255), EnableAlpha = true}) local ArmsSettings = ArmsChams:Settings() ArmsSettings:AddDropdown({Text = "Style", Flag = "Local Arms Chams Style", Options = {"Flat", "Neon", "ForceField", "Glass", "Metal"}, Default = "Flat"}) ArmsSettings:AddSlider({Text = "Opacity", Flag = "Local Arms Chams Opacity", Min = 0, Max = 1, Default = 0.65, Increment = 0.01}) local ArmsWire = ArmsSettings:AddToggle({Text = "Wireframe", Flag = "Local Arms Chams Wireframe", Default = false}) Colors["Local Arms Chams Wireframe Color"] = ArmsWire:AddColorPicker({Text = "Wireframe Color", Flag = "Local Arms Chams Wireframe Color", Default = White, EnableAlpha = true}) local ArmsWireSettings = ArmsWire:Settings() ArmsWireSettings:AddSlider({Text = "Opacity", Flag = "Local Arms Chams Wireframe Opacity", Min = 0, Max = 1, Default = 1, Increment = 0.01}) ArmsWireSettings:AddSlider({Text = "Thickness", Flag = "Local Arms Chams Wireframe Thickness", Min = 0.5, Max = 4, Default = 1, Increment = 0.1, Suffix = " px"}) local ArmsPulse = ArmsSettings:AddToggle({Text = "Pulse", Flag = "Local Arms Chams Pulse", Default = false}) local ArmsPulseSettings = ArmsPulse:Settings() ArmsPulseSettings:AddSlider({Text = "Speed", Flag = "Local Arms Chams Pulse Speed", Min = 0.1, Max = 5, Default = 1, Increment = 0.1, Suffix = " Hz"}) ArmsPulseSettings:AddSlider({Text = "Minimum Opacity", Flag = "Local Arms Chams Pulse Minimum", Min = 0, Max = 1, Default = 0.25, Increment = 0.01}) local GunChams = LocalChams:AddToggle({Text = "Gun", Flag = "Local Gun Chams", Default = false}) Colors["Local Gun Chams Color"] = GunChams:AddColorPicker({Text = "Fill Color", Flag = "Local Gun Chams Color", Default = Color3.fromRGB(160, 110, 255), EnableAlpha = true}) local GunSettings = GunChams:Settings() GunSettings:AddDropdown({Text = "Style", Flag = "Local Gun Chams Style", Options = {"Flat", "Neon", "ForceField", "Glass", "Metal"}, Default = "Flat"}) GunSettings:AddSlider({Text = "Opacity", Flag = "Local Gun Chams Opacity", Min = 0, Max = 1, Default = 0.65, Increment = 0.01}) local GunWire = GunSettings:AddToggle({Text = "Wireframe", Flag = "Local Gun Chams Wireframe", Default = false}) Colors["Local Gun Chams Wireframe Color"] = GunWire:AddColorPicker({Text = "Wireframe Color", Flag = "Local Gun Chams Wireframe Color", Default = White, EnableAlpha = true}) local GunWireSettings = GunWire:Settings() GunWireSettings:AddSlider({Text = "Opacity", Flag = "Local Gun Chams Wireframe Opacity", Min = 0, Max = 1, Default = 1, Increment = 0.01}) GunWireSettings:AddSlider({Text = "Thickness", Flag = "Local Gun Chams Wireframe Thickness", Min = 0.5, Max = 4, Default = 1, Increment = 0.1, Suffix = " px"}) local GunPulse = GunSettings:AddToggle({Text = "Pulse", Flag = "Local Gun Chams Pulse", Default = false}) local GunPulseSettings = GunPulse:Settings() GunPulseSettings:AddSlider({Text = "Speed", Flag = "Local Gun Chams Pulse Speed", Min = 0.1, Max = 5, Default = 1, Increment = 0.1, Suffix = " Hz"}) GunPulseSettings:AddSlider({Text = "Minimum Opacity", Flag = "Local Gun Chams Pulse Minimum", Min = 0, Max = 1, Default = 0.25, Increment = 0.01}) local KnifeChams = LocalChams:AddToggle({Text = "Knife", Flag = "Local Knife Chams", Default = false}) Colors["Local Knife Chams Color"] = KnifeChams:AddColorPicker({Text = "Fill Color", Flag = "Local Knife Chams Color", Default = Color3.fromRGB(160, 110, 255), EnableAlpha = true}) local KnifeSettings = KnifeChams:Settings() KnifeSettings:AddDropdown({Text = "Style", Flag = "Local Knife Chams Style", Options = {"Flat", "Neon", "ForceField", "Glass", "Metal"}, Default = "Flat"}) KnifeSettings:AddSlider({Text = "Opacity", Flag = "Local Knife Chams Opacity", Min = 0, Max = 1, Default = 0.65, Increment = 0.01}) local KnifeWire = KnifeSettings:AddToggle({Text = "Wireframe", Flag = "Local Knife Chams Wireframe", Default = false}) Colors["Local Knife Chams Wireframe Color"] = KnifeWire:AddColorPicker({Text = "Wireframe Color", Flag = "Local Knife Chams Wireframe Color", Default = White, EnableAlpha = true}) local KnifeWireSettings = KnifeWire:Settings() KnifeWireSettings:AddSlider({Text = "Opacity", Flag = "Local Knife Chams Wireframe Opacity", Min = 0, Max = 1, Default = 1, Increment = 0.01}) KnifeWireSettings:AddSlider({Text = "Thickness", Flag = "Local Knife Chams Wireframe Thickness", Min = 0.5, Max = 4, Default = 1, Increment = 0.1, Suffix = " px"}) local KnifePulse = KnifeSettings:AddToggle({Text = "Pulse", Flag = "Local Knife Chams Pulse", Default = false}) local KnifePulseSettings = KnifePulse:Settings() KnifePulseSettings:AddSlider({Text = "Speed", Flag = "Local Knife Chams Pulse Speed", Min = 0.1, Max = 5, Default = 1, Increment = 0.1, Suffix = " Hz"}) KnifePulseSettings:AddSlider({Text = "Minimum Opacity", Flag = "Local Knife Chams Pulse Minimum", Min = 0, Max = 1, Default = 0.25, Increment = 0.01}) end do local Jump = LocalPage:AddSection({Title = "Jump Circles", Icon = "Globe", Side = 1}):AddToggle({Text = "Jump Circles", Flag = "Jump Circles", Default = false}) Colors["Jump Circle Color"] = Jump:AddColorPicker({Text = "Start Color", Flag = "Jump Circle Color", Default = White, EnableAlpha = true}) Colors["Jump Circle End Color"] = Jump:AddColorPicker({Text = "End Color", Flag = "Jump Circle End Color", Default = Color3.fromRGB(140, 100, 255)}) local JumpSettings = Jump:Settings() JumpSettings:AddSlider({Text = "Radius", Flag = "Jump Circle Radius", Min = 0.5, Max = 10, Default = 4, Increment = 0.1, Suffix = " st"}) JumpSettings:AddSlider({Text = "Thickness", Flag = "Jump Circle Thickness", Min = 0.02, Max = 0.5, Default = 0.1, Increment = 0.01}) JumpSettings:AddSlider({Text = "Duration", Flag = "Jump Circle Duration", Min = 0.2, Max = 3, Default = 1, Increment = 0.05, Suffix = " s"}) JumpSettings:AddToggle({Text = "Glow", Flag = "Jump Circle Glow", Default = false}) JumpSettings:AddToggle({Text = "Landing Circle", Flag = "Jump Circle Landing", Default = false}) end do local CharacterEffects = LocalPage:AddSection({Title = "Character Effects", Icon = "User", Side = 2}) local Halo = CharacterEffects:AddToggle({Text = "Halo", Flag = "Character Halo", Default = false}) Colors["Halo Color"] = Halo:AddColorPicker({Text = "Halo Color", Flag = "Halo Color", Default = Color3.fromRGB(255, 215, 110), EnableAlpha = true}) local HaloSettings = Halo:Settings() HaloSettings:AddSlider({Text = "Radius", Flag = "Halo Radius", Min = 0.3, Max = 3, Default = 1, Increment = 0.05}) HaloSettings:AddSlider({Text = "Thickness", Flag = "Halo Thickness", Min = 0.03, Max = 0.3, Default = 0.08, Increment = 0.01}) HaloSettings:AddSlider({Text = "Height", Flag = "Halo Height", Min = 0.3, Max = 4, Default = 1.2, Increment = 0.1}) HaloSettings:AddSlider({Text = "Tilt", Flag = "Halo Tilt", Min = -60, Max = 60, Default = 0, Increment = 1, Suffix = "°"}) local HaloAnimation = HaloSettings:AddToggle({Text = "Animation", Flag = "Halo Animation", Default = false}) HaloAnimation:Settings():AddSlider({Text = "Speed", Flag = "Halo Speed", Min = 0.1, Max = 5, Default = 1.5, Increment = 0.1}) local Aura = CharacterEffects:AddToggle({Text = "Particle Aura", Flag = "Character Aura", Default = false}) Colors["Character Aura Color"] = Aura:AddColorPicker({Text = "Aura Color", Flag = "Character Aura Color", Default = Color3.fromRGB(133, 220, 255), EnableAlpha = true}) Aura:Settings():AddDropdown({Text = "Preset", Flag = "Character Aura Preset", Options = {"Starlight", "Heavenly", "Ribbon", "Sakura", "Angel", "Wind", "Flow", "Star"}, Default = "Angel"}) end end do local Library = State.Library local Window = State.UI.Window local Colors = State.UI.Colors local White, Black = Color3.new(1, 1, 1), Color3.new(0, 0, 0) local CharacterPage, ChatbotPage = State.UI.Tabs.Movement, State.UI.Tabs.Utility local Character = CharacterPage:AddSection({Title = "Movement", Icon = "Smile", Side = 1}) local DuckPeek = Character:AddToggle({Text = "Duck Peek Assist", Flag = "Duck Peek Assist", Default = false}) DuckPeek:AddKeybind({Mode = "Hold", Default = Enum.KeyCode.C}) local DuckSettings = DuckPeek:Settings() DuckSettings:AddSlider({Text = "Crouch Time", Flag = "Duck Peek Crouch Time", Min = 0.1, Max = 2, Default = 0.6, Increment = 0.05, Suffix = " s"}) DuckSettings:AddSlider({Text = "Peek Time", Flag = "Duck Peek Stand Time", Min = 0.1, Max = 2, Default = 0.2, Increment = 0.05, Suffix = " s"}) local Bhop = Character:AddToggle({Text = "Bhop", Flag = "Bhop", Default = false}) Bhop:AddKeybind({Mode = "Toggle"}) Bhop:Settings():AddSlider({Text = "Duck Delay", Flag = "Bhop Duck Delay", Min = 0, Max = 1000, Default = 50, Increment = 1, Suffix = " ms"}) Character:AddToggle({Text = "Auto Hop", Flag = "Auto Hop", Default = false}):AddKeybind({Mode = "Toggle"}) Character:AddToggle({Text = "No Slow", Flag = "No Slow", Default = false}):AddKeybind({Mode = "Toggle"}) Character:AddToggle({Text = "Force Stop", Flag = "Force Stop", Default = false}) Character:AddToggle({Text = "Auto Defuse", Flag = "Auto Defuse", Default = false}) Character:AddToggle({Text = "Auto Plant", Flag = "Auto Plant", Default = false}) Character:AddToggle({Text = "Anti AFK", Flag = "Anti AFK", Default = false}) local Backtrack = CharacterPage:AddSection({Title = "Backtrack", Icon = "HeartCrack", Side = 2}):AddToggle({Text = "Backtrack", Flag = "Backtrack", Default = false}) Backtrack:Settings():AddSlider({Text = "Time", Flag = "Backtrack Time", Min = 0, Max = 0.2, Default = 0.1, Increment = 0.01, Suffix = " s"}) local ChatbotSection = ChatbotPage:AddSection({Title = "Chatbot", Icon = "Bomb", Side = 1}) local ChatbotToggle = ChatbotSection:AddToggle({Text = "Chatbot", Flag = "Chatbot", Default = false}) local ChatbotSettings = ChatbotToggle:Settings() ChatbotSettings:AddDropdown({Text = "Mode", Flag = "Chatbot Mode", Options = {"On Kill", "Timed", "Both"}, Default = "On Kill"}) ChatbotSettings:AddDropdown({Text = "Message", Flag = "Chatbot Message", Options = {"Rotate", "Swift On Top", "Get Swift", "Custom"}, Default = "Rotate"}) ChatbotSettings:AddInput({Text = "Custom Message", Flag = "Chatbot Custom Message", Default = "", MaxLength = 100}) ChatbotSettings:AddSlider({Text = "Interval", Flag = "Chatbot Interval", Min = 5, Max = 120, Default = 15, Increment = 1, Suffix = " s"}) local Staff = CharacterPage:AddSection({Title = "Staff", Icon = "Warning", Side = 2}) local AntiStaff = Staff:AddToggle({Text = "Anti Staff", Flag = "Anti Staff", Default = false}) AntiStaff:Settings():AddDropdown({Text = "Action", Flag = "Staff Action", Options = {"Notify", "Unload", "Kick"}, Default = "Notify"}) end do local Get, Modules = Functions.Config.Get, State.Modules local Shot = {} local function Finite(Value) return type(Value) == "number" and Value == Value and math.abs(Value) < math.huge end function Shot.Seed(Tick, Weapon) local Value = Weapon and Weapon.RandomSeed if Finite(Value) and Value >= 0 then Tick = Value end if not Finite(Tick) then Tick = 0 end local A = bit32.bxor(Tick, bit32.rshift(Tick, 16)) local B = (A * 34283 % 65536 * 65536 + A * 51819) % 4294967296 B = bit32.bxor(B, bit32.rshift(B, 13)) local C = (B * 49842 % 65536 * 65536 + B * 44597) % 4294967296 return bit32.band(bit32.bxor(C, bit32.rshift(C, 16)), 255) + 1 end function Shot.Gun(Weapon) return Weapon and type(Weapon.Data) == "table" and type(Weapon.Data.Ammo) == "number" and type(Weapon.Data.FireRate) == "table" end function Shot.Burst(Weapon) local Alternate = Weapon and Weapon.Data and Weapon.Data.AltFunction local Remaining = Weapon and Weapon.BurstFireRemaining or 0 return Alternate and Alternate.Name == "Burst" and Weapon.Mode == 2 and Remaining > 0 and Remaining < Alternate.BaseBurstAmount end function Shot.Origin(Camera, Simulation) if Simulation and type(Simulation.BuildShotCFrame) == "function" then local Success, Frame = pcall(Simulation.BuildShotCFrame, Simulation, true) if Success and typeof(Frame) == "CFrame" then return Frame.Position end end return Camera and Camera.CFrame.Position end function Shot.Scale() local Config = Modules.SimulationConfig and Modules.SimulationConfig.CFG local Value = Config and Config.RecoilScale if Finite(Value) then return Value end return (tonumber(Functions.Game.Config("Weapon", "RecoilScale")) or 2) * (tonumber(Functions.Game.Config("Weapon", "HitboxRecoilScale")) or 1) end function Shot.Offset(Tick, Weapon, Simulation, Seed, Native) if not Shot.Gun(Weapon) or type(Weapon.GetInaccuracy) ~= "function" or type(Weapon.GetSpread) ~= "function" then return nil end local Success, X, Y, Cone, Spread = pcall(function() local Inaccuracy, Radius = Weapon:GetInaccuracy(Simulation), Weapon:GetSpread(Weapon) if not Native and Get("No Spread Fixed Pattern", false) then local Data = Weapon.Data local Index = math.floor(Weapon.RecoilIndex or 0) * (Data.Bullets or 1) if Index >= 0 and Index < (Data.SpreadOffsetsLength or 0) and typeof(Data.SpreadOffsets) == "buffer" then local Angle = buffer.readf32(Data.SpreadOffsets, Index * 8) local Weight = buffer.readf32(Data.SpreadOffsets, Index * 8 + 4) * Radius return math.cos(Angle) * Weight, math.sin(Angle) * Weight, Inaccuracy, Radius end return 0, 0, Inaccuracy, Radius end local Random = Modules.Math.UniformRandomStream(Seed or Shot.Seed(Tick, Weapon)) local Side, Up = Modules.Bullet.SpreadOffset(Weapon, Random, Inaccuracy, Radius, 1) return Side, Up, Inaccuracy, Radius end) if not Success or not Finite(X) or not Finite(Y) or not Finite(Cone) or not Finite(Spread) then return nil end return X, Y, Cone, Spread end function Shot.Angles(Direction, Tick, Weapon, Simulation, Seed, CompensateRecoil, CompensateSpread) if typeof(Direction) ~= "Vector3" or Direction.Magnitude < 0.000001 then return nil end Direction = Direction.Unit local X, Y = 0, 0 if CompensateSpread then X, Y = Shot.Offset(Tick, Weapon, Simulation, Seed) if X == nil then return nil end end local Punch = Simulation and (Simulation.SeenAimPunch or Simulation.AimPunchAngle) local RecoilX, RecoilY, Roll = 0, 0, 0 if CompensateRecoil and typeof(Punch) == "Vector3" then local Scale = Shot.Scale() RecoilX, RecoilY, Roll = math.rad(Punch.X * Scale), math.rad(Punch.Y * Scale), math.rad(Punch.Z * Scale) end local Side = X * math.cos(Roll) - Y * math.sin(Roll) local Up = X * math.sin(Roll) + Y * math.cos(Roll) local Height = Direction.Y * math.sqrt(1 + Side * Side + Up * Up) / math.sqrt(1 + Up * Up) if not Finite(Height) or math.abs(Height) > 1 then return nil end local Tilt = math.asin(Height) - math.atan(Up) local Back = Up * math.sin(Tilt) - math.cos(Tilt) local Yaw = math.atan2(-Direction.X, -Direction.Z) - math.atan2(-Side, -Back) - RecoilY local Pitch = RecoilX - Tilt if not Finite(Yaw) or not Finite(Pitch) or math.abs(Pitch) > 1.55334 then return nil end local EncodedYaw, EncodedPitch = Functions.Angles.Encode(Yaw, Pitch) local ActualYaw, ActualPitch = Functions.Angles.Decode(EncodedYaw, EncodedPitch) if CompensateSpread and Get("No Spread Fixed Pattern", false) or not CompensateSpread and Seed ~= nil and Shot.Gun(Weapon) then X, Y = Shot.Offset(Tick, Weapon, Simulation, Seed, true) if X == nil then return nil end Side = X * math.cos(Roll) - Y * math.sin(Roll) Up = X * math.sin(Roll) + Y * math.cos(Roll) end local ActualTilt = RecoilX - ActualPitch local ActualBack = Up * math.sin(ActualTilt) - math.cos(ActualTilt) local Vertical = Up * math.cos(ActualTilt) + math.sin(ActualTilt) ActualYaw += RecoilY local Ray = Vector3.new(Side * math.cos(ActualYaw) + ActualBack * math.sin(ActualYaw), Vertical, -Side * math.sin(ActualYaw) + ActualBack * math.cos(ActualYaw)).Unit return EncodedYaw, EncodedPitch, Ray end Functions.Combat.Shot = Shot end do local Get, Modules = Functions.Config.Get, State.Modules local Reload = {Ammo = setmetatable({}, {__mode = "k"})} function Reload.Apply(Map, Weapon) local Inventory = type(Modules.Weapon.GetWeaponInventory) == "function" and Modules.Weapon.GetWeaponInventory() local Return = Reload.Return if Return then if not Get("Instant Reload", false) or not Inventory or Inventory[Return.From] ~= Return.Weapon or not Inventory[Return.To] or Map.WishEquip ~= Return.From and Map.WishEquip ~= Return.To then Reload.Return = nil elseif Weapon and Weapon.Slot == Return.To then Map.WishEquip, Map.WishBooleans.WishReload = Return.From, false Reload.Release, Reload.Return = Return.Weapon, nil else Return.Attempts += 1 if Return.Attempts > 60 then Reload.Return = nil else Map.WishEquip, Map.WishBooleans.WishReload = Return.To, false end end end local Data = Weapon and Weapon.Data if not Data or type(Data.Ammo) ~= "number" then return end if Get("Auto Reload", false) or Get("Ragebot", false) and Get("Rage Auto Reload", false) then if Data.Ammo <= 0 and (Data.ReserveAmmo or Weapon.ReserveAmmo or Weapon.AmmoReserve or Data.AmmoReserve or 1) > 0 then Map.WishBooleans.WishReload = true end end local Cancel = true if type(Weapon.ReloadDelay) == "number" and type(Weapon.Timer) == "number" and type(Data.EquipDelay) == "number" then local Rate = tonumber(Functions.Game.Config("Game", "TickRate")) or 60 Cancel = Weapon.ReloadDelay - Weapon.Timer > Data.EquipDelay + 2 / math.max(1, Rate) end if Get("Instant Reload", false) and Cancel and Weapon.Reloading and Data.Reload and not Data.Reload.Shotgun and Map.WishEquip == Weapon.Slot then local Start = Reload.Ammo[Weapon] if Start == nil then Reload.Ammo[Weapon] = Data.Ammo end if Weapon.AmmoClip == true or Start ~= nil and Data.Ammo > Start then local Alternate if Inventory and Inventory[Weapon.Slot] == Weapon then Alternate = Inventory[3] and Weapon.Slot ~= 3 and 3 or nil if not Alternate then for Slot, Candidate in Inventory do if Candidate ~= Weapon then Alternate = Slot; break end end end end if Alternate then Map.WishEquip, Map.WishBooleans.WishReload = Alternate, false Reload.Return = {From = Weapon.Slot, To = Alternate, Weapon = Weapon, Attempts = 0} end Reload.Ammo[Weapon] = nil end else Reload.Ammo[Weapon] = nil end if Reload.Release then if not Get("Instant Reload", false) then Reload.Release = nil elseif Weapon == Reload.Release then Map.WishBooleans.WishReload = false if Weapon.WaitForNoAttack then Map.WishBooleans.WishFire, Map.WishBooleans.WishFire2 = false, false else Reload.Release = nil end end end end function Reload.Reset() Reload.Return, Reload.Release = nil, nil table.clear(Reload.Ammo) end Functions.Combat.Reload = Reload end do local Cache, Basis, Sampler local function Finite(Value) return type(Value) == "number" and Value == Value and math.abs(Value) < math.huge end local function Vector(Value) return typeof(Value) == "Vector3" and Finite(Value.X) and Finite(Value.Y) and Finite(Value.Z) end local function Unavailable(Details, Reason) Details.Reason = Reason return nil end local function Slab(Position, Step, Half, Near, Far) if math.abs(Step) < 0.000001 then if math.abs(Position) > Half then return nil end else local Entry, Exit = (-Half - Position) / Step, (Half - Position) / Step if Entry > Exit then Entry, Exit = Exit, Entry end Near, Far = math.max(Near, Entry), math.min(Far, Exit) if Near > Far then return nil end end return Near, Far end local function Intersects(Start, Forward, Right, Up, Half, X, Y, Range) local DX = Forward.X + Right.X * X + Up.X * Y local DY = Forward.Y + Right.Y * X + Up.Y * Y local DZ = Forward.Z + Right.Z * X + Up.Z * Y local Length = math.sqrt(DX * DX + DY * DY + DZ * DZ) if not Finite(Length) or Length <= 0 then return nil end local Near, Far = Slab(Start.X, DX / Length, Half.X, 0, Range) if Near == nil then return false end Near, Far = Slab(Start.Y, DY / Length, Half.Y, Near, Far) if Near == nil then return false end Near, Far = Slab(Start.Z, DZ / Length, Half.Z, Near, Far) return Near ~= nil and Far >= 0 end local function Sample(Details, Weapon, Bullet, Math, Index, Inaccuracy, Spread) Details.Reason = "Random Stream Error" local Stream = Math.UniformRandomStream(5 + (Index - 1) * 8) Details.Reason = "Spread Sampling Error" return Bullet.SpreadOffset(Weapon, Stream, Inaccuracy, Spread, 1) end local function ConeSamples(Details, Weapon, Simulation, Bullet, Math, Tick, Inaccuracy, Spread) if not Sampler or Sampler.Offset ~= Bullet.SpreadOffset or Sampler.Stream ~= Math.UniformRandomStream then Sampler = {Offset = Bullet.SpreadOffset, Stream = Math.UniformRandomStream} Cache, Basis = nil, nil end local FirstX, FirstY if Sampler.Components == nil then local IX, IY, SX, SY FirstX, FirstY, IX, IY, SX, SY = Sample(Details, Weapon, Bullet, Math, 1, Inaccuracy, Spread) Sampler.Components = Finite(IX) and Finite(IY) and Finite(SX) and Finite(SY) and Finite(FirstX) and Finite(FirstY) and math.abs(FirstX - IX - SX) < 0.000001 and math.abs(FirstY - IY - SY) < 0.000001 end local Now = os.clock() if Sampler.Components then local Data = Weapon.Data local Recoil = math.floor(Weapon.RecoilIndex or 0) local Index = Recoil * (Data.Bullets or 1) local Pattern, Weight if Index >= 0 and Index < (Data.SpreadOffsetsLength or 0) and typeof(Data.SpreadOffsets) == "buffer" then Pattern, Weight = buffer.readf32(Data.SpreadOffsets, Index * 8), buffer.readf32(Data.SpreadOffsets, Index * 8 + 4) end if not Basis or Basis.Weapon ~= Weapon or Basis.Data ~= Data or Basis.Mode ~= Weapon.Mode or Basis.Recoil ~= Recoil or Basis.Bullets ~= Data.Bullets or Basis.Buffer ~= Data.SpreadOffsets or Basis.Length ~= Data.SpreadOffsetsLength or Basis.Pattern ~= Pattern or Basis.Weight ~= Weight then local Factors = table.create(32) for Entry = 1, 32 do local X, Y, IX, IY, SX, SY = Sample(Details, Weapon, Bullet, Math, Entry, 1, 1) if not Finite(X) or not Finite(Y) or not Finite(IX) or not Finite(IY) or not Finite(SX) or not Finite(SY) then Cache, Basis = nil, nil return Unavailable(Details, "Invalid Spread Sample") end Factors[Entry] = {IX, IY, SX, SY} end Basis = {Weapon = Weapon, Data = Data, Mode = Weapon.Mode, Recoil = Recoil, Bullets = Data.Bullets, Buffer = Data.SpreadOffsets, Length = Data.SpreadOffsetsLength, Pattern = Pattern, Weight = Weight, Factors = Factors} Cache = nil end if Cache and Cache.Basis == Basis and Cache.Inaccuracy == Inaccuracy and Cache.Spread == Spread then return Cache.Samples end local Samples = table.create(32) for Entry, Factor in Basis.Factors do Samples[Entry] = {Factor[1] * Inaccuracy + Factor[3] * Spread, Factor[2] * Inaccuracy + Factor[4] * Spread} end Cache = {Basis = Basis, Inaccuracy = Inaccuracy, Spread = Spread, Samples = Samples} return Samples end if Cache and Tick ~= nil and Cache.Tick == Tick and Cache.Simulation == Simulation and Cache.Weapon == Weapon and Cache.Data == Weapon.Data and Cache.Mode == Weapon.Mode and Cache.Recoil == Weapon.RecoilIndex and Cache.Inaccuracy == Inaccuracy and Cache.Spread == Spread and Now >= Cache.Time and Now - Cache.Time <= 1 / 60 then return Cache.Samples end local Samples = table.create(32) for Index = 1, 32 do local X, Y if Index == 1 and FirstX ~= nil then X, Y = FirstX, FirstY else X, Y = Sample(Details, Weapon, Bullet, Math, Index, Inaccuracy, Spread) end if not Finite(X) or not Finite(Y) then Cache = nil; return Unavailable(Details, "Invalid Spread Sample") end Samples[Index] = {X, Y} end Cache = {Tick = Tick, Simulation = Simulation, Weapon = Weapon, Data = Weapon.Data, Mode = Weapon.Mode, Recoil = Weapon.RecoilIndex, Inaccuracy = Inaccuracy, Spread = Spread, Time = Now, Samples = Samples} return Samples end local function Estimate(Details, Weapon, Simulation, Target, Origin, EncodedYaw, EncodedPitch) if type(Weapon) ~= "table" then return Unavailable(Details, "Missing Weapon") end Details.Weapon = type(Weapon.Name) == "string" and string.sub(Weapon.Name, 1, 120) or "Unknown" if Finite(Weapon.RecoilIndex) then Details.RecoilIndex = Weapon.RecoilIndex end if type(Weapon.Data) ~= "table" then return Unavailable(Details, "Missing Weapon Data") end if type(Simulation) ~= "table" then return Unavailable(Details, "Missing Simulation") end if type(Target) ~= "table" then return Unavailable(Details, "Missing Target") end if typeof(Target.Frame) ~= "CFrame" or not Vector(Target.Frame.Position) then return Unavailable(Details, "Invalid Hitbox Frame") end if not Vector(Target.Frame.LookVector) or not Vector(Target.Frame.RightVector) or not Vector(Target.Frame.UpVector) then return Unavailable(Details, "Invalid Hitbox Orientation") end if not Vector(Target.Half) or Target.Half.X <= 0 or Target.Half.Y <= 0 or Target.Half.Z <= 0 then return Unavailable(Details, "Invalid Hitbox Size") end Details.HalfSize = {X = Target.Half.X, Y = Target.Half.Y, Z = Target.Half.Z} if not Vector(Origin) then return Unavailable(Details, "Invalid Origin") end local Distance = (Target.Frame.Position - Origin).Magnitude if Finite(Distance) then Details.Distance = Distance end if not Finite(EncodedYaw) or not Finite(EncodedPitch) or EncodedYaw < 0 or EncodedYaw > 65535 or EncodedPitch < 0 or EncodedPitch > 65535 then return Unavailable(Details, "Invalid Encoded Angles") end if type(Weapon.GetInaccuracy) ~= "function" then return Unavailable(Details, "Missing Inaccuracy Function") end if type(Weapon.GetSpread) ~= "function" then return Unavailable(Details, "Missing Spread Function") end if type(Functions.Angles.Decode) ~= "function" then return Unavailable(Details, "Missing Angle Decoder") end if type(Functions.Target.RayHitsHitbox) ~= "function" then return Unavailable(Details, "Missing Hitbox Intersection") end local Range = Functions.Target.Range(Weapon) if not Finite(Range) or Range <= 0 then return Unavailable(Details, "Invalid Weapon Range") end Range += 2.776 Details.Range = Range local Modules = State.Modules local Bullet, Math, Config = Modules and Modules.Bullet, Modules and Modules.Math, Modules and Modules.GameConfig if not Bullet or type(Bullet.SpreadOffset) ~= "function" then return Unavailable(Details, "Missing Spread Sampler") end if not Math or type(Math.UniformRandomStream) ~= "function" then return Unavailable(Details, "Missing Random Stream") end if not Config or type(Config.Get) ~= "function" then return Unavailable(Details, "Missing Recoil Configuration") end Details.Reason = "Native Inaccuracy Error" local Inaccuracy = Weapon:GetInaccuracy(Simulation) if not Finite(Inaccuracy) or Inaccuracy < 0 then return Unavailable(Details, "Invalid Inaccuracy") end Details.Inaccuracy, Details.Reason = Inaccuracy, "Native Spread Error" local Spread = Weapon:GetSpread(Weapon) if not Finite(Spread) or Spread < 0 then return Unavailable(Details, "Invalid Spread") end Details.Spread = Spread local Punch = Simulation.SeenAimPunch or Simulation.AimPunchAngle if not Vector(Punch) then return Unavailable(Details, "Invalid Recoil Punch") end Details.Reason = "Recoil Configuration Error" local SimulationConfig = Modules.SimulationConfig and Modules.SimulationConfig.CFG local Scale = SimulationConfig and SimulationConfig.RecoilScale if not Finite(Scale) then local Base = Config.Get("Weapon", "RecoilScale") local Hitbox = Config.Get("Weapon", "HitboxRecoilScale") Scale = Finite(Base) and Base * (Finite(Hitbox) and Hitbox or 1) or nil end if not Finite(Scale) then return Unavailable(Details, "Invalid Recoil Scale") end Details.Reason = "Angle Decode Error" local Yaw, Pitch = Functions.Angles.Decode(EncodedYaw, EncodedPitch) if not Finite(Yaw) or not Finite(Pitch) then return Unavailable(Details, "Invalid Decoded Angles") end Details.Reason = "Shot Frame Error" local Frame = CFrame.fromEulerAnglesYXZ(-Pitch + math.rad(Punch.X * Scale), Yaw + math.rad(Punch.Y * Scale), math.rad(Punch.Z * Scale)) if not Vector(Frame.LookVector) or not Vector(Frame.RightVector) or not Vector(Frame.UpVector) then return Unavailable(Details, "Invalid Shot Frame") end if Inaccuracy == 0 and Spread == 0 then Details.Reason = "Hitbox Intersection Error" local Hit = Functions.Target.RayHitsHitbox(Target, Origin, Frame.LookVector, Range) if type(Hit) ~= "boolean" then return Unavailable(Details, "Invalid Hitbox Result") end Details.Samples, Details.Hits = 1, Hit and 1 or 0 return Hit and 100 or 0 end local Tick if type(Functions.Game.Simulation) == "function" then Details.Reason = "Simulation State Error" local Current, Character = Functions.Game.Simulation() Tick = Current == Simulation and Character and Character.CurrentCommand and Character.CurrentCommand.ClientTick if not Finite(Tick) then Tick = nil end end local Samples = ConeSamples(Details, Weapon, Simulation, Bullet, Math, Tick, Inaccuracy, Spread) if not Samples then return nil end Details.Reason = "Hitbox Transform Error" local Start = Target.Frame:PointToObjectSpace(Origin) local Forward = Target.Frame:VectorToObjectSpace(Frame.LookVector) local Right = Target.Frame:VectorToObjectSpace(Frame.RightVector) local Up = Target.Frame:VectorToObjectSpace(Frame.UpVector) if not Vector(Start) or not Vector(Forward) or not Vector(Right) or not Vector(Up) then return Unavailable(Details, "Invalid Hitbox Transform") end local Hits = 0 for _, Sample in Samples do local Hit = Intersects(Start, Forward, Right, Up, Target.Half, Sample[1], Sample[2], Range) if Hit == nil then return Unavailable(Details, "Invalid Sample Direction") end if Hit then Hits += 1 end Details.Samples += 1 Details.Hits = Hits end return Hits * 100 / 32 end Functions.Combat.Accuracy = function(...) local Details = {State = "Unavailable", Reason = "Estimator Error", Samples = 0, Hits = 0} local Okay, Result = pcall(Estimate, Details, ...) if not Okay then Cache, Basis = nil, nil local Message = type(Result) == "string" and Result or Finite(Result) and tostring(Result) or "Native call failed" Details.Error = string.sub(string.gsub(Message, "%c", " "), 1, 200) return nil, Details end if Result ~= nil then Details.State, Details.Chance, Details.Reason = "Ready", Result, nil end return Result, Details end end do local Workspace = State.Services.Workspace local Parameters, ExitParameters = RaycastParams.new(), RaycastParams.new() Parameters.IgnoreWater, ExitParameters.IgnoreWater = true, true ExitParameters.FilterType = Enum.RaycastFilterType.Include local Overrides = {[Enum.Material.Wood] = 3, [Enum.Material.WoodPlanks] = 3, [Enum.Material.Cardboard] = 3, [Enum.Material.Plastic] = 2, [Enum.Material.SmoothPlastic] = 2} local Epsilon = 0.001 local function Finite(Value) return type(Value) == "number" and Value == Value and math.abs(Value) < math.huge end local function Config(Name, Default) local Value = State.Modules.GameConfig.Get("Weapon", Name) return Finite(Value) and Value or Default end local function Surface(Hit) local Enums = State.Modules.Enums local Materials = Enums and Enums.MaterialPenetrationData if not Materials then return nil end local Variant = Enums.MaterialVariantPenetrationData and Enums.MaterialVariantPenetrationData[Hit.Instance.MaterialVariant] local Material = Variant and Variant.Material or Hit.Material or "Default" local Data = Materials[Material] local Modifier = Variant and Variant.PenetrationModifier or Data and Data.PenetrationModifier return Material, Modifier end local function TraceCover(Entry, Direction, Maximum, TargetDistance, Geometry) if Entry.Instance.Name == "nowallbang" then return nil end local EntryMaterial, EntryModifier = Surface(Entry) if not Finite(EntryModifier) or EntryModifier < 0.1 then return nil end local Step = 0.2776 local Steps = math.floor(Maximum / Step) + 1 if Steps < 1 or Steps > 256 then return nil end local Position, Reach = Entry.Position, Steps * Step ExitParameters.FilterDescendantsInstances = {Geometry or Entry.Instance} local Entries, Exits = {}, {} local Start = Epsilon for _ = 1, 16 do local Hit = Workspace:Raycast(Position + Direction * Start, Direction * (Reach - Start), ExitParameters) if not Hit then break end local Distance = Start + Hit.Distance table.insert(Entries, Distance) Start = Distance + Epsilon if Start >= Reach then break end end for _ = 1, 16 do if Reach <= Epsilon then break end local Hit = Workspace:Raycast(Position + Direction * Reach, Direction * -(Reach - Epsilon), ExitParameters) if not Hit then break end local Distance = Reach - Hit.Distance table.insert(Exits, {Distance = Distance, Hit = Hit}) Reach = Distance - Epsilon end local EntryIndex, ExitIndex, Solid, Exit = 1, #Exits, 1, nil for Index = 1, Steps do local Sample = Index * Step while EntryIndex <= #Entries and Entries[EntryIndex] <= Sample do Solid += 1 EntryIndex += 1 end while ExitIndex >= 1 and Exits[ExitIndex].Distance <= Sample do Solid -= 1 Exit = Exits[ExitIndex].Hit ExitIndex -= 1 end if Solid <= 0 then break end end if Solid > 0 or not Exit then return nil end local Thickness = (Exit.Position - Position):Dot(Direction) if not Finite(Thickness) or Thickness <= 0 or Thickness >= TargetDistance then return nil end local ExitMaterial, ExitModifier = Surface(Exit) if not Finite(ExitModifier) then return nil end local Combined = EntryMaterial == Enum.Material.Glass and 3 or (EntryModifier + ExitModifier) * 0.5 if EntryMaterial == ExitMaterial then Combined = Overrides[EntryMaterial] or Combined end if not Finite(Combined) or Combined <= 0 then return nil end return Exit.Position, 1 / Combined, EntryMaterial == Enum.Material.Glass and 0.05 or 0.16 end Functions.Combat.Penetration = function(Position, Origin, Weapon) local Data = Weapon and Weapon.Data local Delta = Position - Origin local Distance = Delta.Magnitude if not Data or not Finite(Distance) or Distance <= 0 then return false, 0, 0 end local Range = tonumber(Data.Range) if not Finite(Range) or Range <= 0 then return false, 0, 0 end if Distance > Range then return false, 0, 0 end local Map = Workspace:FindFirstChild("Map") local Geometry = Map and Map:FindFirstChild("Geometry") Parameters.FilterType = Geometry and Enum.RaycastFilterType.Include or Enum.RaycastFilterType.Exclude Parameters.FilterDescendantsInstances = Geometry and {Geometry} or {Functions.Game.Camera(), State.Characters} local Direction, Current = Delta.Unit, Origin local Damage, Power = tonumber(Data.Damage) or 0, tonumber(Data.Penetration) or 0 if not Finite(Damage) or not Finite(Power) or Damage < 1 or Power <= 0 then return false, 0, 0 end local FallOff = math.max(0.01, Config("DistanceFallOff", 34.7)) local Modifier = tonumber(Data.RangeModifier) if not Finite(Modifier) or Modifier < 0 or Modifier > 1 then return false, 0, 0 end local Maximum = math.max(0, Config("MaxPenetrationDistance", 6.246)) local Limit = Config("MinimumPenetrationStartDistance", 208.2) local Divisor = math.max(0.0001, Config("PenetrationLossDivisor", 0.1156)) local Travel, Walls = 0, 0 while Damage >= 1 do local Remaining = (Position - Current):Dot(Direction) if Remaining <= Epsilon then return Walls > 0 and Damage >= 1, Damage, Walls end local Entry = Workspace:Raycast(Current, Direction * Remaining, Parameters) if not Entry then Damage *= Modifier ^ ((Travel + Remaining) / FallOff) return Walls > 0 and Damage >= 1, Damage, Walls end Travel += Entry.Distance Damage *= Modifier ^ (Travel / FallOff) if Walls >= 4 or Travel > Limit or Damage < 1 then return false, 0, Walls end local Exit, Inverse, Fraction = TraceCover(Entry, Direction, Maximum, (Position - Entry.Position):Dot(Direction), Geometry) if not Exit then return false, 0, Walls end local Thickness = (Exit - Entry.Position).Magnitude local Loss = Damage * Fraction + math.max(0, 3 / Power * 1.25) * Inverse * 3 + Inverse * Thickness * Thickness / Divisor Damage -= math.max(0, Loss) Walls += 1 Current = Exit end return false, 0, Walls end end do local Get = Functions.Config.Get local Shot = Functions.Combat.Shot local Estimate = Functions.Combat.Accuracy local Trace = Functions.Combat.Penetration Functions.Target.Wallbang = Trace local Scan = {Stats = {}, Random = {}, Head = setmetatable({}, {__mode = "k"})} local Groups = { Head = {"Head"}, Torso = {"UpperTorso", "Torso", "LowerTorso"}, Arms = {"LeftUpperArm", "LeftLowerArm", "LeftHand", "RightUpperArm", "RightLowerArm", "RightHand", "Left Arm", "Right Arm"}, Legs = {"LeftUpperLeg", "LeftLowerLeg", "LeftFoot", "RightUpperLeg", "RightLowerLeg", "RightFoot", "Left Leg", "Right Leg"}, } local Categories = {"Head", "Torso", "Arms", "Legs"} local function Preference(Entity) return State.PlayerSettings and State.PlayerSettings[Entity.UserId] or {} end function Scan.Allowed(Entity) return Functions.Target.Valid(Entity) and Functions.Target.Enemy(Entity) and not Preference(Entity).Ignore end local function SelectionMode(Selection) if type(Selection) == "string" then return (Selection == "Random" or Selection == "Closest") and Selection or nil end if type(Selection) ~= "table" then return nil end local Closest for Key, Value in Selection do local Category = type(Value) == "string" and Value or Value == true and Key or nil if Category == "Random" then return "Random" end if Category == "Closest" then Closest = "Closest" end end return Closest end local function Names(Selection, Entity) if Preference(Entity).BodyAim then Selection = {"Torso"} end if SelectionMode(Selection) or Selection == "Highest Damage" then Selection = Categories end if type(Selection) == "string" then Selection = {Selection} end if type(Selection) ~= "table" then Selection = {"Head"} end local Result, Selected = {}, {} for Key, Value in Selection do local Category = type(Value) == "string" and Value or Value == true and Key or nil if Groups[Category] then Selected[Category] = true end end for _, Category in Categories do if Selected[Category] then for _, Name in Groups[Category] do Result[#Result + 1] = Name end end end if #Result == 0 then return {"Head"} end return Result end local function Hydrate(Value) if not Value then return nil end local Frame, Half = Functions.Game.Hitbox(Value.Data, Value.Part) if not Frame then Frame, Half = Functions.Game.PartFrame(Value.Data, Value.Part), Value.Part.Size * 0.5 end Value.Frame, Value.Half = Frame, Half return Value end local function Target(Entity, Part, Lazy) if not Part.Parent then return nil end local Position = Functions.Game.PartPosition(Entity, Part) if not Position then return nil end local Value = {Data = Entity, Entity = Entity, Part = Part, Position = Position} return Lazy and Value or Hydrate(Value) end local function Current(TargetValue) if not TargetValue or not Scan.Allowed(TargetValue.Data) or not TargetValue.Part.Parent then return false end return TargetValue.Data.Model and TargetValue.Data.Model:FindFirstChild(TargetValue.Part.Name) == TargetValue.Part end Scan.Current = Current local function PreparationCurrent(Value) if not Current(Value) or not Get("Ragebot", false) or (Value.Damage or 0) < math.max(1, Get("Rage Minimum Damage", 0)) then return false end if Value.Preparing == "Weapon Spread" then return not Get("No Spread", false) and (Get("Rage Auto Stop", false) or Get("Rage Auto Crouch", false) or Get("Rage Auto Scope", false)) end return Value.Preparing == "Weapon Accuracy" and Get("Rage Accuracy Check", false) and type(Value.Chance) == "number" and Value.Chance < Get("Rage Minimum Hit Chance", 65) end local function CommandBudget(Tick, Weapon, Simulation) local Budget = Scan.CommandBudget if not Budget or Budget.Tick ~= Tick or Budget.Weapon ~= Weapon or Budget.Simulation ~= Simulation then Budget = {Tick = Tick, Weapon = Weapon, Simulation = Simulation, Walls = 0, Checks = 0} Scan.CommandBudget = Budget end return Budget end local function CharacterLine(TargetValue, Origin, Direction, Distance, Budget) local Boxes = Budget.Hitboxes Scan.Stats.HitboxChecks = Budget.HitboxChecks or 0 if not Boxes then Boxes = {} local Parts = {} local Entities, Count = Functions.Game.Entities("Character") or {}, 0 local Friendly = Functions.Game.Config("Damage", "Teammate", false) for _, Entity in Entities do Count += 1 if Count > 128 then Scan.Stats.Reject = "Hitbox Budget"; return false end if Entity.UserId == State.LocalPlayer.UserId or not Entity.Model or not Entity.Model.Parent or (Entity.Health or 0) <= 0 or Functions.Target.Current and not Functions.Target.Current(Entity) or not Friendly and not Functions.Target.Enemy(Entity) then continue end local Player = type(Entity.UserId) == "number" and State.Services.Players:GetPlayerByUserId(Entity.UserId) if Player and Player:GetAttribute("SpawnProtected") then continue end for _, Part in Functions.Target.Parts(Entity) do if not Part.Parent then continue end if #Boxes >= 1024 then Scan.Stats.Reject = "Hitbox Budget"; return false end local Frame, Half = Functions.Game.Hitbox(Entity, Part) if Frame and Half then Boxes[#Boxes + 1] = {Data = Entity, Part = Part, Model = Entity.Model, Frame = Frame, Half = Half, SourceFrame = Part.CFrame, SourceSize = Part.Size} Parts[Part] = Entity end end end Budget.Hitboxes, Budget.HitboxParts = Boxes, Parts end if Budget.HitboxParts[TargetValue.Part] ~= TargetValue.Data then Scan.Stats.Reject = "Hitbox Unavailable"; return false end for _, Box in Boxes do local Part, Entity = Box.Part, Box.Data if Part == TargetValue.Part or not Part.Parent or Entity.Model ~= Box.Model or not Box.Model.Parent or Box.Model:FindFirstChild(Part.Name) ~= Part or (Entity.Health or 0) <= 0 then continue end if Box.SourceFrame ~= Part.CFrame or Box.SourceSize ~= Part.Size then Box.Frame, Box.Half = Functions.Game.Hitbox(Entity, Part) Box.SourceFrame, Box.SourceSize = Part.CFrame, Part.Size end if not Box.Frame or not Box.Half then continue end local Offset, Radius = Box.Frame.Position - Origin, Box.Half.Magnitude local Along = Offset:Dot(Direction) if Along + Radius < 0 or Along - Radius >= Distance - 0.0001 or Offset:Dot(Offset) - Along * Along > Radius * Radius then continue end if (Budget.HitboxChecks or 0) >= 1024 then Scan.Stats.Reject = "Hitbox Budget"; return false end Budget.HitboxChecks = (Budget.HitboxChecks or 0) + 1 Scan.Stats.HitboxChecks = Budget.HitboxChecks local Hit, Entry = Functions.Target.RayHitsHitbox(Box, Origin, Direction, Distance) if Hit and Entry < Distance - 0.0001 then Scan.Stats.Reject = "Character Obstruction"; return false end end return true end function Scan.Peek(Simulation, Command) if not Get("Ragebot", false) or not Get("Rage Auto Crouch", false) or not Simulation or Simulation.OnGround ~= true or State.AutoDefusing or State.AutoPeekReturning or Simulation.Climbing or Simulation.Noclip or Simulation.Frozen or Simulation.Preparation or Simulation.Planting or Simulation.Defusing then return nil end local Additional = Command and Command.AdditionalInputs if Additional and (Additional.Jump or Additional.PressE) then return nil end local function Finite(Value) return type(Value) == "number" and Value == Value and math.abs(Value) < math.huge end local Velocity = Simulation.Velocity if typeof(Velocity) ~= "Vector3" or not Finite(Velocity.X) or not Finite(Velocity.Y) or not Finite(Velocity.Z) then return nil end local Horizontal = Vector3.new(Velocity.X, 0, Velocity.Z) local Inputs, Constants = Command and Command.Inputs, Simulation.Constants if Inputs and Functions.Angles and type(Functions.Angles.Decode) == "function" then local Forward = (Inputs.Forward and 1 or 0) - (Inputs.Backward and 1 or 0) local Side = (Inputs.Right and 1 or 0) - (Inputs.Left and 1 or 0) if Forward ~= 0 or Side ~= 0 then local Okay, Yaw = pcall(Functions.Angles.Decode, Command.Yaw, Command.Pitch) local Speed = Constants and tonumber(Constants.Speed) if Okay and Finite(Yaw) and Finite(Speed) and Speed > 0 then local Wish = Vector3.new(Side * math.cos(Yaw) - Forward * math.sin(Yaw), 0, -Side * math.sin(Yaw) - Forward * math.cos(Yaw)) Horizontal = Wish.Unit * math.max(Horizontal.Magnitude, Speed) end end end if Horizontal.Magnitude < 0.5 then return nil end local Lead = tonumber(Get("Rage Crouch Lead Time", 0.15)) if not Finite(Lead) then Lead = 0.15 end Lead = math.clamp(Lead, 0.05, 0.35) local Camera = Functions.Game.Camera() local Origin = Shot.Origin(Camera, Simulation) if typeof(Origin) ~= "Vector3" or not Finite(Origin.X) or not Finite(Origin.Y) or not Finite(Origin.Z) then return nil end local Future = Origin + Horizontal * Lead local Range, Selection = Get("Rage Range", 300), Get("Rage Hitbox", "Highest Damage") local Candidates = {} for _, Entity in Functions.Game.Entities("Character") or {} do if not Scan.Allowed(Entity) or not Entity.Model then continue end local Score for _, Name in Names(Selection, Entity) do local Part = Entity.Model:FindFirstChild(Name) local Value = Part and Part:IsA("BasePart") and Target(Entity, Part, true) if not Value then continue end Score = Score or (Value.Position - Origin).Magnitude - (Preference(Entity).Priority and 10000 or 0) Value.Score, Value.Order = Score, #Candidates + 1 Candidates[#Candidates + 1] = Value end end table.sort(Candidates, function(A, B) return A.Score == B.Score and A.Order < B.Order or A.Score < B.Score end) if #Candidates == 0 or not Functions.Target.Visible(Candidates[1].Part, Origin, Future) then return nil end for Index = 1, math.min(#Candidates, 8) do local Value = Hydrate(Candidates[Index]) Value.Position = Value.Frame and Value.Frame.Position or Value.Position if Current(Value) and (Value.Position - Origin).Magnitude <= Range and (Value.Position - Future).Magnitude <= Range and not Functions.Target.Visible(Value.Part, Origin, Value.Position) and Functions.Target.Visible(Value.Part, Future, Value.Position) then Value.Approaching, Value.Origin, Value.FutureOrigin = true, Origin, Future return Value end end return nil end local function Candidate(Entity, Name, Camera, Origin, RequireVisible, Range, World) local Part = Entity.Model:FindFirstChild(Name) local Value = Part and Part:IsA("BasePart") and Target(Entity, Part, true) if not Value then return nil end local Point, OnScreen = Camera:WorldToViewportPoint(Value.Position) local Distance = World and (Value.Position - Origin).Magnitude or (Vector2.new(Point.X, Point.Y) - Camera.ViewportSize * 0.5).Magnitude Value.Point = Point if not OnScreen and not World or Distance > Range or RequireVisible and not Functions.Target.Visible(Part, Origin, Value.Position) then return nil, Distance, Value end return Value, Distance end local function Closest(Camera, Range, Mode, RequireVisible, Origin, Selection) local Best, Score, Rejected, RejectedScore = nil, math.huge, nil, math.huge for _, Entity in Functions.Game.Entities("Character") or {} do if not Scan.Allowed(Entity) or not Entity.Model then continue end for _, Name in Names(Selection, Entity) do local Value, Distance, Failed = Candidate(Entity, Name, Camera, Origin, RequireVisible, Range, Mode == "World") if not Value and not Failed then continue end if Preference(Entity).Priority then Distance *= 0.7 end if Failed and Distance < RejectedScore then Rejected, RejectedScore = Failed, Distance elseif Value and Distance < Score then Score, Best = Distance, Value end end end return Best, Rejected end function Scan.Closest(Range, Mode, RequireVisible, Origin, Selection) local Camera = Functions.Game.Camera() if not Camera then return nil end return Hydrate(Closest(Camera, Range or math.huge, Mode, RequireVisible, Origin or Camera.CFrame.Position, Selection)) end Functions.Target.Closest = Scan.Closest local function SelectionKey(Selection) if type(Selection) ~= "table" then return type(Selection) .. ":" .. tostring(Selection) end local Selected, Key = {}, {SelectionMode(Selection) or ""} for Index, Value in Selection do local Category = type(Value) == "string" and Value or Value == true and Index or nil if Groups[Category] then Selected[Category] = true end end for _, Category in Categories do Key[#Key + 1] = Selected[Category] and Category or "" end return table.concat(Key, "|") end function Scan.Legit(Silent, Origin, Tick) local Prefix = Silent and "Silent Aim" or "Aim" local Range, Selection = Get(Prefix .. " FOV", 160), Get(Prefix .. " Hitboxes", {"Head"}) local Visible = Get(Silent and "Silent Aim Visible Check" or "Wall Check", false) local Camera = Functions.Game.Camera() local Cache = Silent and Tick ~= nil if Silent and not Cache then Scan.LegitCache = nil end if not Camera then Scan.Random[Prefix] = nil if Silent then Scan.LegitCache = nil end return nil end Origin = Origin or Camera.CFrame.Position local Mode = SelectionMode(Selection) local Interval = Get(Prefix .. " Random Interval", 0.5) local Key = Cache and SelectionKey(Selection) local function Finish(Value, Rejected) Value = Hydrate(Value) if Cache then local Reference = Value or Rejected Scan.LegitCache = {Tick = Tick, Camera = Camera, Frame = Camera.CFrame, Viewport = Camera.ViewportSize, Origin = Origin, Range = Range, Selection = Key, Visible = Visible, Interval = Interval, BodyAim = Reference and Preference(Reference.Data).BodyAim, Target = Value, Recheck = not Value and Rejected or nil} end return Value end local Cached = Cache and Scan.LegitCache local Matches = Cached and Cached.Tick == Tick and Cached.Camera == Camera and Cached.Frame == Camera.CFrame and Cached.Viewport == Camera.ViewportSize and Cached.Origin == Origin and Cached.Range == Range and Cached.Selection == Key and Cached.Visible == Visible and Cached.Interval == Interval if Matches then local Value = Cached.Target or Cached.Recheck if not Value or not Cached.Target and not Current(Value) then return nil end if Value and Current(Value) and Cached.BodyAim == Preference(Value.Data).BodyAim then local Selected = false for _, Name in Names(Selection, Value.Data) do if Name == Value.Part.Name then Selected = true; break end end local Saved = Scan.Random[Prefix] local Held = Mode ~= "Random" or Saved and Saved.Data == Value.Data and Saved.Part == Value.Part and os.clock() - Saved.Time < Interval if Selected then local Updated = Candidate(Value.Data, Value.Part.Name, Camera, Origin, Visible, Range, false) if Updated and Updated.Part == Value.Part and Held then if Mode == "Random" then Updated.Time = Saved.Time; Scan.Random[Prefix] = Updated else Scan.Random[Prefix] = nil end return Finish(Updated) end if not Cached.Target and not Updated then return nil end end end end local Recheck = Matches and (Cached.Target or Cached.Recheck) if Cache then Scan.LegitCache = nil end local Best, Failed = Closest(Camera, Range, nil, Visible, Origin, Selection) if not Best or Mode ~= "Random" then Scan.Random[Prefix] = nil; return Finish(Best, Recheck or Failed) end local Saved = Scan.Random[Prefix] local Choices, Held, Now = {}, nil, os.clock() for _, Name in Names(Selection, Best.Data) do local Value = Candidate(Best.Data, Name, Camera, Origin, Visible, Range, false) if not Value then continue end Choices[#Choices + 1] = Value if Saved and Saved.Data == Value.Data and Saved.Part == Value.Part and Current(Saved) then Held = Value end end if Held and Now - Saved.Time < Interval then Held.Time = Saved.Time Scan.Random[Prefix] = Held return Finish(Held) end if #Choices == 0 then Scan.Random[Prefix] = nil; return Finish(nil, Recheck or Best) end Best = Choices[math.random(1, #Choices)] Best.Time = Now Scan.Random[Prefix] = Best return Finish(Best) end local function Point(TargetValue, Tick) if TargetValue.Part.Name ~= "Head" or not Get("No Spread", false) or not Get("No Spread Random Head", true) or not TargetValue.Frame or not TargetValue.Half then return TargetValue.Frame and TargetValue.Frame.Position or TargetValue.Position end local Saved = Scan.Head[TargetValue.Part] if not Saved or Saved.Tick ~= Tick then Saved = {Tick = Tick, Offset = Vector3.new(math.random() - 0.5, math.random() - 0.5, math.random() - 0.5) * 0.45} Scan.Head[TargetValue.Part] = Saved end local Half, Offset = TargetValue.Half, Saved.Offset return TargetValue.Frame:PointToWorldSpace(Vector3.new(Half.X * Offset.X, Half.Y * Offset.Y, Half.Z * Offset.Z)) end local function QualifyLine(TargetValue, Origin, Ray, Distance, Weapon, Budget) if not CharacterLine(TargetValue, Origin, Ray, Distance, Budget) then return false end local Position, Remaining = Origin + Ray * (Distance + 0.001), nil if not Functions.Target.Visible(TargetValue.Part, Origin, Position) then if not Get("Ragebot", false) or not Get("Rage Wallbang", false) then Scan.Stats.Reject = "Map Obstruction"; return false end if Budget.Walls >= 8 then Scan.Stats.Reject = "Wallbang Budget"; return false end Budget.Walls += 1 Scan.Stats.Walls = Budget.Walls local Possible, Damage = Trace(Position, Origin, Weapon) if not Possible then Scan.Stats.Reject = "Map Obstruction"; return false end Remaining, TargetValue.Penetrating = Damage, true end TargetValue.Damage = Functions.Target.Damage(TargetValue.Data, TargetValue.Part, Distance, Weapon, Remaining) if Get("Ragebot", false) and (TargetValue.Damage or 0) < math.max(1, Get("Rage Minimum Damage", 0)) then Scan.Stats.Reject = "Minimum Damage"; return false end return true end function Scan.Shot(TargetValue, Origin, Tick, Weapon, Simulation, Seed, CheckAccuracy, Budget) if TargetValue then TargetValue.Preparing = nil end if TargetValue and TargetValue.Approaching then Scan.Stats.Reject = "Approaching Cover"; return nil end if not Current(TargetValue) then return nil end local Range = Functions.Target.Range(Weapon) if Range <= 0 then Scan.Stats.Reject = "Weapon Range"; return nil end Budget = CommandBudget(Tick, Weapon, Simulation) local Frame, Half = Functions.Game.Hitbox(TargetValue.Data, TargetValue.Part) if not Frame or not Half then Frame, Half = Functions.Game.PartFrame(TargetValue.Data, TargetValue.Part), TargetValue.Part.Size * 0.5 end if not Frame or not Half then Scan.Stats.Reject = "Hitbox Unavailable"; return nil end TargetValue.Frame, TargetValue.Half, TargetValue.Penetrating = Frame, Half, false local Direction = TargetValue.Position - Origin if Direction.Magnitude <= 0.000001 then return nil end local Spread = Seed ~= nil and Get("No Spread", false) local Yaw, Pitch, Ray = Shot.Angles(Direction, Tick, Weapon, Simulation, Seed, true, Spread) if not Yaw then Scan.Stats.Reject = Spread and "Spread Correction Unavailable" or "Aim Angle Limit"; return nil end local Preparing = false if TargetValue.Frame and TargetValue.Half then local Hit, Distance = Functions.Target.RayHitsHitbox(TargetValue, Origin, Ray, Range + 2.776) if not Hit then if Spread or Seed == nil or not CheckAccuracy or not Get("Ragebot", false) or not (Get("Rage Auto Stop", false) or Get("Rage Auto Crouch", false) or Get("Rage Auto Scope", false)) then Scan.Stats.Reject = "Hitbox Ray"; return nil end Ray = Direction.Unit Hit, Distance = Functions.Target.RayHitsHitbox(TargetValue, Origin, Ray, Range + 2.776) if not Hit then Scan.Stats.Reject = "Hitbox Ray"; return nil end Preparing = true end if not QualifyLine(TargetValue, Origin, Ray, Distance, Weapon, Budget) then return nil end end if Preparing then TargetValue.Preparing, Scan.Stats.Reject = "Weapon Spread", "Weapon Spread" return nil end if CheckAccuracy and Get("Rage Accuracy Check", false) then local Native, Inaccuracy, Radius if type(Weapon.GetInaccuracy) == "function" and type(Weapon.GetSpread) == "function" then Native, Inaccuracy, Radius = pcall(function() return Weapon:GetInaccuracy(Simulation), Weapon:GetSpread(Weapon) end) end local Budget = Scan.Accuracy if not Budget or Budget.Tick ~= Tick or Budget.Weapon ~= Weapon or Budget.Simulation ~= Simulation then Budget = {Tick = Tick, Weapon = Weapon, Simulation = Simulation, Checks = 0, Entries = {}} Scan.Accuracy = Budget end local Entry for _, Saved in Budget.Entries do if Saved.Part == TargetValue.Part and Saved.Position == TargetValue.Position and Saved.Yaw == Yaw and Saved.Pitch == Pitch and Saved.Origin == Origin and Saved.Frame == Frame and Saved.Half == Half and Saved.Mode == Weapon.Mode and Saved.Data == Weapon.Data and Saved.Duck == Simulation.DuckAmount and Saved.Ground == Simulation.OnGround and Saved.Native == Native and Saved.Inaccuracy == Inaccuracy and Saved.Radius == Radius and Saved.Recoil == Weapon.RecoilIndex and Saved.Punch == (Simulation.SeenAimPunch or Simulation.AimPunchAngle) and Saved.Penalty == Weapon.AccuracyPenalty and Saved.Velocity == Simulation.Velocity and Saved.Zoom == Weapon.ZoomLevel then Entry = Saved break end end if not Entry then if Budget.Checks >= 4 then Scan.Stats.Reject = "Accuracy Budget"; return nil end Budget.Checks += 1 local Chance, Details = Estimate(Weapon, Simulation, TargetValue, Origin, Yaw, Pitch) Entry = {Part = TargetValue.Part, Position = TargetValue.Position, Yaw = Yaw, Pitch = Pitch, Origin = Origin, Frame = Frame, Half = Half, Mode = Weapon.Mode, Data = Weapon.Data, Duck = Simulation.DuckAmount, Ground = Simulation.OnGround, Recoil = Weapon.RecoilIndex, Native = Native, Inaccuracy = Inaccuracy, Radius = Radius, Punch = Simulation.SeenAimPunch or Simulation.AimPunchAngle, Penalty = Weapon.AccuracyPenalty, Velocity = Simulation.Velocity, Zoom = Weapon.ZoomLevel, Chance = Chance, Details = Details} Budget.Entries[#Budget.Entries + 1] = Entry end TargetValue.Chance, TargetValue.Accuracy = Entry.Chance, Entry.Details Scan.Stats.Chance, Scan.Stats.Accuracy, Scan.Stats.Checks = Entry.Chance, Entry.Details, Budget.Checks if not Entry.Chance or Entry.Chance < Get("Rage Minimum Hit Chance", 65) then if type(Entry.Chance) == "number" then TargetValue.Preparing = "Weapon Accuracy" end Scan.Stats.Reject = "Weapon Accuracy"; return nil end end Scan.Stats.Reject = nil return Yaw, Pitch end function Scan.Rage(Command, Simulation, Weapon, Seed) local Camera = Functions.Game.Camera() if not Camera or not Simulation or not Shot.Gun(Weapon) then Scan.Pending = nil; return nil end local Tick, Origin = Command.ClientTick, Shot.Origin(Camera, Simulation) local Budget = CommandBudget(Tick, Weapon, Simulation) local PreviousPending = Scan.Pending Scan.Pending = nil if Budget.Checks >= 48 then if Budget.Pending == PreviousPending and PreparationCurrent(PreviousPending) then Scan.Pending = PreviousPending end Scan.Stats.Walls, Scan.Stats.Qualifications, Scan.Stats.Reject = Budget.Walls, Budget.Checks, "Qualification Budget" return nil end local Candidates, Center = {}, Camera.ViewportSize * 0.5 local Range, Minimum = Get("Rage Range", 300), math.max(1, Get("Rage Minimum Damage", 0)) local Selection, Priority = Get("Rage Hitbox", "Highest Damage"), Get("Rage Target Priority", "Highest Damage") local Hitscan, Wallbang = Get("Rage Hitscan", false), Get("Rage Wallbang", false) local Accuracy, Chance, Spread = Get("Rage Accuracy Check", false), Get("Rage Minimum Hit Chance", 65), Get("No Spread", false) local Search = Scan.Search if not Search or Search.Weapon ~= Weapon or Search.Simulation ~= Simulation or Search.Selection ~= Selection or Search.Priority ~= Priority or Search.Hitscan ~= Hitscan or Search.Wallbang ~= Wallbang or Search.Range ~= Range or Search.Minimum ~= Minimum or Search.Accuracy ~= Accuracy or Search.Chance ~= Chance or Search.Spread ~= Spread then Search = {Weapon = Weapon, Simulation = Simulation, Selection = Selection, Priority = Priority, Hitscan = Hitscan, Wallbang = Wallbang, Range = Range, Minimum = Minimum, Accuracy = Accuracy, Chance = Chance, Spread = Spread, Cursor = 1} Scan.Search = Search end local function Score(Value) local Result = Priority == "Closest" and Value.Distance or Priority == "Crosshair" and (Vector2.new(Value.Point.X, Value.Point.Y) - Center).Magnitude or Priority == "Lowest Health" and (Value.Data.Health or 100) or -Value.Damage return Result - (Preference(Value.Data).Priority and 10000 or 0) end for _, Entity in Functions.Game.Entities("Character") or {} do if not Scan.Allowed(Entity) or not Entity.Model then continue end for _, Name in Names(Selection, Entity) do local Part = Entity.Model:FindFirstChild(Name) local Candidate = Part and Part:IsA("BasePart") and Target(Entity, Part) if not Candidate then continue end Candidate.Position = Point(Candidate, Tick) local MinimumDistance = math.max(0, ((Candidate.Frame and Candidate.Frame.Position or Candidate.Position) - Origin).Magnitude - (Candidate.Half and Candidate.Half.Magnitude or 0)) local Damage = Functions.Target.Damage(Entity, Part, MinimumDistance, Weapon) if Damage < Minimum then continue end local Positions = {Candidate.Position} if Hitscan and Candidate.Frame and Candidate.Half then for _, Offset in {Vector3.new(0.6, 0, 0), Vector3.new(-0.6, 0, 0), Vector3.new(0, 0.6, 0), Vector3.new(0, -0.6, 0)} do local Half = Candidate.Half Positions[#Positions + 1] = Candidate.Frame:PointToWorldSpace(Vector3.new(Half.X * Offset.X, Half.Y * Offset.Y, Half.Z * Offset.Z)) end end for _, Position in Positions do local Distance = (Position - Origin).Magnitude if Distance > Range then continue end local Screen, OnScreen = Camera:WorldToViewportPoint(Position) if Priority == "Crosshair" and (not OnScreen or Screen.Z <= 0) then continue end local Value = table.clone(Candidate) Value.Position, Value.Point, Value.Damage, Value.Distance = Position, Screen, Damage, Distance Value.Score, Value.Order = Score(Value), #Candidates + 1 Candidates[#Candidates + 1] = Value end end end table.sort(Candidates, function(A, B) return A.Score == B.Score and A.Order < B.Order or A.Score < B.Score end) local Count, Available = #Candidates, 48 - Budget.Checks Scan.Stats.Candidates, Scan.Stats.Walls, Scan.Stats.Reject = Count, Budget.Walls, nil if Count == 0 then Search.Cursor = 1; Budget.Pending = nil; return nil end local Start = (Search.Cursor - 1) % Count + 1 local Best, BestYaw, BestPitch, BestScore, PendingScore, Deferred, Next = nil, nil, nil, math.huge, math.huge, nil, Start local Limited = Count > Available for Offset = 0, math.min(Count, Available) - 1 do local Index = (Start + Offset - 1) % Count + 1 local Candidate = Candidates[Index] Next = Index % Count + 1 Budget.Checks += 1 local Yaw, Pitch = Scan.Shot(Candidate, Origin, Tick, Weapon, Simulation, Seed, true, Budget) if PreviousPending and PreviousPending.Part == Candidate.Part and PreviousPending.Position == Candidate.Position and Scan.Stats.Reject ~= "Accuracy Budget" and Scan.Stats.Reject ~= "Wallbang Budget" then PreviousPending = nil end if Yaw then local Value = Score(Candidate) if Value < BestScore then Best, BestYaw, BestPitch, BestScore = Candidate, Yaw, Pitch, Value end if Priority ~= "Highest Damage" then Limited = false; break end elseif Scan.Stats.Reject == "Accuracy Budget" then Deferred = Deferred or Index break elseif Scan.Stats.Reject == "Wallbang Budget" then Deferred = Deferred or Index elseif Candidate.Preparing then local Value = Score(Candidate) if Value < PendingScore then Scan.Pending, PendingScore = Candidate, Value end end local Following = Candidates[Next] if Best and (Next == 1 or Following.Score >= BestScore) then Limited = false; break end end Search.Cursor = Deferred or (Limited and Next) or (Best and 1 or Next) Scan.Stats.Walls, Scan.Stats.Qualifications = Budget.Walls, Budget.Checks if Best then Scan.Pending = nil Scan.Stats.Reject, Scan.Stats.Chance, Scan.Stats.Accuracy = nil, Best.Chance, Best.Accuracy return Best, BestYaw, BestPitch end if not Scan.Pending and Limited and Budget.Checks >= 48 and Budget.Pending == PreviousPending and PreparationCurrent(PreviousPending) then Scan.Pending = PreviousPending end Budget.Pending = Scan.Pending return nil end function Scan.Reset() Scan.Random, Scan.Accuracy, Scan.Search, Scan.Pending, Scan.LegitCache, Scan.CommandBudget = {}, nil, nil, nil, nil, nil table.clear(Scan.Head) end Functions.Combat.Targets = Scan end do local Self = {} local Sources = setmetatable({}, {__mode = "k"}) local function Finite(Value) return type(Value) == "number" and Value == Value and math.abs(Value) < math.huge end local function Vector(Value) return typeof(Value) == "Vector3" and Finite(Value.X) and Finite(Value.Y) and Finite(Value.Z) end function Self:Angles(Origin, Position) if not Vector(Origin) or not Vector(Position) then return nil end local Delta = Position - Origin if not Finite(Delta.Magnitude) or Delta.Magnitude <= 0.000001 then return nil end local Pitch, Yaw = CFrame.lookAt(Origin, Position):ToOrientation() if not Finite(Pitch) or not Finite(Yaw) then return nil end return Yaw, -Pitch end function Self:Apply(Command, Aim) if type(Command) ~= "table" or type(Aim) ~= "table" or Aim.Tick ~= Command.ClientTick then return nil end local Yaw, Pitch = Aim.Yaw, Aim.Pitch if not Finite(Yaw) or not Finite(Pitch) or Yaw < 0 or Yaw > 65535 or Pitch < 0 or Pitch > 65535 then return nil end local Result = table.clone(Command) Result.Yaw, Result.Pitch = Yaw, Pitch local Source = Sources[Command] if Source and Source.Tick ~= Command.ClientTick then Source = nil end local Inputs = Aim.MoveInputs or Source and Source.Inputs or Command.Inputs if type(Inputs) == "table" then local BaseYaw = Aim.MoveInputs and Aim.MoveYaw or Source and Source.Yaw or Aim.MoveYaw or Command.Yaw local BasePitch = Aim.MoveInputs and Aim.MovePitch or Source and Source.Pitch or Aim.MovePitch or Command.Pitch local MoveYaw = Functions.Angles.Decode(BaseYaw, BasePitch) local ShotYaw = Functions.Angles.Decode(Yaw, Pitch) Result.Inputs = Functions.Angles.RotateInputs(Inputs, MoveYaw, ShotYaw) Sources[Result] = {Tick = Command.ClientTick, Inputs = table.clone(Inputs), Yaw = BaseYaw, Pitch = BasePitch} end return Result end Functions.Combat.Packet = Self end do local Self = {} local function Finite(Value) return type(Value) == "number" and Value == Value and math.abs(Value) < math.huge end local function Encoded(Value) return Finite(Value) and Value >= 0 and Value <= 65535 end function Self:Reset() self.Last, self.Anchor = nil, nil end function Self:Step(Command, Simulation, Yaw, Pitch, BaseYaw, BasePitch) if not Encoded(Yaw) or not Encoded(Pitch) then return nil, nil, false end if not Functions.Config.Get("Ragebot", false) or not Functions.Config.Get("Rage Smooth Aim", false) then self:Reset() return Yaw, Pitch, true end local Tick = Command.ClientTick if not Finite(Tick) then return nil, nil, false end local Anchor = self.Anchor if not Anchor or Anchor.Tick ~= Tick or Anchor.Simulation ~= Simulation then local Last = self.Last if Last and Last.Simulation == Simulation and Tick > Last.Tick then BaseYaw, BasePitch = Last.Yaw, Last.Pitch end if not Encoded(BaseYaw) or not Encoded(BasePitch) then return nil, nil, false end Anchor = {Tick = Tick, Simulation = Simulation, Yaw = BaseYaw, Pitch = BasePitch} self.Anchor = Anchor end local Rate = State.Modules.GameConfig.Get("Game", "TickRate") if not Finite(Rate) or Rate <= 0 then Rate = 60 end local Speed = tonumber(Functions.Config.Get("Rage Smooth Aim Speed", 720)) if not Finite(Speed) then Speed = 720 end local Maximum = math.rad(math.clamp(Speed, 90, 1080)) / Rate local FromYaw, FromPitch = Functions.Angles.Decode(Anchor.Yaw, Anchor.Pitch) local ToYaw, ToPitch = Functions.Angles.Decode(Yaw, Pitch) local DeltaYaw = (ToYaw - FromYaw + math.pi) % (math.pi * 2) - math.pi local DeltaPitch = ToPitch - FromPitch local Distance = math.sqrt(DeltaYaw * DeltaYaw + DeltaPitch * DeltaPitch) if Distance <= Maximum then return Yaw, Pitch, true end local Fraction = math.max(0, Maximum - 0.00015) / Distance local NextYaw, NextPitch = Functions.Angles.Encode(FromYaw + DeltaYaw * Fraction, FromPitch + DeltaPitch * Fraction) return NextYaw, NextPitch, false end function Self:Commit(Command, Simulation) if not Command or not Finite(Command.ClientTick) or not Encoded(Command.Yaw) or not Encoded(Command.Pitch) then return end self.Last = {Tick = Command.ClientTick, Simulation = Simulation, Yaw = Command.Yaw, Pitch = Command.Pitch} end Functions.Combat.Steering = Self end do local Closest = Functions.Target.Closest local Self = {Phase = 0} local function Number(Name, Default, Minimum, Maximum) local Value = Functions.Config.Get(Name, Default) if type(Value) ~= "number" or Value ~= Value or math.abs(Value) == math.huge then Value = Default end return math.clamp(Value, Minimum, Maximum) end function Self:Reset() self.Tick, self.Phase, self.RandomTick, self.RandomYaw = nil, 0, nil, nil State.AntiAimYaw, State.AntiAimPitch = nil, nil end function Self:Apply(Packet, Command, Blocked) local Enabled = Functions.Config.Get("Anti Aim", false) local FakeYaw, FakePitch = Functions.Config.Get("Fake Yaw", false), Functions.Config.Get("Fake Pitch", false) if not Enabled and not FakeYaw and not FakePitch then self:Reset(); return end local Tick = Command and Command.ClientTick if type(Tick) ~= "number" or Tick ~= Tick or math.abs(Tick) == math.huge then self:Reset(); return end local Rate = State.Modules.GameConfig.Get("Game", "TickRate") if type(Rate) ~= "number" or Rate <= 0 or Rate ~= Rate then Rate = 60 end if self.Tick and Tick >= self.Tick then self.Phase = (self.Phase + math.min(Tick - self.Tick, Rate * 0.25) / Rate * math.rad(Number("Spin Speed", 180, 30, 720))) % (math.pi * 2) elseif self.Tick then self.Phase, self.RandomTick = 0, nil end self.Tick = Tick local Simulation = Functions.Game.Simulation() local Additional = Command.AdditionalInputs if Blocked or State.AutoDefusing or State.AutoPeekReturning or Simulation and (Simulation.OnGround == false or Simulation.Defusing or Simulation.Planting or Simulation.Frozen or Simulation.Preparation or Simulation.Climbing or Simulation.Noclip) or Additional and (Additional.Jump or Additional.PressE) then State.AntiAimYaw, State.AntiAimPitch = nil, nil return end local Yaw, Pitch = Command.Yaw, Command.Pitch if type(Yaw) ~= "number" or type(Pitch) ~= "number" or Yaw ~= Yaw or Pitch ~= Pitch or Yaw < 0 or Yaw > 65535 or Pitch < 0 or Pitch > 65535 then State.AntiAimYaw, State.AntiAimPitch = nil, nil return end Yaw, Pitch = Functions.Angles.Decode(Yaw, Pitch) local Offset, Mode = 0, Enabled and Functions.Config.Get("Anti Aim Yaw", "Backward") or "None" if Mode == "Backward" then Offset = math.pi elseif Mode == "Left" then Offset = math.pi * 0.5 elseif Mode == "Right" then Offset = -math.pi * 0.5 elseif Mode == "Spin" then Offset = self.Phase elseif Mode == "Jitter" then Offset = (Tick % 2 == 0 and 1 or -1) * math.rad(Number("Jitter Angle", 90, 0, 180)) elseif Mode == "Random" then if self.RandomTick ~= Tick then self.RandomTick, self.RandomYaw = Tick, math.rad(math.random(-180, 180)) end Offset = self.RandomYaw end if Enabled and Functions.Config.Get("Defensive Anti Aim", false) and Closest and Closest(400) then Offset += math.pi end if FakeYaw then Offset += math.rad(Number("Fake Yaw Offset", 90, -180, 180)) end local Inputs = Command.Inputs local OriginalYaw = Yaw Yaw = (Yaw + Offset + math.pi) % (math.pi * 2) - math.pi if FakePitch then Pitch = -math.rad(Number("Fake Pitch Angle", 0, -89, 89)) elseif Enabled then local Mode = Functions.Config.Get("Anti Aim Pitch", "None") if Mode == "Up" then Pitch = -1.55334 elseif Mode == "Down" then Pitch = 1.55334 end end local Spoof = table.clone(Command) Spoof.Yaw, Spoof.Pitch = Functions.Angles.Encode(Yaw, Pitch) Yaw, Pitch = Functions.Angles.Decode(Spoof.Yaw, Spoof.Pitch) if type(Inputs) == "table" then Spoof.Inputs = Functions.Angles.RotateInputs(Inputs, OriginalYaw, Yaw) end Packet.CurrentCommand = Spoof State.AntiAimYaw, State.AntiAimPitch = Yaw, Pitch end function Self:Destroy() self:Reset() end Functions.Combat.Anti = Self end do local Get, White = Functions.Config.Get, Color3.new(1, 1, 1) local Display = {} local function Circle() local Frame = Functions.Utility.Own(Instance.new("Frame")) Frame.BackgroundTransparency, Frame.BorderSizePixel, Frame.Visible = 1, 0, false Frame.AnchorPoint, Frame.Parent = Vector2.new(0.5, 0.5), State.GuiParent Instance.new("UICorner", Frame).CornerRadius = UDim.new(1, 0) local Stroke, Gradient, Fill = Instance.new("UIStroke", Frame), Instance.new("UIGradient"), Instance.new("UIGradient", Frame) Gradient.Parent = Stroke return Frame, Stroke, Gradient, Fill end local Aim, AimStroke, AimGradient, AimFill = Circle() local Silent, SilentStroke = Circle() local Line = Functions.Utility.Own(Instance.new("Frame")) Line.AnchorPoint, Line.BackgroundTransparency, Line.BorderSizePixel = Vector2.new(0, 0.5), 0, 0 Line.Visible, Line.Parent = false, State.GuiParent function Display.Update(Camera, Target) Aim.Visible, Silent.Visible = Camera ~= nil and Get("Aim FOV Circle", false), Camera ~= nil and Get("Silent Aim FOV Circle", false) Line.Visible = Camera ~= nil and Target ~= nil and Get("Target Snapline", false) if not Camera then return end local Center = Camera.ViewportSize * 0.5 if Aim.Visible then local Radius, Position = Get("Aim FOV", 160), Center if Get("Aim FOV Position", "Center") == "Mouse" then Position = State.Services.UserInputService:GetMouseLocation() end Aim.Position, Aim.Size = UDim2.fromOffset(Position.X, Position.Y), UDim2.fromOffset(Radius * 2, Radius * 2) local Color, Alpha = Functions.Config.Color("Aim FOV Color A", White) local Second = Functions.Config.Color("Aim FOV Color B", White) AimStroke.Color, AimStroke.Transparency, AimStroke.Thickness = Color, 1 - Alpha, Get("Aim FOV Thickness", 1) AimGradient.Enabled, AimGradient.Color, AimGradient.Rotation = Get("Aim FOV Gradient", false), ColorSequence.new(Color, Second), Get("Aim FOV Rotation", 0) Aim.BackgroundColor3 = Color Aim.BackgroundTransparency = Get("Aim FOV Fill", false) and 1 - Get("Aim FOV Fill Opacity", 0.15) * Alpha or 1 AimFill.Enabled, AimFill.Color, AimFill.Rotation = AimGradient.Enabled, AimGradient.Color, AimGradient.Rotation end if Silent.Visible then local Radius = Get("Silent Aim FOV", 160) local Color, Alpha = Functions.Config.Color("Silent Aim FOV Color", White) Silent.Position, Silent.Size = UDim2.fromOffset(Center.X, Center.Y), UDim2.fromOffset(Radius * 2, Radius * 2) SilentStroke.Color, SilentStroke.Transparency, SilentStroke.Thickness = Color, 1 - Alpha, Get("Silent Aim FOV Thickness", 1) Silent.BackgroundColor3 = Color Silent.BackgroundTransparency = Get("Silent Aim FOV Fill", false) and 1 - Get("Silent Aim FOV Fill Opacity", 0.15) * Alpha or 1 end if Line.Visible then local Point, Visible = Camera:WorldToViewportPoint(Target.Position) Line.Visible = Visible if Visible then local Delta = Vector2.new(Point.X, Point.Y) - Center Line.Position, Line.Size = UDim2.fromOffset(Center.X, Center.Y), UDim2.fromOffset(Delta.Magnitude, 1) Line.Rotation, Line.BackgroundColor3 = math.deg(math.atan2(Delta.Y, Delta.X)), Functions.Config.Color("Target Snapline Color", White) end end end function Display.Destroy() Aim:Destroy() Silent:Destroy() Line:Destroy() end Functions.Combat.Display = Display end do local Self = {} local function Horizontal(Value) return math.sqrt(Value.X * Value.X + Value.Z * Value.Z) end function Self:Stop() self.Returning, State.AutoPeekReturning = false, false self.ProgressDistance, self.ProgressTime, self.ReturnTime = nil, nil, nil end function Self:Reset() self.Anchor, self.Simulation, self.LastPosition, self.ShotSequence = nil, nil, nil, nil self.Path, self.Waypoint = nil, nil self:Stop() end function Self:Apply(Simulation, Command, Delta) local Aim = State.Controllers.Combat if not Aim then self:Reset(); return false end local _, Character = Functions.Game.Simulation() local Position = Simulation.Position if not Functions.Config.Get("Auto Peek", false) or not Command.Inputs or not Command.AdditionalInputs or not Position or Simulation.Frozen or Simulation.Preparation or Simulation.Noclip or Simulation.Climbing or Simulation.Planting or Simulation.Defusing or Character and Character.Health and Character.Health <= 0 then self:Reset() return false end local Sequence = Aim.ShotSequence or 0 if self.Simulation ~= Simulation or not self.Anchor or self.LastPosition and (Position - self.LastPosition).Magnitude > 32 then self.Anchor, self.Simulation, self.ShotSequence = Position, Simulation, Sequence self.Path = {Position} self:Stop() elseif Sequence ~= self.ShotSequence then self.ShotSequence = Sequence if not self.Returning and Horizontal(self.Anchor - Position) > 0.3 then self.Returning, self.Waypoint = true, #self.Path self.ProgressTime, self.ReturnTime = 0, 0 self.ProgressDistance = nil end end self.LastPosition = Position State.AutoPeekReturning = self.Returning if not self.Returning then if (Position - self.Path[#self.Path]).Magnitude >= 0.6 then table.insert(self.Path, Position) if #self.Path > 128 then table.remove(self.Path, 2) end end return false end while self.Waypoint > 1 and Horizontal(self.Path[self.Waypoint] - Position) <= 0.45 do self.Waypoint -= 1 self.ProgressDistance, self.ProgressTime = nil, 0 end local Offset = self.Path[self.Waypoint] - Position local Distance, AnchorDistance = Horizontal(Offset), Horizontal(self.Anchor - Position) local Velocity = Simulation.Velocity or Vector3.new(0, 0, 0) local Speed, Step = Horizontal(Velocity), math.clamp(Delta or 0, 0, 0.1) self.ReturnTime += Step if not self.ProgressDistance or Distance < self.ProgressDistance - 0.025 then self.ProgressDistance, self.ProgressTime = Distance, 0 else self.ProgressTime += Step end if self.ProgressTime > 0.75 or self.ReturnTime > 8 then for Index = #self.Path, self.Waypoint + 1, -1 do self.Path[Index] = nil end self.Waypoint = nil self:Stop() return false end for _, Name in {"Forward", "Backward", "Left", "Right"} do Command.Inputs[Name] = false end Command.AdditionalInputs.Jump = false Command.AdditionalInputs.Walk = false if AnchorDistance <= 0.3 and Speed <= 0.75 then self.Path, self.Waypoint = {self.Anchor}, nil self:Stop() return true end if self.Waypoint == 1 and Speed > 0.75 and AnchorDistance <= math.max(0.3, Speed * Step * 2) then Offset = Vector3.new(-Velocity.X, 0, -Velocity.Z) end if Horizontal(Offset) > 0.001 then local CameraYaw = Functions.Angles.Decode(Command.Yaw, Command.Pitch) local Inputs = Functions.Angles.RotateInputs({Forward = true}, math.atan2(-Offset.X, -Offset.Z), CameraYaw) for _, Name in {"Forward", "Backward", "Left", "Right"} do Command.Inputs[Name] = Inputs[Name] == true end end return true end function Self:Destroy() self:Reset() end Functions.Combat.Peek = Self end do local Self = {} function Self:Reset() self.Simulation, self.LastJumped = nil, nil end function Self:Apply(Simulation, Command, Now) if self.Simulation ~= Simulation then self:Reset(); self.Simulation = Simulation end local Additional, Inputs = Command.AdditionalInputs, Command.Inputs if not Additional or Simulation.Noclip or Simulation.Frozen or Simulation.Preparation or Simulation.Planting or Simulation.Defusing then self.LastJumped = nil; return false end local Automatic = Functions.Config.Get("Auto Hop", false) local Held = State.Services.UserInputService:IsKeyDown(Enum.KeyCode.Space) if not Automatic and not (Functions.Config.Get("Bhop", false) and Held) then self.LastJumped = nil; return false end if Automatic and (Simulation.Climbing or not Inputs or Additional.Walk or Additional.Duck) then return false end local Forward = Inputs and ((Inputs.Forward and 1 or 0) - (Inputs.Backward and 1 or 0)) or 0 local Side = Inputs and ((Inputs.Right and 1 or 0) - (Inputs.Left and 1 or 0)) or 0 local Moving = Forward ~= 0 or Side ~= 0 local Requested = Held or Automatic and Moving if not Requested then self.LastJumped = nil; Additional.Jump = false; return false end Now = Now or os.clock() if Simulation.OnGround or not Automatic and Simulation.Climbing then Additional.Jump, Simulation.DoJump = true, true Simulation.HasWalkMovedSinceLastJump = false self.LastJumped = Now else Additional.Jump, Simulation.DoJump = false, false local Delay = tonumber(Functions.Config.Get("Bhop Duck Delay", 50)) or 50 if not Automatic and self.LastJumped and Now >= self.LastJumped and Now - self.LastJumped < math.clamp(Delay, 0, 1000) / 1000 then Additional.Duck = true end end return Moving end Functions.Character.Hop = Self end do local Self = {} function Self:Reset() self.StartTick, self.Simulation = nil, nil end function Self:Apply(Simulation, Command, Blocked) local Inputs, Tick = Command.AdditionalInputs, Command.ClientTick if not Functions.Config.Get("Duck Peek Assist", false) or Blocked or not Inputs or type(Tick) ~= "number" or Tick ~= Tick or math.abs(Tick) == math.huge or Simulation.OnGround == false or Simulation.Climbing or Simulation.Frozen or Simulation.Preparation or Simulation.Noclip or Simulation.Defusing or Simulation.Planting or Inputs.Jump or Inputs.PressE then self:Reset(); return false end local Rate = State.Modules.GameConfig.Get("Game", "TickRate") if type(Rate) ~= "number" or Rate ~= Rate or Rate <= 0 or Rate == math.huge then Rate = 60 end local function Duration(Flag, Default) local Value = tonumber(Functions.Config.Get(Flag, Default)) if not Value or Value ~= Value or math.abs(Value) == math.huge then Value = Default end return math.max(1, math.floor(math.clamp(Value, 0.1, 2) * Rate + 0.5)) end if self.Simulation ~= Simulation or not self.StartTick or Tick < self.StartTick then self.Simulation, self.StartTick = Simulation, Tick end local Duck, Peek = Duration("Duck Peek Crouch Time", 0.6), Duration("Duck Peek Stand Time", 0.2) Inputs.Duck = (Tick - self.StartTick) % (Duck + Peek) < Duck return true end function Self:Destroy() self:Reset() end Functions.Character.Duck = Self end do local Modules = State.Modules local Self = {} local function Setting(Name, Default) local Config = Modules.SimulationConfig.CFG local Value = Config and Config[Name] if Value == nil then Value = Modules.GameConfig.Get("Bomb", Name) end return Value == nil and Default or Value end function Self:Apply(Simulation, Command) State.AutoDefusing = false local Additional = Command.AdditionalInputs if not Functions.Config.Get("Auto Defuse", false) or not Additional or not Simulation.OnGround or Simulation.Noclip or Simulation.Climbing or Simulation.Frozen or Simulation.Preparation or Simulation.Planting or type(Simulation.BuildCameraCFrame) ~= "function" then return false end local Teams = Modules.GameConfig.Get("Bomb", "CanDefuse") or {CT = true} if not Teams[Simulation.Team] then return false end local Collision = Modules.CollisionModule local SweepBox = Collision and Collision.SweepBox if type(SweepBox) ~= "function" then Collision = Modules.Collision SweepBox = Collision and Collision.SweepBox end if type(SweepBox) ~= "function" then return false end local Frame = Simulation:BuildCameraCFrame(true, true) local Origin = Frame.Position local Reach, Best = Setting("DefuseRange", 4.303), nil local Range = Reach local Delay = Setting("InterpolationDelay", 0) for _, Bomb in Functions.Game.Entities("Bomb") or {} do local Part = Bomb.Model and Bomb.Model.PrimaryPart if not Part or not Part.Parent or Bomb.Defused or Bomb.Exploded or type(Bomb.BlowTimer) == "number" and Bomb.BlowTimer <= Delay or Bomb.Defusing and Bomb.Defusing ~= 0 and Bomb.Defusing ~= Simulation.Identifier then continue end local Delta = Part.Position - Origin local Distance = math.sqrt(Delta.X * Delta.X + Delta.Z * Delta.Z) if Distance > Range or Delta.Magnitude > Reach * 1.1612903225806452 or Delta.Magnitude <= 0.001 then continue end local Okay, Hit = pcall(SweepBox, Origin, Part.Position, Vector3.new(0.02, 0.02, 0.02)) if Okay and type(Hit) == "table" and type(Hit.Fraction) == "number" and Hit.Fraction >= 0.98 then Best, Range = Part, Distance end end if not Best then return false end local Direction = (Best.Position - Origin).Unit local Config = Modules.SimulationConfig.CFG or {} local Scale = Config.RecoilScale or Modules.GameConfig.Get("Weapon", "RecoilScale") or 2 local Tracking = Config.ViewRecoilTracking or Modules.GameConfig.Get("Weapon", "ViewRecoilTracking") or 1 local Punch = (Simulation.AimPunchAngle or Vector3.new()) * (Scale * Tracking) + (Simulation.ViewPunchAngle or Vector3.new()) Command.Yaw, Command.Pitch = Functions.Angles.Encode(math.atan2(-Direction.X, -Direction.Z) - math.rad(Punch.Y), math.asin(math.clamp(-Direction.Y, -1, 1)) + math.rad(Punch.X)) if Command.Inputs then Command.Inputs = table.clone(Command.Inputs) for Name in Command.Inputs do Command.Inputs[Name] = false end end Additional = table.clone(Additional) Command.AdditionalInputs = Additional Additional.PressE, Additional.Jump = true, false State.AutoDefusing = true return true end function Self:Destroy() State.AutoDefusing = nil end Functions.Character.Defuse = Self end do local Get, Modules = Functions.Config.Get, State.Modules local Shot = Functions.Combat.Shot local Scan = Functions.Combat.Targets local Packet = Functions.Combat.Packet local Steering = Functions.Combat.Steering local Anti = Functions.Combat.Anti local Reload = Functions.Combat.Reload local Display = Functions.Combat.Display local Combat = {FireHeld = false, ShotSequence = 0, Stats = {State = "Disabled"}, Installed = {}} local function Manual() return Functions.Game.ManualFire() end local function Fire(Value, Alternate) if Combat.FireHeld and (not Value or Alternate ~= Combat.FireAlternate) then pcall(Modules.Weapon.UpdateKeyState, Combat.FireAlternate and "WishFire2" or "WishFire", false) end Combat.FireHeld, Combat.FireAlternate = Value, Alternate if Value then pcall(Modules.Weapon.UpdateKeyState, Alternate and "WishFire2" or "WishFire", true) end end local function Paused(Simulation) return State.AutoDefusing or State.AutoPeekReturning or Simulation and (Simulation.Defusing or Simulation.Planting or Simulation.Frozen or Simulation.Preparation or Simulation.Noclip) end function Combat.Pause() Combat.Saved, Combat.Prepared, Combat.RageTarget, Combat.RageFiring = nil, nil, nil, false Combat.RejectedTick, Combat.Recoil = nil, nil Fire(false) end function Combat.Reset(Reason, PreserveReload) Combat.Pause() Combat.Target, Combat.MoveCommand, Combat.Simulation, Combat.Weapon = nil, nil, nil, nil Combat.FiredTick, Combat.ScanTime = nil, nil Steering:Reset() Scan.Reset() if not PreserveReload then Reload.Reset() end Anti:Reset() Combat.Stats.State = Reason or "Disabled" end local function Context(Simulation, Weapon) if Combat.Simulation ~= Simulation or Combat.Weapon ~= Weapon then Combat.Reset(Combat.Simulation ~= Simulation and "New Character" or "Weapon Changed", Simulation ~= nil and Combat.Simulation == Simulation) Combat.Simulation, Combat.Weapon = Simulation, Weapon end end function Combat.BeginCommand(Simulation, Command) Context(Simulation, Functions.Game.Weapon()) if not Command or type(Command.ClientTick) ~= "number" then return end Combat.LastTick = Command.ClientTick Combat.MoveCommand = {Tick = Command.ClientTick, ViewYaw = Command.Yaw, ViewPitch = Command.Pitch, Yaw = Command.Yaw, Pitch = Command.Pitch, Inputs = type(Command.Inputs) == "table" and table.clone(Command.Inputs)} end function Combat.Anticipate(Simulation, Command) if Get("Ragebot", false) and Get("Rage Auto Crouch", false) and not Paused(Simulation) then return Scan.Peek(Simulation, Command) end return nil end function Combat.Movement(Command) local Move = Combat.MoveCommand if Move and Command and Move.Tick == Command.ClientTick then Move.Yaw, Move.Pitch = Command.Yaw, Command.Pitch Move.Inputs = type(Command.Inputs) == "table" and table.clone(Command.Inputs) end end local function Save(Command, Simulation, Weapon, Target, Yaw, Pitch, Rage) local Move, Ready = Combat.MoveCommand, true if Move and Move.Tick ~= Command.ClientTick then Move = nil end local BaseYaw, BasePitch = Move and Move.Yaw or Command.Yaw, Move and Move.Pitch or Command.Pitch if Rage then Yaw, Pitch, Ready = Steering:Step(Command, Simulation, Yaw, Pitch, BaseYaw, BasePitch) end if not Yaw then return nil end local Saved = {Tick = Command.ClientTick, Yaw = Yaw, Pitch = Pitch, MoveYaw = BaseYaw, MovePitch = BasePitch, MoveInputs = Move and Move.Inputs or type(Command.Inputs) == "table" and table.clone(Command.Inputs), Target = Target, Ready = Ready, Rage = Rage, Simulation = Simulation, Weapon = Weapon} Combat.Saved, Combat.Target = Saved, Target if Rage then Combat.RageTarget, Combat.RageFiring = Target, Ready Combat.Stats.State = Ready and "Ready" or "Turning" if not Ready then Combat.RejectedTick = Command.ClientTick end end return Saved end local function Prepare(Command, Simulation, Weapon, Seed) Context(Simulation, Weapon) if not Command or not Simulation or not Shot.Gun(Weapon) or Paused(Simulation) then return nil end local Camera = Functions.Game.Camera() local Origin = Shot.Origin(Camera, Simulation) if not Origin then return nil end if Get("Ragebot", false) then local Prepared, Target, Yaw, Pitch = Combat.Prepared local Punch = Simulation.SeenAimPunch or Simulation.AimPunchAngle local Frame, Half if Prepared and Scan.Current(Prepared.Target) then Frame, Half = Functions.Game.Hitbox(Prepared.Target.Data, Prepared.Target.Part) if not Frame or not Half then Frame, Half = Functions.Game.PartFrame(Prepared.Target.Data, Prepared.Target.Part), Prepared.Target.Part.Size * 0.5 end end if Prepared and Prepared.Tick == Command.ClientTick and Prepared.Weapon == Weapon and Prepared.Simulation == Simulation and Prepared.Seed == Seed and Prepared.Punch == Punch and Prepared.Velocity == Simulation.Velocity and Prepared.Duck == Simulation.DuckAmount and Prepared.Ground == Simulation.OnGround and Prepared.Recoil == Weapon.RecoilIndex and Prepared.Penalty == Weapon.AccuracyPenalty and Prepared.Mode == Weapon.Mode and Prepared.Zoom == Weapon.ZoomLevel and Prepared.Origin == Origin and Prepared.NoSpread == Get("No Spread", false) and Prepared.Pattern == Get("No Spread Fixed Pattern", false) and Prepared.Minimum == Get("Rage Minimum Damage", 0) and Prepared.Accuracy == Get("Rage Accuracy Check", false) and Prepared.Chance == Get("Rage Minimum Hit Chance", 65) and Scan.Current(Prepared.Target) and Prepared.Frame == Frame and Prepared.Half == Half and Prepared.Position == Functions.Game.PartPosition(Prepared.Target.Data, Prepared.Target.Part) then Yaw, Pitch = Scan.Shot(Prepared.Target, Origin, Command.ClientTick, Weapon, Simulation, Seed, true) if Yaw then Target = Prepared.Target end end if not Yaw then Target, Yaw, Pitch = Scan.Rage(Command, Simulation, Weapon, Seed) if Target then Combat.Prepared = {Tick = Command.ClientTick, Weapon = Weapon, Simulation = Simulation, Seed = Seed, Punch = Punch, Velocity = Simulation.Velocity, Duck = Simulation.DuckAmount, Ground = Simulation.OnGround, Recoil = Weapon.RecoilIndex, Penalty = Weapon.AccuracyPenalty, Mode = Weapon.Mode, Zoom = Weapon.ZoomLevel, Origin = Origin, Position = Functions.Game.PartPosition(Target.Data, Target.Part), Target = Target, Frame = Target.Frame, Half = Target.Half, Yaw = Yaw, Pitch = Pitch, NoSpread = Get("No Spread", false), Pattern = Get("No Spread Fixed Pattern", false), Minimum = Get("Rage Minimum Damage", 0), Accuracy = Get("Rage Accuracy Check", false), Chance = Get("Rage Minimum Hit Chance", 65)} else Combat.Prepared = nil end end Combat.RageTarget, Combat.Target = Target or Scan.Pending, Target or Scan.Pending if not Yaw then Combat.Saved, Combat.RageFiring, Combat.RejectedTick = nil, false, Command.ClientTick Combat.Stats.State = Scan.Stats.Reject or "No Target" return nil end return Save(Command, Simulation, Weapon, Target, Yaw, Pitch, true) end if Get("Silent Aim", false) then local Target = Scan.Legit(true, Origin, Command.ClientTick) if Target then local Yaw, Pitch = Scan.Shot(Target, Origin, Command.ClientTick, Weapon, Simulation, Seed, false) if Yaw then return Save(Command, Simulation, Weapon, Target, Yaw, Pitch, false) end end end if Get("No Recoil", false) or Get("No Spread", false) then local Move = Combat.MoveCommand if Move and Move.Tick ~= Command.ClientTick then Move = nil end local Yaw, Pitch = Functions.Angles.Decode(Move and Move.ViewYaw or Command.Yaw, Move and Move.ViewPitch or Command.Pitch) local Direction = Functions.Angles.Direction(Yaw, Pitch) if Camera and (Camera.CFrame.Position - Origin).Magnitude > 0.1 then if not Combat.AimRay then Combat.AimRay = RaycastParams.new() Combat.AimRay.FilterType, Combat.AimRay.IgnoreWater = Enum.RaycastFilterType.Exclude, true end local Ignore = {Camera} local Character = State.Services.Players.LocalPlayer.Character if Character then Ignore[#Ignore + 1] = Character end if State.ThirdPersonModel then Ignore[#Ignore + 1] = State.ThirdPersonModel end Combat.AimRay.FilterDescendantsInstances = Ignore local Range = Weapon.Data.Range or 2000 local Hit = State.Services.Workspace:Raycast(Camera.CFrame.Position, Direction * Range, Combat.AimRay) local Position = Hit and Hit.Position or Camera.CFrame.Position + Direction * Range if (Position - Origin).Magnitude > 0 then Direction = (Position - Origin).Unit end end local NewYaw, NewPitch = Shot.Angles(Direction, Command.ClientTick, Weapon, Simulation, Seed, Get("No Recoil", false), Seed ~= nil and Get("No Spread", false)) if NewYaw then return Save(Command, Simulation, Weapon, nil, NewYaw, NewPitch, false) end end Combat.Saved = nil return nil end local function Apply(Command, Simulation, Saved) local Result = Packet:Apply(Command, Saved) if not Result then return false end Command.Yaw, Command.Pitch, Command.Inputs = Result.Yaw, Result.Pitch, Result.Inputs Simulation.Yaw, Simulation.Pitch = Functions.Angles.Decode(Result.Yaw, Result.Pitch) return Saved.Ready end function Combat.EndCommand(Simulation, Command) local Move = Combat.MoveCommand if not Move or not Command or Move.Tick ~= Command.ClientTick then return end local Saved = Combat.Saved if Get("Ragebot", false) and Saved and Saved.Tick == Command.ClientTick and Saved.Simulation == Simulation then Apply(Command, Simulation, Saved) else Simulation.Yaw, Simulation.Pitch = Functions.Angles.Decode(Move.ViewYaw, Move.ViewPitch) end end local function Scope(Map, Weapon, Target) if not Get("Rage Auto Scope", false) or not Target or not Weapon or Weapon.Data.Ammo <= 0 then return false end local Alternate = Weapon.Data.AltFunction local Kind = Alternate and Alternate.Name if Kind ~= "Scope" and Kind ~= "ScopeRifle" then return false end if Kind == "Scope" and (Weapon.ZoomLevel or 0) > 0 or Kind == "ScopeRifle" and Weapon.Mode == 2 then return false end if not Manual() then Map.WishBooleans.WishFire = false end local Restoring = Kind == "Scope" and (Weapon.SniperShotActive or (Weapon.SavedZoom or 0) > 0) local Ready = not Weapon.Equipping and not Weapon.Reloading and not Weapon.Firing and not Weapon.WaitForNoAttack and not Weapon.Silencer and not Restoring and (Weapon.Timer or 0) > (Weapon.AltFunctionDelay or 0) if Ready and not Weapon.AltFunctionHeld then Map.WishBooleans.WishFire2 = true end return true end local function Input(Original, ...) local Results = table.pack(Original(...)) local Native = Results[1] if type(Native) ~= "table" or type(Native.WishBooleans) ~= "table" then return table.unpack(Results, 1, Results.n) end local Map = table.clone(Native) Map.WishBooleans = table.clone(Native.WishBooleans) Results[1] = Map local Simulation, Character = Functions.Game.Simulation() local Weapon = Functions.Game.Weapon() local Command = Character and Character.CurrentCommand if Paused(Simulation) then Combat.Pause() if not Manual() then Map.WishBooleans.WishFire, Map.WishBooleans.WishFire2 = false, false end return table.unpack(Results, 1, Results.n) end if Get("Ragebot", false) and Shot.Gun(Weapon) and Command then local Saved = Prepare(Command, Simulation, Weapon, Shot.Seed(Command.ClientTick, Weapon)) Combat.RageFiring = Saved ~= nil and Saved.Ready and Weapon.Data.Ammo > 0 and not Weapon.WaitForNoAttack if Combat.RageFiring then Map.WishBooleans.WishFire = true elseif not Manual() then Map.WishBooleans.WishFire = false end if Saved and not Saved.Ready then Map.WishBooleans.WishFire = false end if Scope(Map, Weapon, Combat.RageTarget) then Combat.RageFiring = false end end if Shot.Gun(Weapon) and (Get("Rapid Fire", false) or Get("Ragebot", false)) then local Alternate = Weapon.Data.AltFunction local NeedsRelease = not Weapon.Data.Automatic or Alternate and Alternate.Name == "Burst" and Weapon.Mode == 2 if NeedsRelease and Map.WishBooleans.WishFire then Map.WishBooleans.WishFire = Weapon.WannaShoot ~= true end if Weapon.WaitForNoAttack then Map.WishBooleans.WishFire, Map.WishBooleans.WishFire2 = false, false end end Reload.Apply(Map, Weapon) Combat.Stats.RequestedFire = Map.WishBooleans.WishFire return table.unpack(Results, 1, Results.n) end local function Tick(Original, Weapon, Character, WeaponCommand, Resim, ...) local Simulation, Local = Functions.Game.Simulation() if not Resim and Character == Local and Simulation and Shot.Gun(Weapon) and Weapon == Functions.Game.Weapon() and Get("Ragebot", false) and not Paused(Simulation) then local Command = Character.CurrentCommand local Wishes = WeaponCommand and WeaponCommand.WishBooleans if Command and (Wishes and Wishes.WishFire or Shot.Burst(Weapon)) then local Saved = Prepare(Command, Simulation, Weapon, Shot.Seed(Command.ClientTick, Weapon)) if Saved then Apply(Command, Simulation, Saved) end if not Saved or not Saved.Ready then if Saved or not Manual() and not Shot.Burst(Weapon) then if Wishes then Wishes.WishFire = false end Combat.RejectedTick = Command.ClientTick end end end end return Original(Weapon, Character, WeaponCommand, Resim, ...) end local function NativeFire(Original, Weapon, Character, Resim, RenderTime, Seed, ...) local Simulation, Local = Functions.Game.Simulation() local LocalShot = not Resim and Character ~= nil and Character == Local and Simulation and Character.Simulation == Simulation and Weapon == Functions.Game.Weapon() and Shot.Gun(Weapon) local Command, Ammo, Recoil if LocalShot then Command, Ammo, Recoil = Character.CurrentCommand, Weapon.Data.Ammo, Weapon.RecoilIndex Combat.Stats.FireCalls = (Combat.Stats.FireCalls or 0) + 1 if Command and not Paused(Simulation) then local Saved = Prepare(Command, Simulation, Weapon, Seed) if Saved then Apply(Command, Simulation, Saved) if Saved.Rage and not Saved.Ready and not Shot.Burst(Weapon) then Combat.RejectedTick = Command.ClientTick local Map = Character.CurrentWeaponCommand if Map and Map.WishBooleans then Map.WishBooleans.WishFire = false end return nil end elseif Get("Ragebot", false) and not Manual() and not Shot.Burst(Weapon) then Combat.RejectedTick, Combat.RageFiring = Command.ClientTick, false local Map = Character.CurrentWeaponCommand if Map and Map.WishBooleans then Map.WishBooleans.WishFire = false end return nil end end end local Results = table.pack(Original(Weapon, Character, Resim, RenderTime, Seed, ...)) if LocalShot and (Results[1] ~= nil or Weapon.Data.Ammo < Ammo or type(Recoil) == "number" and type(Weapon.RecoilIndex) == "number" and Weapon.RecoilIndex > Recoil) then Combat.ShotSequence += 1 Combat.FiredTick, Combat.Stats.State = Command and Command.ClientTick, "Fired" Combat.Stats.Shots = Combat.ShotSequence end return table.unpack(Results, 1, Results.n) end local function Hold(PacketValue) local Map = PacketValue.CurrentWeaponCommand if Map and Map.WishBooleans then Map = table.clone(Map) Map.WishBooleans = table.clone(Map.WishBooleans) Map.WishBooleans.WishFire = false PacketValue.CurrentWeaponCommand = Map end end local function Network(Original, Native, ...) if type(Native) ~= "table" or type(Native.CurrentCommand) ~= "table" then return Original(Native, ...) end local Value, Command = table.clone(Native), Native.CurrentCommand local Simulation = Functions.Game.Simulation() local Weapon, Saved = Functions.Game.Weapon(), Combat.Saved local Wishes = Value.CurrentWeaponCommand and Value.CurrentWeaponCommand.WishBooleans local Requested = Manual() or Combat.FireHeld or Wishes and Wishes.WishFire or Value.CurrentWeaponCommand and Value.CurrentWeaponCommand.Shot if Combat.FiredTick ~= Command.ClientTick then if not Paused(Simulation) and Shot.Gun(Weapon) and (Requested or Get("Ragebot", false)) then Saved = Prepare(Command, Simulation, Weapon, Shot.Seed(Command.ClientTick, Weapon)) else Saved = nil end end local Applied = Saved and Saved.Tick == Command.ClientTick and Saved.Simulation == Simulation and Saved.Weapon == Weapon if Applied then Value.CurrentCommand = Packet:Apply(Command, Saved) or Command if Saved.Rage and not Saved.Ready then Hold(Value) end elseif Get("Ragebot", false) and Combat.RejectedTick == Command.ClientTick and Combat.FiredTick ~= Command.ClientTick then Hold(Value) end if not Applied then local Shooting = Requested or Combat.FiredTick == Command.ClientTick or Wishes and Wishes.WishFire2 Anti:Apply(Value, Command, Shooting) end if Get("Backtrack", false) and not Get("Ragebot", false) and (Requested or Combat.FiredTick == Command.ClientTick) and Value.CurrentWeaponCommand then local Map = table.clone(Value.CurrentWeaponCommand) Map.RenderTime = (Map.RenderTime or Command.RenderTime or os.clock()) - math.clamp(Get("Backtrack Time", 0.1), 0, 0.2) Value.CurrentWeaponCommand = Map end if Get("Ragebot", false) and Get("Rage Smooth Aim", false) then Steering:Commit(Value.CurrentCommand, Simulation) else Steering:Reset() end return Original(Value, ...) end local function Install(Name, Module, Member, Callback) local Target = Module and Module[Member] if type(Target) == "function" and Combat.Installed[Name] ~= Target then if Combat.Installed[Name] then Functions.Hooks.Remove("Combat." .. Name) end if Functions.Hooks.Add("Combat." .. Name, Target, Callback) then Combat.Installed[Name] = Target end end end local function Crosshair(Weapon, Simulation) local Camera = Functions.Game.Camera() if not Camera then return nil end local Origin, Direction = Camera.CFrame.Position, Camera.CFrame.LookVector if Get("Trigger Position", "Center") == "Mouse" then local Mouse = State.Services.UserInputService:GetMouseLocation() Direction = Camera:ViewportPointToRay(Mouse.X, Mouse.Y).Direction end if Get("Trigger Mode", "Mouse") == "Seed" then local X, Y = Shot.Offset((Combat.LastTick or 0) + 1, Weapon, Simulation) if X == nil then return nil end local Frame = CFrame.lookAt(Vector3.zero, Direction) Direction = (Direction + Frame.RightVector * X + Frame.UpVector * Y).Unit end local Best, Range = nil, Weapon.Data.Range or 2000 for _, Entity in Functions.Game.Entities("Character") or {} do if not Scan.Allowed(Entity) then continue end for _, Part in Functions.Target.Parts(Entity) or {} do if Get("Trigger Head Only", false) and Part.Name ~= "Head" then continue end local Frame, Half = Functions.Game.Hitbox(Entity, Part) if not Frame then continue end local Candidate = {Data = Entity, Part = Part, Frame = Frame, Half = Half} local Hit, Distance = Functions.Target.RayHitsHitbox(Candidate, Origin, Direction, Range) if Hit and Distance < Range and Functions.Target.Visible(Part, Origin, Origin + Direction * (Distance + 0.001)) then Best, Range = Candidate, Distance end end end return Best end function Combat.Update(Delta) Install("Input", Modules.WeaponInput, "GetCommandMap", Input) Install("Tick", Modules.GunWeapon, "TickCommand", Tick) Install("Fire", Modules.GunWeapon, "Fire", NativeFire) Install("Packet", Modules.Networking, "ProcessPacket", Network) local Camera, Simulation = Functions.Game.Camera(), Functions.Game.Simulation() local Weapon = Functions.Game.Weapon() if not Camera or not Simulation then Combat.Reset(not Camera and "No Camera" or "No Character"); Display.Update(Camera, nil); return end Context(Simulation, Weapon) if Paused(Simulation) then Combat.Pause(); Display.Update(Camera, nil); return end local Rage = Get("Ragebot", false) if not Rage then Combat.RageTarget, Combat.RageFiring = nil, false end local Target = Rage and Combat.RageTarget or (Get("Aimbot", false) or Get("Target Snapline", false)) and Scan.Legit(false) Combat.Target = Target Display.Update(Camera, Target) local RecoilYaw, RecoilPitch = 0, 0 if not Rage and Get("Legit Recoil Control", false) and not Get("No Recoil", false) and Shot.Gun(Weapon) and not Weapon.Reloading and not Weapon.Equipping and (Manual() or Weapon.Firing) then local Punch = Simulation.AimPunchAngle if typeof(Punch) == "Vector3" then local Scale = math.rad(tonumber(Functions.Game.Config("Weapon", "RecoilScale")) or 2) RecoilYaw = -Punch.Y * Scale * Get("Legit Recoil X", 100) / 100 RecoilPitch = Punch.X * Scale * Get("Legit Recoil Y", 100) / 100 local Previous = Combat.Recoil or {Yaw = 0, Pitch = 0} if Modules.Camera and Modules.Camera.GetAngles and Modules.Camera.SetAngles then local Yaw, Pitch = Modules.Camera.GetAngles() Modules.Camera.SetAngles(Yaw + RecoilYaw - Previous.Yaw, Pitch + RecoilPitch - Previous.Pitch) end Combat.Recoil = {Yaw = RecoilYaw, Pitch = RecoilPitch} end else Combat.Recoil = nil end if not Rage and Target and Get("Aimbot", false) and Modules.Camera and Modules.Camera.GetAngles and Modules.Camera.SetAngles then local Point = Camera:WorldToViewportPoint(Target.Position) local ScreenDistance = (Vector2.new(Point.X, Point.Y) - Camera.ViewportSize * 0.5).Magnitude if ScreenDistance >= Get("Aim Deadzone", 0) then local Direction = (Target.Position - Camera.CFrame.Position).Unit if Get("Seed Prediction", false) and Shot.Gun(Weapon) then for _ = 1, 3 do local X, Y = Shot.Offset((Combat.LastTick or 0) + 1, Weapon, Simulation) if X == nil then break end local Frame = CFrame.lookAt(Vector3.zero, Direction) local Predicted = (Direction + Frame.RightVector * X + Frame.UpVector * Y).Unit Direction = (Direction + (Target.Position - Camera.CFrame.Position).Unit - Predicted).Unit end end local Yaw, Pitch = math.atan2(-Direction.X, -Direction.Z), math.asin(-Direction.Y) local CurrentYaw, CurrentPitch = Modules.Camera.GetAngles() local Speed = Get("Aim Speed", 0) local Alpha = Speed <= 0 and 1 or 1 - math.exp(-Speed * math.max(Delta, 0)) if Get("Aim Mode", "Camera") == "Mouse" and type(mousemoverel) == "function" then local Mouse = State.Services.UserInputService:GetMouseLocation() mousemoverel((Point.X - Mouse.X) * Alpha, (Point.Y - Mouse.Y) * Alpha) else Yaw, Pitch = Yaw + RecoilYaw, Pitch + RecoilPitch Modules.Camera.SetAngles(CurrentYaw + math.atan2(math.sin(Yaw - CurrentYaw), math.cos(Yaw - CurrentYaw)) * Alpha, CurrentPitch + (Pitch - CurrentPitch) * Alpha) end end end if Rage and Shot.Gun(Weapon) then Fire(false); return end local Shoot, Alternate = false, false if Get("Triggerbot", false) and Shot.Gun(Weapon) then Shoot = Crosshair(Weapon, Simulation) ~= nil end if Get("Knifebot", false) and Weapon and Weapon.Data and Weapon.Data.Type == "Melee" then Shoot = Scan.Closest(Get("Knife Range", 7), "World", true) ~= nil Alternate = Shoot and Get("Knife Mode", "Stab") == "Stab" end Fire(Shoot, Alternate) end function Combat.Diagnostics() local Status = {} for Name in Combat.Installed do Status[Name] = true end return {State = Combat.Stats.State, Shots = Combat.ShotSequence, FireCalls = Combat.Stats.FireCalls, RequestedFire = Combat.Stats.RequestedFire, Target = Combat.Target and Combat.Target.Data.UserId, Part = Combat.Target and Combat.Target.Part.Name, Damage = Combat.Target and Combat.Target.Damage, Accuracy = Scan.Stats.Accuracy, Chance = Scan.Stats.Chance, Checks = Scan.Stats.Checks, Reject = Scan.Stats.Reject, Candidates = Scan.Stats.Candidates, Hooks = Status} end function Combat.Destroy() Combat.Reset("Unloaded") for Name in Combat.Installed do Functions.Hooks.Remove("Combat." .. Name) end table.clear(Combat.Installed) Display.Destroy() end State.Controllers.Combat = Combat end Functions.Utility.Register("Combat", State.Controllers.Combat, "Dot") do local Get, Modules = Functions.Config.Get, State.Modules local Combat = State.Controllers.Combat local Hop = Functions.Character.Hop local Duck = Functions.Character.Duck local Defuse = Functions.Character.Defuse local Peek = Functions.Combat.Peek local Movement = {History = {}, Installed = {}, PlantHeld = false, JumpBoost = false} local function Restricted(Simulation) return Simulation.Climbing or Simulation.Noclip or Simulation.Frozen or Simulation.Preparation or Simulation.Planting or Simulation.Defusing end local function Moving(Command) local Inputs = Command.Inputs return Inputs and ((Inputs.Forward and 1 or 0) ~= (Inputs.Backward and 1 or 0) or (Inputs.Right and 1 or 0) ~= (Inputs.Left and 1 or 0)) end local function Strafe(Simulation, Command, Delta) local Velocity, Inputs, Constants = Simulation.Velocity, Command.Inputs, Simulation.Constants if not Velocity or not Inputs or not Constants or type(Delta) ~= "number" or Delta <= 0 then return end local Forward = (Inputs.Forward and 1 or 0) - (Inputs.Backward and 1 or 0) local Side = (Inputs.Right and 1 or 0) - (Inputs.Left and 1 or 0) if Forward == 0 and Side == 0 then return end local Speed = math.sqrt(Velocity.X * Velocity.X + Velocity.Z * Velocity.Z) local Factor = tonumber(Functions.Game.Config("Character", "BunnyHopMaxSpeedFactor")) or 1.1 if Factor <= 0 or Speed < 0.01 then return end local Maximum = 18.044 * Factor local Yaw = Functions.Angles.Decode(Command.Yaw, Command.Pitch) local InputAngle = math.atan2(-Side, Forward) local Heading = math.atan2(-Velocity.X, -Velocity.Z) local Error = math.atan2(math.sin(Yaw + InputAngle - Heading), math.cos(Yaw + InputAngle - Heading)) local WishSpeed = math.min(Constants.Speed, Constants.MaxSpeed) * math.clamp(1 - (Simulation.Stamina or 0) * 0.01, 0, 1) ^ 2 local Cap = math.min(Constants.MaxAirStrafeSpeed, WishSpeed) local Acceleration = Constants.AirAcceleration * WishSpeed * Delta * (Simulation.AirFrictionReduced and 0.65 or 1) if Cap <= 0 or Acceleration <= 0 then return end local Projection = math.max(0, Cap - Acceleration) local Gain = math.min(Acceleration, Cap - Projection) if Speed * Speed + 2 * Projection * Gain + Gain * Gain > Maximum * Maximum then Gain = math.min(Acceleration, 2 * Cap) Projection = (Maximum * Maximum - Speed * Speed - Gain * Gain) / (2 * Gain) end local Angle = math.max(math.abs(Error), math.acos(math.clamp(Projection / Speed, -1, 1))) local Sign = Error >= 0 and 1 or -1 if math.abs(Error) < 0.0001 then if Speed >= Maximum - 0.01 then return end Sign = (Command.ClientTick or 0) % 2 == 0 and 1 or -1 end local Allowed = math.abs(Error) if Speed < Maximum - 0.01 then Allowed = math.max(Allowed, math.rad(3.5)) end local function Turn(Value) local Along = math.cos(Value) local Amount = math.clamp(Cap - Speed * Along, 0, Acceleration) return math.atan2(Amount * math.sin(Value), Speed + Amount * Along) end if Turn(Angle) > Allowed then local Low, High = math.acos(math.clamp(Cap / Speed, -1, 1)), Angle for _ = 1, 12 do local Middle = (Low + High) * 0.5 if Turn(Middle) > Allowed then High = Middle else Low = Middle end end Angle = Low end local _, Pitch = Functions.Angles.Decode(Command.Yaw, Command.Pitch) Command.Yaw = Functions.Angles.Encode(Heading + Sign * Angle - InputAngle, Pitch) end local function Plant(Value) if Movement.PlantHeld and not Value then pcall(Modules.Weapon.UpdateKeyState, "WishFire", false) end Movement.PlantHeld = Value if Value then pcall(Modules.Weapon.UpdateKeyState, "WishFire", true) end end local function PlantZone(Position) local Map = State.Services.Workspace:FindFirstChild("Map") local Zones = Map and Map:FindFirstChild("Zones") local Plants = Zones and Zones:FindFirstChild("Plants") if not Plants then return false end for _, Part in Plants:GetChildren() do if not Part:IsA("BasePart") then continue end local Local, Half = Part.CFrame:PointToObjectSpace(Position), Part.Size * 0.5 if math.abs(Local.X) <= Half.X and math.abs(Local.Y) <= Half.Y and math.abs(Local.Z) <= Half.Z then return true end end return false end local function CommandHook(Original, Simulation, Native, Delta, Resim, ...) if Simulation ~= Functions.Game.Simulation() or type(Native) ~= "table" then return Original(Simulation, Native, Delta, Resim, ...) end local Command, Active = Native, nil if not Resim then if Command.Inputs then Command.Inputs = table.clone(Command.Inputs) end if Command.AdditionalInputs then Command.AdditionalInputs = table.clone(Command.AdditionalInputs) end Combat.BeginCommand(Simulation, Command) local Defusing = Defuse:Apply(Simulation, Command) local Returning = false if Defusing then Combat.Pause() else Returning = Peek:Apply(Simulation, Command, Delta) end local RageTarget = Get("Ragebot", false) and Combat.RageTarget if RageTarget and (not Functions.Target.Valid(RageTarget.Data) or not Functions.Target.Enemy(RageTarget.Data)) then RageTarget = nil end local Approaching if not RageTarget and not Defusing and not Returning and not Restricted(Simulation) then Approaching = Combat.Anticipate(Simulation, Command) end local Additional = Command.AdditionalInputs local Ducking = Duck:Apply(Simulation, Command, Defusing or Returning) if not Ducking and not Defusing and Additional and Get("Ragebot", false) and Get("Rage Auto Crouch", false) and (RageTarget or Approaching) and Simulation.OnGround and not Restricted(Simulation) and not Returning and not (Get("Auto Hop", false) and Moving(Command)) and not State.Services.UserInputService:IsKeyDown(Enum.KeyCode.Space) then Additional.Duck, Additional.Jump = true, false end Movement.JumpBoost = not Defusing and not Returning and Hop:Apply(Simulation, Command) Active = {Simulation = Simulation, Defusing = Defusing, Hop = Movement.JumpBoost, NoSlow = not Defusing and Get("No Slow", false)} Active.AutoHop = Active.Hop and Get("Auto Hop", false) if Active.AutoHop then Active.NoSlow = false; Strafe(Simulation, Command, Delta) end local Stop = Get("Force Stop", false) or Get("Ragebot", false) and Get("Rage Auto Stop", false) and not Movement.JumpBoost if not Returning and not Defusing and not Restricted(Simulation) and Stop and (Combat.FireHeld or Combat.RageFiring or RageTarget and Get("Rage Auto Stop", false)) and Command.Inputs then for Name in Command.Inputs do Command.Inputs[Name] = false end Active.Hop, Active.AutoHop, Movement.JumpBoost = false, false, false end Combat.Movement(Command) local Weapon = Functions.Game.Weapon() Plant(not Defusing and Get("Auto Plant", false) and Simulation.Team == "T" and Simulation.OnGround and Weapon ~= nil and (Weapon.Name == "C4" or Weapon.Name == "Bomb") and PlantZone(Simulation.Position)) local Tick = Command.ClientTick if type(Tick) == "number" then Movement.History[Tick % 128] = {Tick = Tick, State = Active} end elseif type(Command.ClientTick) == "number" then local Saved = Movement.History[Command.ClientTick % 128] if Saved and Saved.Tick == Command.ClientTick and Saved.State.Simulation == Simulation then Active = Saved.State end end local Previous = Movement.Active Movement.Active = Active local Results = table.pack(pcall(Original, Simulation, Command, Delta, Resim, ...)) Movement.Active = Previous if not Results[1] then State.Errors["Movement.Command"] = tostring(Results[2]); return nil end if not Resim then Combat.EndCommand(Simulation, Command) end return table.unpack(Results, 2, Results.n) end local function Active(Simulation) local Current = Movement.Active return Current and Current.Simulation == Simulation and Simulation == Functions.Game.Simulation() and not Restricted(Simulation) and Current or nil end local function Speed(Simulation) local Config = Modules.SimulationConfig local Constants = Simulation.Constants local Maximum = Config and Config.ConstantsTemplate and Config.ConstantsTemplate.MaxSpeed or Constants.MaxSpeed if Simulation.Walk and not Simulation.DuckHeld then Maximum *= Constants.WalkModifier end if Modules.Movement and type(Modules.Movement.GetDuckSpeedModifier) == "function" then Maximum *= Modules.Movement.GetDuckSpeedModifier(Simulation) end return Maximum end local function AirMove(Original, Simulation, Direction, WishSpeed, Delta, ...) local Current = Active(Simulation) if Current and Current.NoSlow and Direction and Direction.Magnitude > 0 then WishSpeed = Speed(Simulation) end return Original(Simulation, Direction, WishSpeed, Delta, ...) end local function WalkMove(Original, Simulation, Direction, WishSpeed, Delta, ...) local Current = Active(Simulation) if not Current or not Current.NoSlow then return Original(Simulation, Direction, WishSpeed, Delta, ...) end local Weapon, Cropped = Simulation.CurrentWeapon, Simulation.CroppedMaxSpeed local Maximum = Speed(Simulation) Simulation.CroppedMaxSpeed = Maximum if Weapon and Weapon.Data then local Proxy = table.clone(Weapon) Proxy.Data = table.clone(Weapon.Data) local Config = Modules.SimulationConfig Proxy.Data.Speed = {[Weapon.Mode or 1] = Config and Config.ConstantsTemplate and Config.ConstantsTemplate.MaxSpeed or Simulation.Constants.MaxSpeed} Proxy.ZoomLevel, Simulation.CurrentWeapon = 0, Proxy end local Results = table.pack(pcall(Original, Simulation, Direction, Direction and Direction.Magnitude > 0 and Maximum or WishSpeed, Delta, ...)) Simulation.CurrentWeapon, Simulation.CroppedMaxSpeed = Weapon, Cropped if not Results[1] then State.Errors["Movement.WalkMove"] = tostring(Results[2]); return nil end return table.unpack(Results, 2, Results.n) end local function Jump(Original, Simulation, Delta, ...) local Current = Active(Simulation) if not Current or not Current.NoSlow then return Original(Simulation, Delta, ...) end local Stamina = Simulation.Stamina or 0 Simulation.Stamina = 0 local Results = table.pack(pcall(Original, Simulation, Delta, ...)) Simulation.Stamina = math.clamp(Stamina + (Simulation.Stamina or 0), 0, Simulation.Constants.StaminaMax) if not Results[1] then State.Errors["Movement.Jump"] = tostring(Results[2]); return nil end return table.unpack(Results, 2, Results.n) end local function Install(Name, Target, Callback) if type(Target) == "function" and Movement.Installed[Name] ~= Target then if Movement.Installed[Name] then Functions.Hooks.Remove("Movement." .. Name) end if Functions.Hooks.Add("Movement." .. Name, Target, Callback) then Movement.Installed[Name] = Target end end end function Movement.Update() local Simulation = Functions.Game.Simulation() Install("Command", Simulation and Simulation.ProcessCommand, CommandHook) local Native = Modules.Movement Install("AirMove", Native and Native.AirMove, AirMove) Install("WalkMove", Native and Native.WalkMove, WalkMove) Install("Jump", Native and Native.CheckJumpButton, Jump) if Movement.Simulation ~= Simulation then Movement.History, Movement.Active, Movement.Simulation = {}, nil, Simulation Hop:Reset() Duck:Reset() Peek:Reset() Plant(false) end end local Player = State.Services.Players and State.Services.Players.LocalPlayer if Player and Player.Idled then Functions.Utility.Connect(Player.Idled, function() if not Get("Anti AFK", false) then return end pcall(function() local Virtual = State.Services.VirtualUser or game:GetService("VirtualUser") Virtual:CaptureController() Virtual:Button2Down(Vector2.new()) task.delay(0.1, function() Virtual:Button2Up(Vector2.new()) end) end) end) end function Movement.Destroy() Plant(false) Hop:Reset() Duck:Reset() Peek:Reset() Defuse:Destroy() Movement.History, Movement.Active = {}, nil for Name in Movement.Installed do Functions.Hooks.Remove("Movement." .. Name) end table.clear(Movement.Installed) end State.Controllers.Movement = Movement end Functions.Utility.Register("Movement", State.Controllers.Movement, "Dot") do Functions.Cosmetics.Catalog = { {Skins = {{Rarity = "Stock", Image = 98261855993979, Name = "Stock"}, {Rarity = "Classified", Image = 114370090625339, Name = "Carbon"}, {Rarity = "Contraband", Image = 130936395418519, Name = "MyBeloved", DisplayName = "Matcha Flower"}}, Icon = 103328569146383, Name = "AK-47", Category = "Rifles"}, {Skins = {{Rarity = "Stock", Image = 131939742713872, Name = "Stock"}}, Icon = 78883991167232, Name = "AUG A3", Category = "Rifles"}, {Skins = {{Rarity = "Stock", Image = 98026569431994, Name = "Stock"}, {Rarity = "Classified", Image = 79900006254140, Name = "Storm Front"}, {Rarity = "Contraband", Image = 98918424191515, Name = "Rika"}, {Rarity = "Contraband", Image = 129164880840317, Name = "Alpha"}}, Icon = 128322472496551, Name = "AWP", Category = "Rifles"}, {Skins = {{Rarity = "Exceeding Rare", Image = 99343477680043, Name = "Vanilla"}, {Rarity = "Exceeding Rare", Image = 122486883844698, Name = "Crimson"}, {Rarity = "Exceeding Rare", Image = 78548165060818, Name = "Marble Fade"}, {Rarity = "Exceeding Rare", Image = 104501919519185, Name = "Nebula"}, {Rarity = "Contraband", Image = 130508021310109, Name = "Gold"}, {Rarity = "Contraband", Image = 83326741414668, Name = "Gold Fairy"}, {Rarity = "Contraband", Image = 83326741414668, Name = "Gold Fairy 2"}}, Icon = 111124636691005, Name = "Balisong", Category = "Knives"}, {Skins = {{Rarity = "Stock", Image = 123816287818365, Name = "Stock"}}, Icon = 133714450545312, Name = "Bat", Category = "Knives"}, {Skins = {{Rarity = "Stock", Image = 137260508506546, Name = "Stock"}}, Icon = 136729952609515, Name = "CT Knife", Category = "Knives"}, {Skins = {{Rarity = "Stock", Image = 96170647875370, Name = "Stock"}}, Icon = 119568499682206, Name = "CZ75-Auto", Category = "Pistols"}, {Skins = {{Rarity = "Exceeding Rare", Image = 115907595347160, Name = "Vanilla"}, {Rarity = "Exceeding Rare", Image = 109003151037654, Name = "Crimson"}, {Rarity = "Exceeding Rare", Image = 95481123262597, Name = "Marble Fade"}, {Rarity = "Exceeding Rare", Image = 109733918510883, Name = "Nebula"}}, Icon = 79270649122459, Name = "Cleaver", Category = "Knives"}, {Skins = {{Rarity = "Stock", Image = 139309493457448, Name = "Stock"}, {Rarity = "Classified", Image = 124613012877414, Name = "Hardening"}, {Rarity = "Mil-Spec", Image = 129846727093947, Name = "Vacation"}}, Icon = 130484320728025, Name = "Desert Eagle", Category = "Pistols"}, {Skins = {{Rarity = "Stock", Image = 129765777073864, Name = "Stock"}, {Rarity = "Mil-Spec", Image = 118578700431407, Name = "Baron"}}, Icon = 130510965833386, Name = "Dual Berettas", Category = "Pistols"}, {Skins = {{Rarity = "Stock", Image = 131321927127005, Name = "Stock"}}, Icon = 124612650211720, Name = "Famas F1", Category = "Rifles"}, {Skins = {{Rarity = "Stock", Image = 72953407267919, Name = "Stock"}}, Icon = 103047103081406, Name = "Five-seveN", Category = "Pistols"}, {Skins = {{Rarity = "Stock", Image = 140361404805327, Name = "Stock"}}, Icon = 103622033073452, Name = "G3SG1", Category = "Rifles"}, {Skins = {{Rarity = "Stock", Image = 108802477816180, Name = "Stock"}, {Rarity = "Mil-Spec", Image = 131608757545740, Name = "Ryujin"}}, Icon = 84027416531227, Name = "Galil ACE", Category = "Rifles"}, {Skins = {{Rarity = "Stock", Image = 134734709619937, Name = "Stock"}, {Rarity = "Covert", Image = 99556070695593, Name = "Chumba"}}, Icon = 132981893698378, Name = "Glock-18", Category = "Pistols"}, {Skins = {{Rarity = "Stock", Image = 125925871929971, Name = "Stock"}}, Icon = 131655986965000, Name = "Jagdkommando", Category = "Knives"}, {Skins = {{Rarity = "Exceeding Rare", Image = 135753609307530, Name = "Vanilla"}, {Rarity = "Exceeding Rare", Image = 135012966616165, Name = "Crimson"}, {Rarity = "Exceeding Rare", Image = 135844701548702, Name = "Marble Fade"}, {Rarity = "Exceeding Rare", Image = 118235783293734, Name = "Nebula"}, {Rarity = "Exceeding Rare", Image = 92143664002451, Name = "Glass Fairy"}}, Icon = 120751722413293, Name = "Karambit", Category = "Knives"}, {Skins = {{Rarity = "Stock", Image = 134232332444449, Name = "Stock"}}, Icon = 90685362564430, Name = "Kukri", Category = "Knives"}, {Skins = {{Rarity = "Stock", Image = 124670489157037, Name = "Stock"}, {Rarity = "Covert", Image = 137982684092346, Name = "Adurite"}}, Icon = 101776623713550, Name = "M4A1-S", Category = "Rifles"}, {Skins = {{Rarity = "Stock", Image = 136651922029193, Name = "Stock"}, {Rarity = "Contraband", Image = 116213615933472, Name = "Lycoris Bloom"}}, Icon = 100848375948816, Name = "M4A4", Category = "Rifles"}, {Skins = {{Rarity = "Stock", Image = 96880001223505, Name = "Stock"}, {Rarity = "Restricted", Image = 101353877945689, Name = "Malachite"}}, Icon = 72879107579572, Name = "MAC-10", Category = "SMG"}, {Skins = {{Rarity = "Stock", Image = 76216941660818, Name = "Stock"}}, Icon = 92644632368344, Name = "MAG-7", Category = "Heavy"}, {Skins = {{Rarity = "Stock", Image = 97391327597327, Name = "Stock"}}, Icon = 126901112931486, Name = "MP5-SD", Category = "SMG"}, {Skins = {{Rarity = "Stock", Image = 116429612777872, Name = "Stock"}}, Icon = 132243524456830, Name = "MP7", Category = "SMG"}, {Skins = {{Rarity = "Stock", Image = 85642980470702, Name = "Stock"}}, Icon = 104781707426369, Name = "MP9", Category = "SMG"}, {Skins = {{Rarity = "Stock", Image = 136630669797309, Name = "Stock"}}, Icon = 102021838083248, Name = "P2000", Category = "Pistols"}, {Skins = {{Rarity = "Stock", Image = 100157473324662, Name = "Stock"}}, Icon = 102021838083248, Name = "P250", Category = "Pistols"}, {Skins = {{Rarity = "Stock", Image = 77484254144545, Name = "Stock"}}, Icon = 112640762739116, Name = "P90", Category = "SMG"}, {Skins = {{Rarity = "Stock", Image = 71999163856885, Name = "Stock"}}, Icon = 83510034983849, Name = "PPSH-41", Category = "SMG"}, {Skins = {{Rarity = "Stock", Image = 111302925273155, Name = "Stock"}}, Icon = 79170135549001, Name = "Remington 870", Category = "Heavy"}, {Skins = {{Rarity = "Stock", Image = 94383047914694, Name = "Stock"}, {Rarity = "Mil-Spec", Image = 101438591682797, Name = "Deep"}}, Icon = 91661422219754, Name = "SCAR-20", Category = "Rifles"}, {Skins = {{Rarity = "Stock", Image = 108314647738536, Name = "Stock"}}, Icon = 100688760178782, Name = "SG 553", Category = "Rifles"}, {Skins = {{Rarity = "Stock", Image = 91827844664697, Name = "Stock"}}, Icon = 96142540919110, Name = "SSG-08", Category = "Rifles"}, {Skins = {{Rarity = "Stock", Image = 124492853640542, Name = "Stock"}, {Rarity = "Restricted", Image = 101258536366406, Name = "Kinetic"}}, Icon = 104613794906232, Name = "Sawed-Off", Category = "Heavy"}, {Skins = {{Rarity = "Exceeding Rare", Image = 80535389773865, Name = "Vanilla"}, {Rarity = "Exceeding Rare", Image = 107230397991567, Name = "Crimson"}, {Rarity = "Exceeding Rare", Image = 119624783918075, Name = "Marble Fade"}, {Rarity = "Exceeding Rare", Image = 86916533102115, Name = "Nebula"}, {Rarity = "Exceeding Rare", Image = 135030271554676, Name = "Glass Fairy"}}, Icon = 116152000898575, Name = "Shadow Daggers", Category = "Knives"}, {Skins = {{Rarity = "Stock", Image = 91832533233367, Name = "Stock"}}, Icon = 91375814135483, Name = "T Knife", Category = "Knives"}, {Skins = {{Rarity = "Stock", Image = 117147948679102, Name = "Stock"}, {Rarity = "Restricted", Image = 125800506984004, Name = "Element29"}}, Icon = 82558165508334, Name = "TEC-9", Category = "Pistols"}, {Skins = {{Rarity = "Stock", Image = 100067262134651, Name = "Stock"}}, Icon = 97747164267995, Name = "UMP-45", Category = "SMG"}, {Skins = {{Rarity = "Stock", Image = 90720149194240, Name = "Stock"}, {Rarity = "Contraband", Image = 99315913324154, Name = "Sakuliro"}}, Icon = 86980467045933, Name = "USP-S", Category = "Pistols"}, {Skins = {{Rarity = "Stock", Image = 76265550024108, Name = "Stock"}, {Rarity = "Mil-Spec", Image = 135321180358044, Name = "Purple Vector"}}, Icon = 78511979539734, Name = "XM1014", Category = "Heavy"}, } end do local Data = { ["Primordial"] = "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TVUVAABQ4AAAEGCDpsTiAIWGrAQAQgIAHIpiWZrmeZ4niqapmiRJ0zxPFEXRNE1TVUmSpnmeKIqiaZqmqrIsTfM8URRF01RVVYWmeZ4oiqJpqqrqwvM8TxRF0TRV1XXheZ4niqJomqrquhBFUTRN01RNVXVdIIqmaZqqqqquC0RPFE1TVV3XdYHniaJpqqqrui4QTdNUVVV1XVkGmKZpqqrryjJAVVXVdV1XlgGqqqqu67qyDFBV13VdWZZlAK7rurIsywIAAA4cAAACjKCTjCqLsNGECw9AoSErAoAoAADAGKYUU8owJiGkEBrGJIQUQiYlpdJSqiCkUlIpFYRUSiolo5RSailVEFIpqZQKQiollVIAANiBAwDYgYVQaMhKACAPAIAwRinGGHNOIqQUY845JxFSijHnnJNKMeacc85JKRlzzDnnpJTOOeecc1JK5pxzzjkppXPOOeeclFJK55xzTkopJYTOQSellNI555wTAABU4AAAEGCjyOYEI0GFhqwEAFIBAAyOY1ma5nmiaJqWJGma53meKJqmJkma5nmeJ4qqyfM8TxRF0TRVled5niiKommqKtcVRdM0TVVVXbIsiqZpmqrqujBN01RV13VdmKZpqqrrui5sW1VV1XVlGbatqqrqurIMXNd1ZdmWgSy7ruzasgAA8AQHAKACG1ZHOCkaCyw0ZCUAkAEAQBiDkEIIIWUQQgohhJRSCAkAABhwAAAIMKEMFBqyEgBIBQAAjLHWWmuttdZAZ6211lprrYDMWmuttdZaa6211lprrbXWUmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaay2llFJKKaWUUkoppZRSSimllFJKBQD6VTgA+D/YsDrCSdFYYKEhKwGAcAAAwBilGHMMQimlVAgx5px0VFqLsUKIMeckpNRabMVzzkEoIZXWYiyecw5CKSnFVmNRKYRSUkottliLSqGjklJKrdVYjDGppNZai63GYoxJKbTUWosxFiNsTam12GqrsRhjayottBhjjMUIX2RsLabaag3GCCNbLC3VWmswxhjdW4ultpqLMT742lIsMdZcAAB3gwMARIKNM6wknRWOBhcashIACAkAIBBSijHGGHPOOeekUow55pxzDkIIoVSKMcaccw5CCCGUjDHmnHMQQgghhFJK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", ["Neverlose"] = "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AgBRAAAGxbEsTRNFkqRpmieKJEnTPE8UaZrneZ5pwvM8zzQhiqJomhBFUTRNmKZpqiowTVUVAABQ4AAAEGCDpsTiAIWGrAQAQgIAHIpiWZrmeZ4niqapmiRJ0zxPFEXRNE1TVUmSpnmeKIqiaZqmqrIsTfM8URRF01RVVYWmeZ4oiqJpqqrqwvM8TxRF0TRV1XXheZ4niqJomqrquhBFUTRN01RNVXVdIIqmaZqqqqquC0RPFE1TVV3XdYHniaJpqqqrui4QTdNUVVV1XVkGmKZpqqrryjJAVVXVdV1XlgGqqqqu67qyDFBV13VdWZZlAK7rurIsywIAAA4cAAACjKCTjCqLsNGECw9AoSErAoAoAADAGKYUU8owJiGkEBrGJIQUQiYlpdJSqiCkUlIpFYRUSiolo5RSailVEFIpqZQKQiollVIAANiBAwDYgYVQaMhKACAPAIAwRinGGHNOIqQUY845JxFSijHnnJNKMeacc85JKRlzzDnnpJTOOeecc1JK5pxzzjkppXPOOeeclFJK55xzTkopJYTOQSellNI555wTAABU4AAAEGCjyOYEI0GFhqwEAFIBAAyOY1ma5nmiaJqWJGma53meKJqmJkma5nmeJ4qqyfM8TxRF0TRVled5niiKommqKtcVRdM0TVVVXbIsiqZpmqrqujBN01RV13VdmKZpqqrrui5sW1VV1XVlGbatqqrqurIMXNd1ZdmWgSy7ruzasgAA8AQHAKACG1ZHOCkaCyw0ZCUAkAEAQBiDkEIIIWUQQgohhJRSCAkAABhwAAAIMKEMFBqyEgBIBQAAjLHWWmuttdZAZ6211lprrYDMWmuttdZaa6211lprrbXWUmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaay2llFJKKaWUUkoppZRSSimllFJKBQD6VTgA+D/YsDrCSdFYYKEhKwGAcAAAwBilGHMMQimlVAgx5px0VFqLsUKIMeckpNRabMVzzkEoIZXWYiyecw5CKSnFVmNRKYRSUkottliLSqGjklJKrdVYjDGppNZai63GYoxJKbTUWosxFiNsTam12GqrsRhjayottBhjjMUIX2RsLabaag3GCCNbLC3VWmswxhjdW4ultpqLMT742lIsMdZcAAB3gwMARIKNM6wknRWOBhca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", ["Sparkle"] = "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TVUVAABQ4AAAEGCDpsTiAIWGrAQAQgIAHIpiWZrmeZ4niqapmiRJ0zxPFEXRNE1TVUmSpnmeKIqiaZqmqrIsTfM8URRF01RVVYWmeZ4oiqJpqqrqwvM8TxRF0TRV1XXheZ4niqJomqrquhBFUTRN01RNVXVdIIqmaZqqqqquC0RPFE1TVV3XdYHniaJpqqqrui4QTdNUVVV1XVkGmKZpqqrryjJAVVXVdV1XlgGqqqqu67qyDFBV13VdWZZlAK7rurIsywIAAA4cAAACjKCTjCqLsNGECw9AoSErAoAoAADAGKYUU8owJiGkEBrGJIQUQiYlpdJSqiCkUlIpFYRUSiolo5RSailVEFIpqZQKQiollVIAANiBAwDYgYVQaMhKACAPAIAwRinGGHNOIqQUY845JxFSijHnnJNKMeacc85JKRlzzDnnpJTOOeecc1JK5pxzzjkppXPOOeeclFJK55xzTkopJYTOQSellNI555wTAABU4AAAEGCjyOYEI0GFhqwEAFIBAAyOY1ma5nmiaJqWJGma53meKJqmJkma5nmeJ4qqyfM8TxRF0TRVled5niiKommqKtcVRdM0TVVVXbIsiqZpmqrqujBN01RV13VdmKZpqqrrui5sW1VV1XVlGbatqqrqurIMXNd1ZdmWgSy7ruzasgAA8AQHAKACG1ZHOCkaCyw0ZCUAkAEAQBiDkEIIIWUQQgohhJRSCAkAABhwAAAIMKEMFBqyEgBIBQAAjLHWWmuttdZAZ6211lprrYDMWmuttdZaa6211lprrbXWUmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaay2llFJKKaWUUkoppZRSSimllFJKBQD6VTgA+D/YsDrCSdFYYKEhKwGAcAAAwBilGHMMQimlVAgx5px0VFqLsUKIMeckpNRabMVzzkEoIZXWYiyecw5CKSnFVmNRKYRSUkottliLSqGjklJKrdVYjDGppNZai63GYoxJKbTUWosxFiNsTam12GqrsRhjayottBhjjMUIX2RsLabaag3GCCNbLC3VWmswxhjdW4ultpqLMT742lIsMdZcAAB3gwMARIKNM6wknRWOBhcashIACAkAIBBSijHGGHPOOeekUow55pxzDkIIoVSKMcaccw5CCCGUjDHmnHMQQgghhFJKxpxzEEIIIYSQUuqccxBCCCGEEEopnXMOQgghhBBCKaWDEEIIIYQQSiilpBRCCCGEEEIIqaSUQgghhFJCKCGVlFIIIYQQQiklpJRSCiGEUkIIoYSUUkophRBCCKWUklJKKaUSSgklhBJSKSmlFEoIIZRSSkoppVRKCaGEEkopJaWUUkohhBBKKQUAABw4AAAEGEEnGVUWYaMJFx6AQkNWAgBkAACQopRSKS1FgiKlGKQYS0YVc1BaiqhyDFLNqVLOIOYklogxhJSTVDLmFEIMQuocdUwpBi2VGELGGKTYckuhcw4AAABBAICAkAAAAwQFMwDA4ADhcxB0AgRHGwCAIERmiETDQnB4UAkQEVMBQGKCQi4AVFhcpF1cQJcBLujirgMhBCEIQSwOoIAEHJxwwxNveMINTtApKnUgAAAAAAANAPAAAJBcABER0cxhZGhscHR4fICEiIyQCAAAAAAAGQB8AAAkJUBERDRzGBkaGxwdHh8gISIjJAEAgAACAAAAACCAAAQEBAAAAAAAAgAAAAQET2dnUwAAwCQAAAAAAABVOQAAAgAAAFeXdQYwFC1ERkE4OTxETP8z/05RTVJEQkNNTP9LQkFDQkBCQE9NSkFDPURCRD1RT0//Tv9bfMhFqGU/5CLUsgAABAIAAAAAsBV0yGnPkb0OOe7tvUm5BAgAzuXt03IZVVVtaBqYMjK0K1e2kiQQ9zLAN7Q+BQWMQCKBMxc+6gik9MHYxW2X1A0JAcht+bceXttRr94XXzS0IcuCmTMyalFXQ5Jxw0ckhiudADSdTqdpNOjeblulyof3GoRA/oVNXEOg0MEm1m169OKgBQGwf7lIb9iy2917u4+3sxfDHAIwTKjAYZiKJDYaNeyXFpAeOqxcuYoAAL2w7HSolQYl6QCMPlUM4hBKn5QLmtnpM9NfSAA02RY02WBKC1eULLpnduEYy+hk5bLSNgUvq+ttJQEAKAzC+GFxAoCqtLjSANJeAZQ+SDkcxJ4+KQQ2EbftQ3ZkLgBmS507EtJ2sZq575sq5lCLskwRBnGC4cMBkKbSdnsAHpXuALIDpEAYM6wdLiVQ1oFNxO0PUgZNBkCeN3Yiaz1cxrLKEOJu4CgZWa4oTacFx1sBqnsYYQeQqwQ6AJQLlEBVzeJyPIEw1bCUYbK1gmYQygA83Hh2VNWtvtr5/tt3pnMdhlxTpreaVAnaqnQtqKzoDdntagqWAE4V3EYuic3yORtRic3y9941ERJRJkGEAEi7SIm1floxPr1dFl1JiKQoWc3SrKu3Ks3s+1EAVLdnmuF4MCzREJDSBsdFIgbcVGVFJakJ4KYqKypJyyDu+WqkzEVgBQlQ0EqCaQHQUAEA9vSOZKbUk80cRwHDAZsRJdUFVFBjAObYi9O7YuZEUAY6w/ZEqUVfnZcK+uj1DfFfpp/xOg7JeI5aW5HdWJEAcJO9pOu6Geya9iVL9Z9uem+KeW9WH+tW7doXPF4W2HEyR8kgI1vldAYAGK90AACkOkHoA4JWyQAFMAMJAbTMS2dsvd2Hd9x75vKDr2sFH25nwMU6tlSCAMhVTwComGIOai2xJ4iC6J05XkvYlAEQBUANMQ1VpS6GjU1hcU9jVKvnZH3a8fhb/3o8bn07rJ/fUrJUzo6+OpfMGuUFDwk0rJye+fpesQBgIDsziNSH4VDHap5jgzGa96x2mn7/fTCnczAA4CrWOggTY7xvy/5Y89pUtgp6bUz/vp5kMEmjOsVEGN1ytKJSkOrLyv7n7/7xG24hERIJZAwgrBqT/GCoi/X5Xy0MIRKtOiBjWFhC+wEWaf4mn3HArgCgh9IDNtnVs5B4PSOKF0CFwTeyKwuTeJGI8dL9HlQXyPq+RHuX7za/nsy6JXoe3jm8P27d7Gd29jh9lMwgWXdeTSwAlCsdAADCVSckoVWHLwAVNtgeBETq6k5og93+/V71/7tr/3jkbW3DM65727BBVIA9uXYAIEsjf09zcwKgKiAoBqaoxUEcbA29VltFmumNmVl587tTPe89vLO93v4wU2r18Wjvc//l8cfstxN/oDBQjkv9+h0O4zKywDFGqtbprealvRYACWRpunKG9md39SIoaIqEnj4XwCRABzxJFOmZAwDnc845h6NY5yUBfE+mTSUP1bAAoAAAAJCVdkrd3r2yo659eZ1EgkSyAagdW3v7e2aUdkpFvjYJhecA/GAENw4xDRAVJOzajY9/CIWh8FZIj1YQKqsF3BRU07QNox09nLxEDPsISn+onTajjSsD5FIY2sjnnQryBxj0CxBeDfI3EtkSAvA8YArN0actCZDb4PXhy/Z2uJ1clO+v3+vhUgZ5nnpy2X84bFviCGnT/ippU3hx2F7LFo8uTxDEDygE7FZFthM/BVvmW3b4vJ3tHxFsyP6BomtRC8D3DeeP5eHuQSaYurW3kpGPruX5MBaYeDwMDH6V6FYnCJ0WFyM6+0taTdE2TaW6FK0UZwD0XmizpKXA/WJoRvnL7z8AwQa3b30wTrBAngFqAaAJikKT46JC2KJT6ys+guezGvQvqfHp15d66767eabz15MCG1AkOA4r/xUigSsd2gqKCysA7FZatiRtgum54F1SsIEc97xeV2Iv4sgV1ACnBZIAGLOvfZmsChqWYwoSqQCi1lFNAlOb5fNWv93IVGV6np8CTQGpWgLsUq6NRRPyHcs9S1InlI7Z451Ff07ETAVw+kAgAC53z+/rEthNnImgqMxbkEE1v3e5wMaZ9L7QYd+8EEi2qxpWAADUUshyZ/h5xwrLLf8+AOEOcAIcAD45BlCExR3r/OC/g/v3fiaHZ9S5nDqZbwKI1vLoSic3+CH2IziMzvkEQHvVFNUF5FRIbdnhjx5LbS5JTSjc3xy+u7Zz9DvAGZMB8C9lTCwFTAzpfxi+pz/yeBBQUukrKqbsaRUY/H8xnP87krbttrJcTV1dbzWrTTTNvAb8YL5ZkokJ/A+GIcsl//8AxCRrIaIjzkIZgHAXwWQg3QpgNUQvNLByOq03hrcZc116a7rMIU4U8EeBS6VtOiGzPqWaNqqpHm26jacEUhkuW6T/NeCHuCprwGaeQuQ3VVL/LdCJl9DTBCoPp3Dl084ffz/KKL+7dj3xwtOxibVPlt14BUgZGdUy4rwbwFjZGPff2wsAhQ0mcLSKWMAQmk4ogikoQOmuklYaP7n5xhC3PGf+tOTbtb6047R//BYrVqxEY2xwrKxce0yo3bTpuBRReUXfnX+Y8tSoICqAICoNzppgk5qKojFjQBpdsThaGjg727lsxWEQGae6O6z/enk0ul59l5/ZdOWGMh/XQPzmxV/dwECOenY/Nd/ifpty1ozAPPvHw/5yW3zzse9/AhAAQOnq8fbz9jrVcKNSUEsAUsrlUi63RpZzKAoAAACggYeRAMCESNVHepeLyzUNBADuqwywrCgiAgAsH4DFIgCfEADNsr86lIUBcAAgkIbGKpChUsQG9vSiApZlWX7kEwZHcz1tUwAA9F7iLEndcP7WSpwjvx2/fGompR37TklsH4EAkNDNJOXGIwvkRvn8ya+I64N7AwZRTwWkuwrAoCGVpEYiOtEA/ikA7Fo+UZJ2Q3pbJcrO8NtZO/sQPfcmxjMFmAuAEQD517Jb0uNG6ilJ9/szmZZ6+kwncIgToMqIoSLN9fj55AXS/AvcWPAv6ZnQ2aH8sySC3ZrzLTFeCsQS5wVBAKy8j/74sNA1yiJNBPmuRDA0SXg655xxW/SeApZNfoGsLLT9tFAErDcA5FZauqSlcLI7+W25wz8fgACxxPkJAqDRJRCQb2c0xb07DMtNHuw/nse67b9OO8LviRy0XD6dUM+BvFDYWPEEzLsB3FiJ40CC2530bBnL32u6doVjIc6nAAwBaIqv/NdmL5sQGPow4U/+mfnkMej69DV/XLicHgP8DNBNiOPv3sCtAtxYiePAhGQnirkLn18AYvwFYukDLAAmJ8Gc+90S/pg382Nh7j4RvY+nabKdM0D8T4KfAUi7n9AA+LPPAaZXI1RvUOxcbCiZCS43Sj1LT3w4vnrX26U3nfgPbBEC0NN9emq2O/j2bE9Ogich1pxp7PKhUgABNGIERNOzRbuM1Ha/EQD0YPZ1rHVCfUsVyc7wvw9A/EDjUBWbC6IANOlQOUgoS/sPiogsqtKS5yvHi+N/JtfPOZ979/K/x/ueY1xM9QUkUHFXYKR3RV1PQ241j00A7Foxq1Tir6AJMWN1uG69EuJvo+oGDgDp9/zjjlqnLaM6BSQPPF7VnNU91teWoy6WragYBgZcdJ7b9ur6R2nqOdWNk8/Ttk20VrXXNQDkWImrtDz+66n8sqRgA70zuzk2mRn7RRcfEgCsWy+aK9xkV7KcLU9LrY7eKvZEm2uOjw0CgDlAMjtV/WobuFL1pGgoItn0pm1aANxSmIiS9BvEb4UuS9IzpMe/zX47KIL4C2JbGQCNl1n2W19Wwe9oPiTZdSrd2Xh1vcdLARWurgT4NUD5G+lbfWQA3FS+XTITWjtVSJSkbhD3Q9fHvZssiT8LELOAYLgxQADCeMz+2+y9NWXagQ5GUwAAY0rYvTaz/7bn4trIoH3DgX9+JeRYGFpJ6oROUAXJklSG0v1A++LaQkssSAGwt587I1eM28x6TOPJHA8//hdwlq1ouoXhqcDhv0AbnaqT2lXkVr5RUjChfVNVmEoimHPmcbiJHB2MP4hZ0kcC4Mfb3HGmstgudH6C4c72gDu10nO5NuF7H8L/R1iAnv9VDvujkCLmLNxWKUzJTLA7lZYoSZuQfgBiXIilFICbAMbrZ1De8t2+Dh8Kbrj/8/ljHufLmsJxsll2ihslKP/v/Z+Qi3c7zpz5BNxUiaYkxYTohlJbSyoTbt3f6m9z9RXhWBZEAXDGruc77lee1auu9ALxV0//DPli0VIRPQaAnhDaIPkpa/deIvGGuAQA5FIxqqSyQd9UiP1AQnr8/slv+hh2OBYKBSDiRYZw/+oUmlTTweR98JtfQzs6px3XaQO3OtEnjJwDv4ZpAMRQFZGSSqGUUxWpktQN7P7v88TNWn1OsL2dY4slNg1IApDc/AhvyzkQrogwM0Sl/+P7yNvia8235f/fzmciX/jGYML7FaHLy+BFzKlLb6pbANROtVvKHx5qqexX+cOnD7DEUZsBeGpHC36HnviPcdYnl5G+tg3iIoR0P/zdvarx/pnklQ/LDMDrh4nQ/lerqeR6dWowUKyHMqxkleocDwDU1lmG0jJ8vamqMqUSv3yA/jJkC8Cr3YKWfRofyaZTtas1BvV7xRHWXmQGCRd9t61jGyY/Py4ArqfKcxHN9VQb8TJp2mQplbyssVp2pSUAOkh1DXwuLpLyu99/z9YVID//VUUCEm4vivLxL4zW9ok2fXk8/M/ffnmI5TIzYuXVref+4t93NE30jJ29sSyHojawsvjjfgAAFICTeELRVI5FgKN9yYqDZB9XOgE7z8zoef12hs+mO7F8iwIAZgp9g4qiAJLw5sM7l+Nb4WBaKnmZvIx8+9zff73t10XnuOwvR6aGxaT4ypPLd3oASA99bvm2/5ap7NqmfdgryR48k7WN2jXa+fEpZ1DtXycFiErfOFkmSqG10hsAWVwFgzYFwPlAr36yKFtxOoEEALqrq75zuGHrdBVB0QGXX+hTyQYA4BqZlFvZFgnw97Gaj3RTEaFc9CoAoLpunX+6uNvqsDcq1biqJCpZWIJDRwyWzW8uqrx2UwZDgwaVYIP19OctW7YQpFrev1S74CDjG2jgBpqE4VF5StmtTFbSrg0AnhfFQpxmk4zfvyDqKbEbcSpzqjxNvhWejx8QBbAb9q4e8PAjaOJbzUNzKZoeOe4akNnYrzUA3frx2HMeA4q+K8FK+eni4SMAoBIjnSCONyCnckUAfXts2vj+mfuZvWrdgP+f380fY3rG2WPCRHzMzbWdpfEEb576PwugNOdEGHx/ankoqeRAySEEXo+MvmLM7lQBRXVHO+MRFACArdyhB7PUZj5qT/7jwCBb//XY/uVSWfQS8BnzftHvtDMV7xEwUEzWefP+n8mmAP6pnLQQzcB+ZuyDPa/989f9D87vsbWKySyPr1Q4u3iH1ukdAPb8dL7Oz/3X/0YyxpiYABiXt4t7xlAoAAADGCJA/pJs5Lv+rX6CelXeCsStP0IABpBDrK3rEgmRAKrSlFR8TZUjFH1cpq2tHXkwgLH15T4PlWYBANs2Nc7Lw6MQqwDgNcTB3BzczHlL+WJtAE9nZ1MAAMBYAAAAAAAAVTkAAAMAAAByp3gtGv89/z//R/9E/1H/Uf9D/zb/RP9M/zX/QP9FnhfVAm75hdYG62+oAPrVLQnB1uUoDC8YqTvz92G//X6IAMlbvSjMOYKes/4KAP349xHx/IBypRQTX9oAgIyRTig0VUgEyCI1va5QvfOkt3uynd5fksvrr+Wvq/toanBbdhZEY3vtzs6Odj4XQOWP/WsMrSxNr6TnGkrIHQSz7J1cgwIAq9v0acW5JJ2TUy3fqt/GfHze+1Ny8tiO9FcBDUA+jL+qfuQ00C0LX8D20zk4yQDt7Oav8mIi59A86fqFeH0Wv1anOcEEQALFG53t9as+DUzSAAby9s8lw33WAlgWjz5dfeNsW+jQwWuQJWRZ+COsvyULGwAQwtZHGHAIloM3+5++YsM6R6nHUj8rlapPcIavYUn6y5djFb87KEsOYHaDBjaywz98dYFlAAN1mg4FCIAAWwBDELadAV4XpZhu+dVk/6b+hgRHHhN7moutsn8dgbJ9wL7HpabI1JflLgGlj1wH3jKeBsRWdlU5O+wBAOBw0gmi6VxApyIAYwTwg0f1k0XO+XDlSqeWl4z4wnU+su+/hb+lcD3fFDsxlk52NfI70I4vd8XjwfcmE8vhp3NDWaeWRuuOVrPXAvjRCdkkUUUBUFRn4xNdTnp4NET4Vf2v860y9/nL4k8k6dvqq6amOn6uvQ7YzrG91Vieeq46B9u4X6DKSVHql3GOMYuj9/WVU4/2PuOvW42HgTPwL/xqALqzGAAAMsWleNlZAD0wM3vXmPW1vZ237ThQAABwk27/+dsD2QIk3R5gGPyebcdcA1en1t//d8sWyMED7qmkO2qwLsSXhxQFJtnlhhsABwbAUKt9wnUKUQgA5KaQ5cOQDQBAPRcBAL431YJu4+VhPl4xCqo7x90US5phvJwP/e9ZkH2Fk8fxO+CK7gqa+VsAetSXVyzAfDXr3bfxnqcARSVA4QYAAHDY4AAkmiCcKqJTEQRjAEKb0DRn6XenZTvOvVXv/SzpSB632/63+MfB3tznXyfdMnurJeDHtPiTM2ujO/X753anvH0yEPcKkoGeJk1qXhSAZjPeXp0NAIoiIooOXTwdqKKiulK7e33jh11UuPe7QfVzr4+O1r3XXPLj67ib9+NeX14ffZ+lgekNvvB+Mk+cOTD8fapBhHqo3326cT/jzO6+fJ5nA8Pc+TmQTC5utypSDQAAAAAQweLOdDAADAwM8PDtZ3cYAKDM4Z4u8QtuIaQEAPgUfSDYDV5jYwFIgodPSyCXJHpLqcAB4GYQdwsAzgSnf8UWYAB0d9eb7TvytsgeAEDlt/cC/ubEAO/ZhbFfL0i6OgS+cVGC0mT5Y/6m+52KfcbxuGvg96bJk5n7JQCNh+v/c/M4d38EMKHZ7y4AY6xU6+XREwBAiQMS4QTxnoJWEUQiEOLdaAnbn54L9E/G2t59RMN+vuHigYHTkeTlmgBap/Nsfz2tes2H1zPVqLQo/PbPygKoqDzCGgR9CgCAooj2RHX2vKECKqJGfyNBh1XhZeOiTONDj643+3v1/sNl/SC//ctivxRq51osypqkmes111RlA1Cd3xzTxTJumjNAUbT3BcW+3/uiSGhyhwEz7lN13tdmN8XM87LfL1qPzzsAADyOMc/f977uNQYAAO3Wz7d669AyAGABLCPZRv/qrQoSUhUAMPCiIAS4LeTgc/sCgAJQAI4G6IpNYAvkyqJ5zz/rcxVgnl2qB+gITSEA8BUBkHqO5gD+5sQQJxsn59eXMdtniDcoZDDjONI+Xb8zsg+E+fDmt9ceANymhZ277z3nBxSdBJ1Wz+waACUOFGpwJxRNDSUBmHPfiZByLT8PPVTjg++Vh2Merg+02jEPdak4XDrndqenBSBcfH56oGKKqKj+bU7/lvmxTgAAAAVUeLiXuKhe5hP5h+2ylTat10d/3jz89Pbin377cVuML7d3lWVX5VRPrhyoQgMArjp8tX1902YaUHrJZcwx5/jjvLvFj/9P8wx4/nyzX1/Rw6n2hmzmzfnH8CXjRQYAAOYc0/497damQV4czv/3zrVTPqXw47lqHwBaptD+fO8BAEwAwAf8+QACQPA6/NT+HSgQCF5kg3iRAMiyPrGRBQwdQMgGjb25cvfyz3sgAfmW9om3zNxGP+lm7P/19rkAgk4cfuelE6iC9QIgATgaNBc0A/kKqgBf/QMeFxVUJLu6zN/usFIheIW7JXYyw0UxP3S/slJdo9Oj8wB383N/f3pvnBvsCU+bOz4GFHUDXufzu08rNgCotAQxQRDoVARgBECe3CUkvHOXI7xw0hGGp094upj2ujR9mPy6owB4Xq183VubG0o78DhXP8mViAeQnv11w+kAgEhf5tpb0KOoAIAqqioiXzdupa98cz5eetG3yuwyTefJ2xdf1wfmnT/qfD5Np/H3bZ5Pc89Xt/HvsL8vmUBD82k8jf/ODXadc25DzjnM8GNKeQ7G6/jy9fvj7bbPv9E8cPV7fPr870KW9ikZAACATO2t9EuvGJlSBwAAAFr78LV7AWgALPYgod6bCsBGAgCM+M7/2rZKkKIK9VZIrYYACPkoOLb/z22ssAFbjgwGeGyACwBAIJMFwg1tlA38WT767SeX2sgWsDmKpDLAfLMVAABAtwBe18SS3rebYq/WT6FL9o3OdUsZQS4u03P+cv1GQR2C+0P/PhbG8x598DvcGXlyWZZ14LvywQ2OP2CC/c5YAHuvVHz1/eqVBADgcHg4QbwfAeRUgQDwhjZk4bRWptfB/3+6t327PrnOH6/ZP636BQgaLZ37j8vZBpBLF09br0D2uU33k4w2eA2lI5SetqmlAIiY7badgzSLAgAqujUTRv6vjchA9KVyeMtHPvdMC9Mf3f/qnyV9M9q+fZN1owXIt7JrT3Pd4cnqBoBkeGbKz94nF6BT0PD40+9AnTqH3mhgnm9p9br0Pru3NvV21/RJ8q2RL86pQSEDAAD0yH/+J/LDzAAAGADgb7Tf1RcjyQDIrNpiAwLEwytbv/rMAkVoA2+2LQPwAgAAQO8hcAs0AIIs3/1nYwsAUJhrIOHeAgoADvpx3saEGGa8Nnl+6j8JUG2sISGGPb8S0m/3EJSrWgo3d2zePcr47+FI5r64gTcAfawXfRzKlVq/Tl4sAQCECyYI0xSJJshdAEUwAeDbWuPrzr76+kwPKqM5Gh5ejjTcSdXd/0xK9oQBh7ucAQCQnwFgfvecaq5WfqKiAAAApv6fX48um2qqqjhPrX2JiAJgvn32eol/8NO55PyW8+2//v2xcf/0uvcf/3j4naykl4y4PtNfk/QAQP0/xUXxV/dTPRs2Y3A3zXbGm9YBen/x2h/cSPV5uw3n8uG+h/sNgM/3z1+c79uXLyx1xq11WukdlAf3HytkAHjx1ZN//oNg/fCmswUAGqjteOJRMAGAOVA7lkMX50G6GxoDcIcv0Ws7RZIB2aBAgw0wG+QJOgACBAAZAIDwLzUAvsYEjGXcLOOh/40iO3DTm5MxmvFiaa8fiNL8w+PyF2Esz+qMsawrgdcAxN43787n3tODOBewUv365Is5AIBx4AhBrBSw3u6f+gLRqh8QAQEgO7x4sHK08baju2mRojUz4TstPbN7qK1e7TfnMtCNO0/OGYAoWQB8W5e/586WfMzhLto/KSlAlnSR3q0CKCLcV/ltRQAAABSEU53HVAUR2eFckywCEDmo9hFVBfBfznuN9uDggLPn2+3gkX95eZj7EKb1w7PaVIIx5ttZ7M+1a45n9/uX+xhwcJvrN//adyMYu2rPx8oxTvYe52cVAOD83+6ZMq2cXS3znQsAAACAeH32Uz//qAMQJ0OBH8KSAQAAgB6Ar9nMV9PjUrAtuEAgYEv4APBtjGSzGjAmxLbgI+wA2GwBQnOFvwlx6P5OHGSA5vu+hkRaZHNhjA/dbyga/541KUEzXLvcv6y/E6hC+Dw+FIBjzMV7Mkd/A6DP3vzUb9xA0V2Cldq3/6e1RgAABJwkV0EN4SqfApECEPyxi/+9p11+2L0TVCZdwsJQLbZqLlBzF14OsD3gfY6pJR8zQDBOpqMM4HPbTt001wqoqMh2p5L7Q08AACAiUnv5aok5NRUUnQ3N4qaKiiBcu5hGvx5dk8cspq0e/MH6b8r+5rMtededI2XO5vSmatO9md/OO0kg8/i4h9/PUwUMkJW7+mX9cLLkPDOD7Tz2nv5ZyzDP7Sc3x3Cm/WL/Nn6rfu0DAADs8/6drL/arGkArQPAkMPr/kXtvBRwBwxA6GetUxzbLBgAGZYTgywB9r+epW1uGuYwgaj8o94SpB4EoKCSqvpCtjAAALwWYAEggKqjzO/RDCjZBvaNQquylaEP3naERmRzTWkfuk+qE98NQwJAc3Xd2b90v6POuf3lne0xbizA8H6s9moyrD7yNJY+OyeOBqxUru8+bQAAEg5DV3Fvja7yA0hIAHwftJ/eyHPlXD7Xqb+m0+IdTsetpLc8HSkgglyqt+EbtQgAoIioaO32piE1BRA5f3JQEAFgMf2fGx8wbuOL3qjl/T//pq5y6xqHR7PrD+d1Gebt1T73eVtYfRwD6ug3v9W833IG57lTU1uf6mRgxffb3tw8ndma8OQd1Fm/VWZCTn6xY6a11jsAAGI0WpQMlNx8qRufWOXjb+VOS/UGMAPQW/fZ9iPfVgGg9INqPDb3W+e95ZKhkgM0APRLbWEn9aUEERKMdcA2sm6Hh//ze1tSBdaAG3KJIEAA2AJsHHyQwdABpAGQgZZhpwMet2RV9IvtJDxeEAXlcYYkqNiurh3ul+4XPVUnj8ff3IDmYV4n+9J4A2CPd36jpVyp/Nfrh90BACRs8CyRThB306BTFSPA2YXzkX3zZyphCZbY6SYbI/0y7Xi10ZuaeuU+5SUAFCXOlxjv9oYbAABQUQHRC31rUFEVEVT+nK9W/k0Rbkfbg6/3b74dvNU6uel1dkSng7NwSl4ebeUNqY01zVr85quyokMPTNHN15zxff5twjHmDnnoawbcRt8zQGt5/n/nLCgNqvJw1wgAt9dfi/nzxw0CQLfwx/71ppJtXBiXkguZOSZv95+vYNzanZfRm/9nfJBKFTKAAiAV/vR5vxYAyPsKa571vk6AgnZZzKCEqpR8KDAA1reAOGjA0InLIB++GpU2lg0GSg0JsTr7+0RAyAiZzOauZwF3nIoAPscUSfaLzWVcrt+JpdhnlDQjlKxfXmvmQ/1Fpc55XHX+GOi+4+HNnm8Y8wuQfdmvNABrjPav68ETvDWgqFsBrFT/9bQ9BgDAGOEEYUp0lRIoIhAIPmHWtLkzV7nL7bbnPZ/bSrzd48wt3ezXd8rtpukH7tKqYxvCzxkyNqnjsCwAxRyeasmAD8HPNk9WvJYAgC4d1/g1EQUQ9KzPH7JXFAAQAVWZxfccjQFVBDHP3+9QAOD+wVfB12/JrbxuM5Oft9Pj3fn8K+qpp9jKTGDvm7o//qveijHLEDYafQDMRx8alJLn7betYJqAqc6Pm11A7Taw/TYXCtAaABAfGZPPIkECAAAA5vizOBb3a+8GCORLNgYQcpJttDKhYAd4sNAjycIUDCT5ZdD4kMG1HSEAfQzd2i5VNrdnqAJAowoAAICXC5UAT2dnUwAAwJQAAAAAAABVOQAABAAAACulgxUc/zX/Nv81/z3/Lv8i/yL/Kv8X/xH/Ef8P/wf6+37mhFQmv3js1xVQpxxjSkT92l5/tE/5V+8kiVXxy889EvMBGH3zMVfTMHZ8A4j2bLmAh78elOCE35dA0QArNfo/3gQAAAknoQninRLIKgIwAiD7pC+u/k91DSVehktmukd9LfR02X4kc+n2wo6uZvbUqwrkQvznbdfKewmA3uxIIYCn1301vhw8IrjFA+Tf/qc7AgAqnAfN3SIAAAAg39ZfxwMVQzl//PH28+3xx/0TaX596xzIuA7vNf9/zdSYsmbR/LZvA0CndLbU4nYzjJkv4wcUoLfH/iZ3Nzf0+5cmz0dz/f2/ni5NAAAAQPZ5J4EXvp3CnmOCAcB97Kjm5i9VSVWJVKYPuW9byEj6+39sQBUJab4kUbBMbBLENMQBu2jy/3oVYKrZys/QQdDm4QAAAC8W/vY0RmobgHyMX+onpeQypmQY6xwAfpxP3ScSl6urAPBt2tcreogdpy/L7GUBACbizdNfHwFQdAMrxcTHSwAAAja4IJ0gag2QUwUQAOHlV9JvHjpdKLptPivBB+4Wy2rq2tb9AcD9vczJoQ0+BwAwLx6d74sCoCIqdptREAAAIEWFE5GGuMIYFWRk6FXz7aWo8Oub72zWPawQtuSD+uWHl748cdY2i//qmbZJcea4jfEwct5vUfN7DSQFQzKiPMG1XDKdTG4ddCq8uzLSCzsDkMvD/755q/dUAWbBBQBky+XL9O3NmTIAANAeTxwbALKiemea9+0rq2gAAAB6OP3B6OIMyBkADC34Whj6wYBlG/qfApqVvOaq/BAwgA0LhLDJEQIgOEx9sIQFQGsoU4DM3dgKwP4HvrbUSaheAzKyH7oLxbF8IRFwY7h2OQ/5N4qSzeMjB4BiVTXmOS/ieYTRG4014Lx6Iuvh7REAygm+3QFQ4ASMJojCoZ6IpggBGAFAfhr4eNnkfNat9JeX2tyyeW+bOKiD9fbeuD4a3mgO5m4J5vcw92a1DeABICynR4nbMSf7IfNCCCEAUj02gwAAIKow/or9LsglCOs/v3xxmU5qfdbLfgu+OZYaR5PT8/3lfm6AW6a9b/+4uznst3l24am8i7GTN+9XsG+Pl3/HfZ89Ll+maI5fvf+r2xh1N+wNQG2pfw4NAAvlXP+Pf3O6QW5kAAMbtWV/sH8TATIykhGALPHUTyqhAoYtLg1LOrQOHuqpvxjQ1ciXJYwRWBIGsLG/iw3MsHdRBHrexhICYGe4YRYAAAAsxQB+hoQuju3VY6zq79Fx0j9fSQS8MgCMzEv85CSJzYfLv94gwxxc1V2gOo2cRS8HALjiBnz8uUkATGh+utoAzFfvjwAQAY8Rq7glolVqgBCAAMC7HnKrrydLBn8SNdKe3E9VIT1zNgDgPGx4CLunja0HAKbe6UWf9/EApw/ulRUAYN8NPrybqAIAiIqYorWv/YsvFBBk5ExQAGDzmds357yeNc2b8ejg+vce2RwkFzCO0nufpyHz/ba4GHPy/fGvwVDNTv9Y9RsodtceXtzZXyaH6iZnoPvDjvlpCgmNcy0ny29f5gSeoWboBUCPyIEQwBmY7GHF8qLFPx4e58ANHADqfcMHkBkz35dt2wAAtMftWkgI6Zj/9dMQCQCQAf9k4S09GxvZTki2YgwAABJDhQ3cjcHtw0hX+a08UaBZPoaUxmnbAiz7pf4K5gJJvWVIKaS2EeAwL+ujUCgdV9cZAN+kvsfroWfuzKXxBjC3x99uPPgYqEDc+5ECmAIOJ2E4oWiKEIAxAPSC46TfPuyd0vZyDrXrvZxG56VW4SpyUIB50mWm9WQP0pQwDgDQ+rN48r6OW/EArA0dbp9EAQBWFzO/qaXfHD1vtfa8ceXPtfjzx/1XHp//t1481O3QNB1sPjWVVKoBgIku15zTv2+QsI96GZqkuxMNus87rUHmX3LN60xZ1cUDGxjGrr/+/vzTGfaZNwAkB1+1iQ4AAAAAACDex//eslUsyQAAwJNmwshfXsVV20haj9kILLH46pFArgNU8l9FpaQ0ZfobbHyL0zvfH3zPkYC2YUtWowD6qy0hADDEsdsYCADgCj6WdD5qjcBeTfD4zKSeYhiSyahzAHKYL/2r6MFu6kk+CicAOlRw0DxP1LPxBoCnv203z6sGRTUwBSSccILwUUCKAIAAwD9ZRj1a8yea5mq5N9G8MdLI+9vFfNSeDsXfCgB4+a0hhkXR0P/Qh6rNkCHdndS+9wQAkAgElNPLpGlF4VoaO/50fouyL+jldS5+fLqfXNf5tJyvzqlb7RTsrn3Pwnrakw/MnW2Pjduz27hhnznn4OyEZb7InMXZABRn6uv3qTNXTcHINDDl8vjljNwBAJr9fcvJrpwzkEWDg1T/zKe3enIBQAGo1GacwlfvDQQAxlEqVE1ekudEhVRSo4X0RMgYPP7WozqGIWcQKLYABAbIABu4O0YBl5YYWgbSAFI+hpTenJeXl/Zh/ZhOqAoShhSy6LMBmJyX/Bkc54+wiZrxU5/vJzHo6TT6bHYBJm/UQFFHYKWy/7QHAIBwwgnCXaMiACAA+M/kHT+0v//KuSWQ6bzvj++e+5oEdkLKKH9p5QHasv11uogCgKrEueczAACAgtAT2X7cKVDmB/+z/WD0P40+uPz2YS/ZZVr6YS5sohP7zNUH7knfOjwYnVs9Kze8vtnj9M989d9++3Qb+wGj9emPxXr1cnemYY5hvqaggbysXikAueQVc9+MlXdlZkcuNE87vmEqBQAAIJ+aD19/zOluUkYFtPWE794p5C63TguAVhTK73fHtU3PBmzwel8V/q8QdAYA5IXFwgJRmguhYYCmrFsAkMN5w5cOZKBZHpY0Jl5X1x/3av0s5uT3niVd0XouAUbuh+UaoY9dra6Pwzk08NHiX3m+J/usrwNTmHu+gHJlPvynGwAARBxQQDohMogiAAEQussF+//V3sm2nKSplx7XjhfdZPiwXendXUfXdB6AlnKR3ND463vn12nCR7/0AEDOKAoKAAAAqqoDjY0IfjXm129TbrbLUTu2/ps78yvHtjbPD/brSfXeau+242t+d394T6VpACDi4dd4vJ09sLkbly2/30mIpnflXoAy519/+g1kzOagNHw86vyY/x8HAAAAmrqof9KTBgAO88R6WzdMLJ0G5CYwGzia/m78Sl0AyGYDuExsAwIBAGDgZwCBgw2Rl0PBIoDgQEj3HOr59oAlFBiWNANbyLGRLQBgjQJNAEIUHpY0MX2228vzU/eLIyVUX1gyeaf7FsQlvXQfgXT2f0jgc4cVi1Q7ymW2DlQnnHNiAShX/wBAMJywAsAkJAAAFG4vju01m5O26yDNTJ7c+f3Xc+9vvZ2sKy0tAQCWyeG7KXguvu6+vacAcLp2bPKJKAAA045y866n272riK3LO70ff51P87E/rn2+DzmVpbV2DCL9W49XqDX8/7wV38fbAGQXvc7pTImqamhAaXd+1bGtXGgF+YwrAZhqZfNfOpsKAKUAWPa8nrfzcAYGYOYuHjzy6i+2GgAZgKXuw18PDj5sAgAEIBgAQAZWJdlo+AaYBITlp3fdGBx/lgGDwPxlCQwpBAGiyPd829tUwFZAAQAWyb+BLQCeluwt6TsCO5zfLB8z7JzsiB1L1hj1H0Ac7t90n8VpSnXIO/MCIFpms5cAzJvh+888+AYczwFYWOP37HMATAFBQk4BUgQgAObHtXC3nPb47krLZFk8AOTzVt1DALJbWxhl7AGAbufrcCX08XiAfHd7AAAA0Cf9ulX9uEytrJ27CP79+mdfV7Hrxe2D/7pr8KEfGXo0b7f1mJF5/+zsrIlnLanJr47VZ7W4/HsdJD1+TpaGztXmVs4I2EXld87jTgam8rD8pnf1sl5MDwtL//L+Nm6lZ8gdAOByuRbA0eWxAAAAsCUYCv6GkJEBMHUiFFKV/3q8UMGJzxEwkAFAfnDf1RIACgnseAB2F2ALAxUAfB6WbNOo9zUQzfil/4i2aY78YUnfq75boIe9yq+tfUnfCPo4Pk8dYfJXUJ7MNfgxWwfu+srzMEDzbQeA4vMbYEKA4RCYAhQiBEEABPS7vtE4Fy38EnmizrefDk+tbnyvfnE6O7AoAIHl2lbHBAAAcvbl7IZPJ1B8/3JqgQ6ADOaPtrIGANi5uHH6qQIAgOR0MPX2x/msqfccjqzwTe3hlhZep25tZ08iGirfqsc63v+zJgBNw9k7+vTkOUrVNAx0rOcl6qn2mwftmwt8u3nn/xc6OQMAAJdxT5xAAjRgAdDr0n8XyAAAAO5+lXab/mIAgLEP3g5/ayAXAJB86/bzXgGAQgbA9iMAAHAwBEjYCoADHpYc56LvJdBl/Gb5CEbJauxYsrVRILwCsdyL+irOKq0hPXHOJcsby2PunB8B0bI0XgGg70/fevADJaB438BK2b+MDgBAwCGDAoBJSAQAOOG3FNZZIeUg2lYWILrdlnYrhKVeBgDIqHXcHAoQLoePvxUAIN/1k5Y9BQAQh7OThlsFANAodrwVAQDotP9+i/vj0fTzdlem9bF+za33835TgbcOUsnKX/nKw1eoz3tPv7Eq6lV5er5glFLkNjf0L5jKRNk5Q6EAxRXetzeFqfe+2XAACnrx4/uX++uBCQBgiK8BAOgBAKCmfXNG2NhcAGIjFRkA4+DGTxemm4hRADgDyX+f/1EBXALADSJYBgAaPpbsS/9eXTXlUj/fjpxgET2WnNZJ32uAxX6pvz1JQCbQuZ+G8mQ2+isA9PVmxcNTwA/E+aYCE1QBQBICEwKEOAAAgOLH06H/XS7qK6U5/28hA+AJyS47ADkMf/UvWwqE0oGDcQDF5wzwYPkdZX6iAICKGsabAAAAUDv68dMfjg7K6k2+s9+efjjYFB6pn+2PlrzJT2P3F9OtUvynL8lSn1hkjD+HnKllfUwVAw1U8vY+u668N72BJyc/VHQmr6aQCpPxPld/fl/c5yk/SYcPvaZadZ7PhAMAAADdb0dXD5AATQIAABQ8fOZxT29HylMQRch/aQOXHwCA8J8NAALFiUCkAlgdAD5mnJYm4eXVZPeWX826QNppLNkukz+Ai2VTP25TnXOKc/yrcjIbs+WCGygenwkmBMIEY4AgkQhAAOyE+9ftRWLs9VlImN5ptgN5xzhyPssA0F/YuVxsRQEAEUj18qe7plKmvXOf+Nsjjft6KqmHWSGLPy8NKeOLvcnxgx9u9iU2B9NwZd3t/koq+gsAgBwK1fLE2XumgXLO9Fe9uMnmCDA/5nouapLrtfqQo9zyl0XpvQAzGUC15IQCAK1Mi98cfNnWXAIAgMQ9//374y2PBwCgQfWnkYuUBQAALsyPq9sCwBgv3h8gQPzrDWBeITdntgIQpRaATQLQCAA+ljympl8O0LTL4/Opg56KBiuOJZdz/l1cBely/X47SdpMROdeSnd5ss8aF2CaTdEAq08AwEIgiEBIJAJguWMzh+Zp622K/M06IACQpbobcWL35OR70cktAADIyMeFqAAAANPlX7bvaH9xWRbt4PBv/3dd3895vxxlRltt2a37B6Ru57aftk7NdJ30pokUjdF8YToB6O57yK8zBmQazmFr/dQkA/WDAkCZ1s95PNeg35ZoPlTO/vnHMIw7JoDq9FvoBe5gjgzOvz04uF4BAMmtW5+GCSxgwYUf8Lj6lew2bFDwPPpRAABb320BMDw4UsBmAYDGX1DYQGgoAE9nZ1MAAMDcAAAAAAAAVTkAAAUAAACeT3/vE/v09v8C8vr26OXq6uft5Njl29o+llzP6X95lZyF34+zqiIZS16P+ttcT9Iv/a9h7I/oOOOUp/JE2ZitAZdDufoDIGFMACapKgQAy9//2+jPur529t4/2DvtZQAAuFu2rEXDXyIAAACc7Q/JDJ1w3bn3ngWta2qt/bbGh+3Lt7bYT/tq/6gcnOdent0Vn+Qh+ndF3hjqx3qjjjdD4nxqTzONrwbwsSebuL0/ryVz2MPYNaGw+cx+U2kUChk0oKDrtOOErT03+Hr8/693ngGYmrd+uG+Ycy4AAFRgPvjn/9+aAAAAUFCAn6nCDKhXzb+fADTAfmQDAEBfwA2wAxpzADM4w1GcAgJY2IABNg3IAF6WvB7Lf7wePH/z+LWdTuIpjSXPff9vrjtn1f0+SVxFikZXN4Ud9cZsDbjiUBRFMCEkjASqIgQBEJhc3offqZO/vSI7jQJ4IHjKjk/SOsvHnV4GAACAhuB+mPpv52VXpp5c0HJv6f/49LT3+eLp74+HH49v4zGduXgZ9uEs6zVMBTi/vn7JBdthj9eZ3t3RANO1Aeb9/u+3WbsPDgsWtOlhfi5bPdM6AADs1cYwgAHQplM8IbkAgEY//8dJO5QBAABg6Yt+tAAAAJqhI7eVfADCgP3yBV2gzQRyDbDDDtCsvwHdFGw+AQowTz5L8IE9QAPWZABeZjzu++9iE9zrFThQc9yxLLm9HD9z3Rgv8TM4SepCOs7RE04jZ7M14NvyUJwGmKASACSpqgoJAAw1DkdXr0+W+ml86zAHAJC16x9uJJj+YTp22gEAgGqDThQAAADiqX92kQWbtuken+WvpzaejkYmT93vtX6ntK3BToo2vjh7P3hw8vhzjjHrA2DXulUAzIF53lO6j2nYLroZgPzXttWDDZk3VSuUWP+s0UzuAABcrloVAIACt75/SmUAyBzcTvtqogEAAIAKyvxfgABmSoDwmL/+GWBzuxMLgQIgOgM4ZoAsTjG0wQJkbagB/wgYQBwrpuFQwAFelvy4zvpvAZX9af0opkRzLku+j1nCdGXMT/3vgcJpbsrLoQFRNJstC8VnAhNCWOWqigBoeujNcqy361ulW5n41RGn325bAACgNp8XoJcqR9uV71NKhtu3Hyz+8b+rmov7Q/+h3SfnzYQ7q/hnJTqYrxMOjzKRuzVMdT/KjJynVl1Mz0DGFz+eLY1VwKB/GKiUD7duLdqcAegaUKApZADm8UHtc79uz0wzAMA0AJvxlz98nA4AfbglAAAAwKA1f7IBAEDZmC8+rCZe2JXEtL5OFdqLX5vYtQoF2LuI68qFTbtY19c7GgeFRkqIwrw+Py2Ob82v+u4QtjPNFGmKeuRmAD6WfF/mb751xsvjExUGYiz52i7ffKuMh9cjaZSKEnKl3JmzaA24LZQTItVQFYkA8ABAoVz4xo0ONAD0fO+0mHe/+05O1aZN/ubKYlqsi8L1uOxP3tGz/9Yaf3m5qf4+D39+jnM4ze6ZxAlNQg1S/+id75UAADkJ4KtINlcDAKh8OOjTpmWODLEqrco4ej6fFepMAwKiHHQBLABAeZiq1gIAEv2c0wAAAHqw/v1H5l4AAGDpN4ubtwQAAM3xaXiPMjHCLy1hXQlAWEp+oRJjyG2wjWUpNuCakln/+3cLBYBZ+x6UGjINCy4xXx4n+zgAPiAAPpb83E7fNCrtZflVjOqU8pYl39f9b7dGu9RPJDKUbdKNaLZhdgGhEqqqCoC3uqO2AACgoAH6kDxbauNvTyotbw7Gl4d1Hvd8HM8ebpf3/28d6ezrm/tlv986o90qP4vauPz1zVnwdneSBfDQNimDJffA6D89dNW+wcB8Xn27tbtm25mFhouW/e2CIgG6WaEWPtmXAkCnH1AW/yMHTlB1n0Keb/7edi0DgFF/f/z2agPkCwwAAOx1Shm65tn/OY/W3fXDwHJdOwRkjNHHCL72P3xXi7xg+ZmSnmLeoob51LVy2hAYrYvz2kO0bsApUVXBIQ4LJLMFaGAADF6W/LwsP71U0osP5o6z5Pd1/KWktIfl92Jkh9SVcbKRszVAfShDsaqqkAh48QBA0KWDRbYAKGCsH+97udW879cs0dd3ptbCcdtcPHihdeo309bBDJujNNVG683DSw61W3RxGaBhQINx/t11jvGIWX93L6efm7vtpOlneb998oorEZq6JhOAMpW33nOjkDMZ6CsUdbvQANAo6/B7AQCA5hfrTgYAAGBMH1a/ztM6AADgLwMAAlRsqnBmMr9fvcuzr/UGwMVlZDQSvvaQcOVVjy6q3P1y2ZPsLC2mxINDjsI+k6k/DJ3qCYJiCIJR1zcOoJ4hAChAA15m/Nn2vx2VwvIbjakO2UNZ8vMyfcmURPcotoXzOcOojXLWWANUC8wKAJdQVRUhBCADAJTWqN3B/NckAwAAODpTk+9QOZyaUXP8NM+87c5FP8pbNsuejnN4O9gEd571oXOIZm1c/we93/5jrQuKfU1tZvqvUzQUUOkM0JkWn+SwF2joSn/A9jhW50MRxwaG0ZCv7xUAAPSeTHsJAEBO9NUDAMBjCGAY+TG9sD2dtaaeARss6wtkkeLW3LmIaXPBjBfL4UuPedsc/Yw9PGfTyHeG+hoIXsf+cFGC2YJrEjm4OtYGRPECAA1elvy5tH9JwyV+NitF5rmWJb8v49+TgvqrUIeomxrrdCOadYaqqiqEEAAAjNbmLis7DAUwPr0/1/6+HWqrcDnPL29v5dxLL7ebXbfxaRoI6VAfZqBn+PL4+GnNLf8+0z1wqiv74OxT5zy9n33m23bBsPZXPV/xnF0FwOX9HHbRSgfIHTZenDi7FgBg31w93gBgV3wAAAAA3uePtn06AJTOmdN3e7iWwoCZ/84W/W97ke+xHk8PuBtHpTgsmFuNakTHuh+ag9U+Uca2x84HDcMiMaEnBJHoHW+MV1tTgNYcM+wNbBoAfpb8dWl/I5RE99c0okokcz5Lfl2nn0sDeW0mO1Coo0eNKIooVVVVhSAAACj7Y8IHtZPzGMoYb/czHl0/5/51jJzl5/P5nzcfD5/Xb5dP80uMH/vHSNKFL2BaM7wakskoKsjZd7/Vbctpc6b1/euvcbYzZpopqAGf6GEADzVn0DRH7HcKTe+mAX73fFsKAABqP18GABhHnBQAwKC2zfreDQAAeJZWcajp1b+pk16gjHd/2ZZT4/u25qJdl9n4vNeMXkAbm+8rY8sh7PXA1+7DsVAfFjS3seIpZIrIunQG9wUXBTZOFAC8DRgAfpb8uq7fEgLqZ7GuCKi7LPlr235qDXSPQUHpoLY9iqJGZ6iqqooQAAAqd+c6R0vPV9Xf9z3Hdv94+nvr1qIVLs7fWtqdzkF53cp8eE4eTsZqzmSz6wBZ6HXWdzfTI2aAyXR3JK0FRRdc4UCB0r/NgAid13OTuclsZPmmYHon04Rz++O/X4+jvwAAZ3QmAOhrAwAAACiOt84JAEF+xPSnPsjyPDHpGbTmY/Tt9HRgunNqOsO4+EEYmlB7CHHFuIuX1tPKtt67urq0XiL7XLccye2G08lfCEF76qEeFgk0Y7YAOWfoAbqA7UABfpb8uUw/i9CIHwk7MNey5Pu6/kINdFezn1OBUZvRLJolQ0JVVRECANiCbzk3WY7O21atjM38sp8/aSyk+Wj/7MytHOxlqXRldrIY9ikPwH7izjG7KmIaracmSjd+vk1/5lpRGr2Rx/WnxTRsc10NliefeCrLZyi4HbCOjx0TrQO9A3pRX2sAAIATvwkAMPB1IAEYADCw/8jVp0MAn7u6Otab05O3oYGPZCwDaj1SW1gYxrrxOy2mnEWa5VU6p7uPf0qHL72wcz1WnkqLpFf3Tw4+bZXXhz3d4cHchWMGNEPCDvVAMBwAXpb8vW1/jIL1NSgon/ss+XPpP7cK1qsZFZTsSm171MhZxFBVVRUCAKDCwxj1vWJLnXIzMe4P3z+/lLfhgfPR5mF7+O2St5Yzvf3m9u9tmCV/fFYzOUPt7OrZVTkAO0m+djpuJMnJyRg4P3p/fTlzgMK2sPA4euaAG64psruaw1SdnhcauQGN9fzrxXrjpDUADLuvGgDg5soKAAA4fj71l3+MAjARw5rR97SapEVj4lFhzWeY/l0oeqf2q85luqow3K1FWud8sjBfR+rzgQdykNEi+K3eyo6aUQaG53m4T5gwg59pOTVUAqaZDaAAfpb8us1fhIL6aOaKBDuXJb8v4zdcQf5rFJnnCoO2R41GI6IUq6qqCIA2albNkLX3m+M2zD13p7896yC9jfeXPt1ctuRhcF/sWhpv9/u838sZJnv6R+9Nct9Deyb7IYvc7WvMH3MS5wyMGo8f83a4exrUocepP7+OM+3BwIlrXl86gDPAp9uHV1pfAADIDL4lAFDwBgAwYCDPfxptAAAQcc6KXmk3MWS75zLgy6BI9KRyRXpwjFwUJ6Xh8vLqYZ8ebSJGW65fCd9aInRwTtqvnTv4Q1zUJcGVDIuTevdRQAkQPGgAfpb8dek/tQr6tVBCZuey5J/t+A8M9AsjCz1AbZNuREHNKA1VVVUIAQDAXkjcnb3ts2vucmyuTqmdTQO15JRr+f38Zr+8RN4unaOnCrIrSdMwMd1G7/fW4ajz6UtDN0CDsSf3Gm9/HRwDSK05vL+vLBoSEhwfvW1px54DsM/P2QKAW29jAAD+KqBOqmIywRalPqUDIAQWa6XJGuADAABiQrWGanq0eOL387AeFoi3NDpoEu5LM7q124yFo9cBzrDx44PXd23TqMWJ+xRaTQAMRYBWBTIZFDAAfpZ839Z/oCC+inXynM6S39fx71JAVxsWIl461qNZj2aUoVhVVSEAAIAKkBSgqLFm03frYveea6+fFHTbR+XGqd00d25v/b8eTPaPPdjkTk7XNv3cZu4agDzUj6J5FF5rvAEgtx+O/sW9g2JRLeac2/n7Yp/htgFD597Mm3ASGKCB84krNVwAoLP46zTuAAAYDboqBhXN/HarjwEAADCAuQwAbkj1k/0fsQ+S+vvZMmHSjU9+6VLd6QPiuTCciY/t7IwcgyTsXdeC0j7i8q7K20F9jba2W3Ll9tbDz6JQMPoZDA0ANl6WfF/nf7khqNdwnCKzOpclvy7zt1zB+mqmEvLc1JH0rAcxopRQQlUVAgAAsAyYzd44cTfHOHXq6x/+/O+M9y/rH/Uw9v2cT5r7UGjlpjJHXc0VNznFytGPoTpjzdfZTLPQAAAANJ/c6YACAHjoPN4BABgLmBNRxQAJJDmZP4D+zxJ9kQBwAWAAAG/T4O0ZAAAgsPn/jkQEgNeWDcCR4VTLfyMf+iQY44wCGHwJG+GcbeOiNY8jnXTXnlWbVsfrS4xEdmR8mU9CEH07FAzybq1Fxh6gs29tsA0AZF6W/Lys/3IB3RKsLXm4jiW/t/0bUgkvj644kjHxwmj0aDYLakapcqyqIgQAA9XMDGTMOXPP8WVyyw/5+njLH/1P5+P840v/7HHb4rZeX705QGWeU8RkkqxMmarioqmnZT9OzBsAALTqz4P0AlwALvtO/lBKoZChFWvE23+djmMCWD8FAHx1nnMGgJoA6gcA2D7/+JYzAIDE/nNtx/LWe0294Fq1Ta23K4GrSYx8cX3nT218gDQEB8+O9WY2aaJzoB16OBYzDSJlREjTRCmeNkME9+PtCOycAGQAT2dnUwAEACABAAAAAABVOQAABgAAAIsxbiwR8oYBAQEBAQEBAQEBAQEBAQFelvy97RK6C5JvHRYLobcs+Xs7/kVi8KlZi7wwOhmtwYuoMaNVQlNVCAIAwPvS3k2GlgASCrgT1Qx0AwXyeW5/6vTCra8XubbIXbnk6c43/Gi+48SbLs9Rjrw7yn9N1anXe7LUlUxS/tLWAzosABT8Pmc3AAfavB9zvTaFc27O2JgPz9/U4mHQlrGApvZ+8/atg1IoTMBq+NuwkEz/k9P7zO8VRgLUTRZcnniuPzhoy8Gmf7EJqL/uNdcgEBh+lpiNvzYPBPvr1IRYmX1LMgAAANjC+jmUGLJTUU/xjDsKOzhi7fLhkB02wnk4+xiGswYAFB6W/Peod0pBZyMzlvz3rF9KwbatdQAAI+qMSs+oEEIAAAAhAAAAAEAWQEJW3hne3JdZnQComtVbb0y3vjzv97ent/ZLrrsOh9p8vfoHy/ev/n/9rx3DweZfP3d6GWoYYHp6YNp5jxf7t94f9P3nr5/3C9D/3UnFwLJAHzQAACU8AXYK2AIADg4ODg4ODg4ODg4ODg4O", ["MC Bow"] = "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AAAYcAAACDChDBQashIAiAIAcCiKZQHHsSzgOJYFJMmyAJYF0DyApgFEEQAIAAAocAAACLBBU2JxgEJDVgIAUQAABsWxLE0TRZKkaZoniiRJ0zxPFGma53meacLzPM80IYqiaJoQRVE0TZimaaoqME1VFQAAUOAAABBgg6bE4gCFhqwEAEICAByKYlma5nmeJ4qmqZokSdM8TxRF0TRNU1VJkqZ5niiKommapqqyLE3zPFEURdNUVVWFpnmeKIqiaaqq6sLzPE8URdE0VdV14XmeJ4qiaJqq6roQRVE0TdNUTVV1XSCKpmmaqqqqrgtETxRNU1Vd13WB54miaaqqq7ouEE3TVFVVdV1ZBpimaaqq68oyQFVV1XVdV5YBqqqqruu6sgxQVdd1XVmWZQCu67qyLMsCAAAOHAAAAoygk4wqi7DRhAsPQKEhKwKAKAAAwBimFFPKMCYhpBAaxiSEFEImJaXSUqogpFJSKRWEVEoqJaOUUmopVRBSKamUCkIqJZVSAADYgQMA2IGFUGjISgAgDwCAMEYpxhhzTiKkFGPOOScRUoox55yTSjHmnHPOSSkZc8w556SUzjnnnHNSSuacc845KaVzzjnnnJRSSuecc05KKSWEzkEnpZTSOeecEwAAVOAAABBgo8jmBCNBhYasBABSAQAMjmNZmuZ5omialiRpmud5niiapiZJmuZ5nieKqsnzPE8URdE0VZXneZ4oiqJpqirXFUXTNE1VVV2yLIqmaZqq6rowTdNUVdd1XZimaaqq67oubFtVVdV1ZRm2raqq6rqyDFzXdWXZloEsu67s2rIAAPAEBwCgAhtWRzgpGgssNGQlAJABAEAYg5BCCCFlEEIKIYSUUggJAAAYcAAACDChDBQashIASAUAAIyx1lprrbXWQGettdZaa62AzFprrbXWWmuttdZaa6211lJrrbXWWmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmstpZRSSimllFJKKaWUUkoppZRSSgUA+lU4APg/2LA6wknRWGChISsBgHAAAMAYpRhzDEIppVQIMeacdFRai7FCiDHnJKTUWmzFc85BKCGV1mIsnnMOQikpxVZjUSmEUlJKLbZYi0qho5JSSq3VWIwxqaTWWoutxmKMSSm01FqLMRYjbE2ptdhqq7EYY2sq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", ["Skeet"] = "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TVUVAABQ4AAAEGCDpsTiAIWGrAQAQgIAHIpiWZrmeZ4niqapmiRJ0zxPFEXRNE1TVUmSpnmeKIqiaZqmqrIsTfM8URRF01RVVYWmeZ4oiqJpqqrqwvM8TxRF0TRV1XXheZ4niqJomqrquhBFUTRN01RNVXVdIIqmaZqqqqquC0RPFE1TVV3XdYHniaJpqqqrui4QTdNUVVV1XVkGmKZpqqrryjJAVVXVdV1XlgGqqqqu67qyDFBV13VdWZZlAK7rurIsywIAAA4cAAACjKCTjCqLsNGECw9AoSErAoAoAADAGKYUU8owJiGkEBrGJIQUQiYlpdJSqiCkUlIpFYRUSiolo5RSailVEFIpqZQKQiollVIAANiBAwDYgYVQaMhKACAPAIAwRinGGHNOIqQUY845JxFSijHnnJNKMeacc85JKRlzzDnnpJTOOeecc1JK5pxzzjkppXPOOeeclFJK55xzTkopJYTOQSellNI555wTAABU4AAAEGCjyOYEI0GFhqwEAFIBAAyOY1ma5nmiaJqWJGma53meKJqmJkma5nmeJ4qqyfM8TxRF0TRVled5niiKommqKtcVRdM0TVVVXbIsiqZpmqrqujBN01RV13VdmKZpqqrrui5sW1VV1XVlGbatqqrqurIMXNd1ZdmWgSy7ruzasgAA8AQHAKACG1ZHOCkaCyw0ZCUAkAEAQBiDkEIIIWUQQgohhJRSCAkAABhwAAAIMKEMFBqyEgBIBQAAjLHWWmuttdZAZ6211lprrYDMWmuttdZaa6211lprrbXWUmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaay2llFJKKaWUUkoppZRSSimllFJKBQD6VTgA+D/YsDrCSdFYYKEhKwGAcAAAwBilGHMMQimlVAgx5px0VFqLsUKIMeckpNRabMVzzkEoIZXWYiyecw5CKSnFVmNRKYRSUkottliLSqGjklJKrdVYjDGppNZai63GYoxJKbTUWosxFiNsTam12GqrsRhjayottBhjjMUIX2RsLabaag3GCCNbLC3VWmswxhjdW4ultpqLMT742lIsMdZcAAB3gwMARIKNM6wknRWOBhcashIACAkAIBBSijHGGHPOOeekUow55pxzDkIIoVSKMcaccw5CCCGUjDHmnHMQQgghhFJK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", ["Break"] = "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", ["Rust"] = "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TVUVAABQ4AAAEGCDpsTiAIWGrAQAQgIAHIpiWZrmeZ4niqapmiRJ0zxPFEXRNE1TVUmSpnmeKIqiaZqmqrIsTfM8URRF01RVVYWmeZ4oiqJpqqrqwvM8TxRF0TRV1XXheZ4niqJomqrquhBFUTRN01RNVXVdIIqmaZqqqqquC0RPFE1TVV3XdYHniaJpqqqrui4QTdNUVVV1XVkGmKZpqqrryjJAVVXVdV1XlgGqqqqu67qyDFBV13VdWZZlAK7rurIsywIAAA4cAAACjKCTjCqLsNGECw9AoSErAoAoAADAGKYUU8owJiGkEBrGJIQUQiYlpdJSqiCkUlIpFYRUSiolo5RSailVEFIpqZQKQiollVIAANiBAwDYgYVQaMhKACAPAIAwRinGGHNOIqQUY845JxFSijHnnJNKMeacc85JKRlzzDnnpJTOOeecc1JK5pxzzjkppXPOOeeclFJK55xzTkopJYTOQSellNI555wTAABU4AAAEGCjyOYEI0GFhqwEAFIBAAyOY1ma5nmiaJqWJGma53meKJqmJkma5nmeJ4qqyfM8TxRF0TRVled5niiKommqKtcVRdM0TVVVXbIsiqZpmqrqujBN01RV13VdmKZpqqrrui5sW1VV1XVlGbatqqrqurIMXNd1ZdmWgSy7ruzasgAA8AQHAKACG1ZHOCkaCyw0ZCUAkAEAQBiDkEIIIWUQQgohhJRSCAkAABhwAAAIMKEMFBqyEgBIBQAAjLHWWmuttdZAZ6211lprrYDMWmuttdZaa6211lprrbXWUmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaay2llFJKKaWUUkoppZRSSimllFJKBQD6VTgA+D/YsDrCSdFYYKEhKwGAcAAAwBilGHMMQimlVAgx5px0VFqLsUKIMeckpNRabMVzzkEoIZXWYiyecw5CKSnFVmNRKYRSUkottliLSqGjklJKrdVYjDGppNZai63GYoxJKbTUWosxFiNsTam12GqrsRhjayottBhjjMUIX2RsLabaag3GCCNbLC3VWmswxhjdW4ultpqLMT742lIsMdZcAAB3gwMARIKNM6wknRWOBhcashIACAkAIBBSijHGGHPOOeekUow55pxzDkIIoVSKMcaccw5CCCGUjDHmnHMQQgghhFJK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", } local Self = {Cache = {}, Failed = {}} local Alphabet, Lookup = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", {} for Index = 1, #Alphabet do Lookup[Alphabet:sub(Index, Index)] = Index - 1 end local function Decode(Text) local Bytes, Accumulator, Bits = {}, 0, 0 for Index = 1, #Text do local Value = Lookup[Text:sub(Index, Index)] if Value then Accumulator = Accumulator * 64 + Value Bits += 6 if Bits >= 8 then Bits -= 8 table.insert(Bytes, string.char(math.floor(Accumulator / 2 ^ Bits) % 256)) Accumulator %= 2 ^ Bits end end end return table.concat(Bytes) end function Self:Resolve(Name) if self.Cache[Name] then return self.Cache[Name] end if self.Failed[Name] or not Data[Name] then return nil end local Okay, Asset = pcall(function() if type(getcustomasset) ~= "function" or type(writefile) ~= "function" or type(makefolder) ~= "function" then return nil end for _, Folder in {"Swift2", "Swift2/Assets", "Swift2/Assets/Sounds"} do if type(isfolder) ~= "function" or not isfolder(Folder) then makefolder(Folder) end end local Path = "Swift2/Assets/Sounds/" .. Name .. ".ogg" writefile(Path, Decode(Data[Name])) return getcustomasset(Path) end) if Okay and type(Asset) == "string" and Asset ~= "" then self.Cache[Name] = Asset; return Asset end self.Failed[Name] = true Functions.Utility.Notify("Could Not Load " .. tostring(Name) .. " Hit Sound", "Warning") return nil end Functions.Visuals.Sounds = Self end function Functions.Visuals.CreateChams(Prefix, Filter) local Get, Color = Functions.Config.Get, Functions.Config.Color local Workspace = State.Services.Workspace local Self = {Entries = {}, Properties = {}} local White = Color3.new(1, 1, 1) local Materials = {Flat = Enum.Material.SmoothPlastic, Neon = Enum.Material.Neon, ForceField = Enum.Material.ForceField, Glass = Enum.Material.Glass, Metal = Enum.Material.Metal} local Corners, Lines = {}, {} for X = -1, 1, 2 do for Y = -1, 1, 2 do for Z = -1, 1, 2 do table.insert(Corners, Vector3.new(X, Y, Z) * 0.5) end end end for A = 1, #Corners do for B = A + 1, #Corners do local Delta = Corners[A] - Corners[B] if math.abs(Delta.X) + math.abs(Delta.Y) + math.abs(Delta.Z) == 1 then table.insert(Lines, Corners[A]); table.insert(Lines, Corners[B]) end end end local function Original(Object, Name) local Properties = Self.Properties[Object] local Saved = Properties and Properties[Name] local Value = Object[Name] if Saved and Saved.Applied and Value == Saved.Value then return Saved.Original end return Value end local function Set(Record, Object, Name, Value) local Properties = Self.Properties[Object] if not Properties then Properties = {}; Self.Properties[Object] = Properties end local Current = Object[Name] local Saved = Properties[Name] if not Saved then Saved = {Original = Current}; Properties[Name] = Saved elseif not Saved.Applied or Current ~= Saved.Value then Saved.Original = Current end if Current ~= Value then Object[Name] = Value end Saved.Value, Saved.Applied = Object[Name], true Record.Objects[Object] = true end local function Restore(Record) for Object in Record.Objects do local Properties = Self.Properties[Object] if Properties then for Name, Saved in Properties do local Okay = pcall(function() if Saved.Applied and Object[Name] == Saved.Value then Object[Name] = Saved.Original end end) if not Okay and Name == "Parent" and Object:IsA("SurfaceAppearance") and Object.Parent == nil then pcall(Object.Destroy, Object) end end Self.Properties[Object] = nil end Record.Objects[Object] = nil end end local function RemovePart(Record) Restore(Record) if Record.Wire then Record.Wire:Destroy(); Record.Wire = nil end end local function Scan(State) local Seen = {} local Descendants = State.Source:GetDescendants() if State.Source:IsA("BasePart") then table.insert(Descendants, State.Source) end for _, Part in Descendants do if Part:IsA("BasePart") and Part.Name ~= "HumanoidRootPart" and Part.Name ~= "CollisionBox" and (not Filter or Filter(Part, State.Source)) then Seen[Part] = true local Record = State.Parts[Part] if not Record then Record = {Objects = {}, Details = {}}; State.Parts[Part] = Record end for _, Child in Part:GetChildren() do if Child:IsA("SurfaceAppearance") or Child:IsA("SpecialMesh") or Child:IsA("Decal") or Child:IsA("Texture") then Record.Details[Child] = true end end end end for Part, Record in State.Parts do if not Seen[Part] then RemovePart(Record); State.Parts[Part] = nil end end State.Dirty = false end local function Create(Entry, Model) local State = {Source = Model, Parts = {}, Connections = {}, Dirty = true} local function Dirty() State.Dirty = true end table.insert(State.Connections, Model.DescendantAdded:Connect(Dirty)) table.insert(State.Connections, Model.DescendantRemoving:Connect(Dirty)) Entry.Chams = State Self.Entries[Entry] = true return State end function Self:ReadOriginal(Object, Name) local Properties = self.Properties[Object] if not Properties or not Properties[Name] then return false end return true, Original(Object, Name) end function Self:DetachedSurfaces(Part) local Count = 0 for Object, Properties in self.Properties do if Object:IsA("SurfaceAppearance") and Properties.Parent and Object.Parent == nil and Original(Object, "Parent") == Part then Count += 1 end end return Count end function Self:NormalizeVisibility(Parts) if next(self.Properties) == nil then return end for Part, Transparency in Parts or {} do local Properties = self.Properties[Part] local Saved = Properties and Properties.Transparency if Saved and Saved.Applied and Transparency == Saved.Value then Parts[Part] = Saved.Original end end end function Self:RestoreModel(Model) for Entry in self.Entries do local State = Entry.Chams for Part, Record in State.Parts do if Part == Model or Part:IsDescendantOf(Model) then Restore(Record) table.clear(Record.Details) State.Dirty = true end end end end function Self:Remove(Entry) local State = Entry.Chams if State then for _, Connection in State.Connections do Connection:Disconnect() end for _, Record in State.Parts do RemovePart(Record) end if State.Folder then State.Folder:Destroy() end Entry.Chams = nil end self.Entries[Entry] = nil end function Self:Hide(Entry) self:Remove(Entry) end function Self:Render(Entry, Model) local FillEnabled = Get(Prefix, false) local WireEnabled = Get(Prefix .. " Wireframe", false) if not FillEnabled and not WireEnabled or not Model or not Model.Parent then self:Remove(Entry); return end local State = Entry.Chams if State and State.Source ~= Model then self:Remove(Entry); State = nil end State = State or Create(Entry, Model) if State.Dirty then Scan(State) end local Style = Get(Prefix .. " Style", "Flat") local Material = Materials[Style] or Enum.Material.SmoothPlastic local FillColor, FillAlpha = Color(Prefix .. " Color", Color3.fromRGB(160, 110, 255)) local Opacity = math.clamp(Get(Prefix .. " Opacity", 0.65), 0, 1) * (FillAlpha or 1) if Get(Prefix .. " Pulse", false) then local Speed = math.clamp(Get(Prefix .. " Pulse Speed", 1), 0.1, 5) local Minimum = math.clamp(Get(Prefix .. " Pulse Minimum", 0.25), 0, 1) Opacity *= Minimum + (1 - Minimum) * (0.5 + 0.5 * math.sin(os.clock() * math.pi * 2 * Speed)) end local WireColor, WireAlpha = Color(Prefix .. " Wireframe Color", White) local WireOpacity = math.clamp(Get(Prefix .. " Wireframe Opacity", 1), 0, 1) * (WireAlpha or 1) local Thickness = math.clamp(Get(Prefix .. " Wireframe Thickness", 1), 0.5, 4) for Part, Record in State.Parts do if not Part.Parent then RemovePart(Record); State.Parts[Part] = nil; continue end if not FillEnabled then Restore(Record) end local NativeTransparency = Original(Part, "Transparency") local PartAlpha = (1 - math.clamp(NativeTransparency, 0, 1)) * (1 - math.clamp(Part.LocalTransparencyModifier or 0, 0, 1)) if FillEnabled then Set(Record, Part, "Color", FillColor) Set(Record, Part, "Material", Material) Set(Record, Part, "MaterialVariant", "") Set(Record, Part, "Reflectance", Style == "Glass" and 0.15 or Style == "Metal" and 0.3 or 0) Set(Record, Part, "Transparency", 1 - (1 - NativeTransparency) * Opacity) if Part:IsA("MeshPart") then Set(Record, Part, "TextureID", "") end for Detail in Record.Details do if Original(Detail, "Parent") ~= Part then Record.Details[Detail] = nil; continue end if Detail:IsA("SurfaceAppearance") then Set(Record, Detail, "Parent", nil) elseif Detail:IsA("SpecialMesh") then Set(Record, Detail, "TextureId", "") Set(Record, Detail, "VertexColor", Vector3.new(1, 1, 1)) else Set(Record, Detail, "Transparency", 1) end end end if WireEnabled then if not Record.Wire then if not State.Folder then State.Folder = Instance.new("Folder") State.Folder.Name, State.Folder.Parent = "Swift2Wireframe", Workspace end local Wire = Instance.new("WireframeHandleAdornment") Wire.Name, Wire.Adornee, Wire.Parent, Wire.ZIndex = "ChamsWireframe", Part, State.Folder, 1 Record.Wire = Wire Record.Color, Record.Opacity, Record.Thickness = nil, nil, nil end local Wire, PartOpacity = Record.Wire, WireOpacity * PartAlpha Wire.Visible, Wire.AlwaysOnTop, Wire.Scale = PartAlpha > 0, false, Part.Size if Record.Color ~= WireColor or Record.Opacity ~= PartOpacity or Record.Thickness ~= Thickness then Wire:Clear() Wire.Color3, Wire.Transparency, Wire.Thickness = WireColor, 1 - PartOpacity, Thickness Wire:AddLines(Lines) Record.Color, Record.Opacity, Record.Thickness = WireColor, PartOpacity, Thickness end elseif Record.Wire then Record.Wire:Destroy(); Record.Wire = nil end end end function Self:Destroy() for Entry in self.Entries do self:Remove(Entry) end end return Self end function Functions.Visuals.CreateTracers(Draw) local Get, Identity = Functions.Config.Get, Functions.Utility.Identity local Modules = State.Modules local Self = {Alive = true, Seen = setmetatable({}, {__mode = "k"})} function Self:Process(Weapon, Data, Dual, Silenced) if not self.Alive or not Get("Bullet Tracer", false) or type(Data) ~= "table" or self.Seen[Data] then return end local Viewmodel = Weapon and Weapon.Viewmodel local Muzzle = Viewmodel and Viewmodel:FindFirstChild(Silenced and "SilencerMuzzle" or Dual and "LeftMuzzle" or "Muzzle", true) local Start = Muzzle and (Muzzle:IsA("Attachment") and Muzzle.WorldPosition or Muzzle.Position) local Count = 0 for _, Bullet in Data do if Bullet and typeof(Bullet.EndPosition) == "Vector3" then Draw(typeof(Start) == "Vector3" and Start or Bullet.StartPosition, Bullet.EndPosition) Count += 1 end end if Count > 0 then self.Seen[Data] = true end end local function Fallback(Weapon, Frame, Inaccuracy, Spread, Seed, Impacts, Hits) local Points = {} for _, Impact in Impacts or {} do if Impact and not Impact.Knife and typeof(Impact.Position) == "Vector3" then table.insert(Points, Impact.Position) end end for _, Group in Hits or {} do for _, Hit in Group[1] and Group or {Group} do if typeof(Hit.Position) == "Vector3" then table.insert(Points, Hit.Position) end end end local Data, Random = {}, Modules.Math.UniformRandomStream(Seed) local Range = Weapon.Data.Range or 2000 for Index = 1, Weapon.Data.Bullets or 1 do local X, Y = Modules.Bullet.SpreadOffset(Weapon, Random, Inaccuracy, Spread, Index) local Direction = (Frame.LookVector + Frame.RightVector * X + Frame.UpVector * Y).Unit local Distance, Finish = 0, Frame.Position + Direction * Range for _, Point in Points do local Delta = Point - Frame.Position local Along = Delta:Dot(Direction) if Along > Distance and Along <= Range + 0.1 and (Delta - Direction * Along).Magnitude <= 0.1 then Distance, Finish = Along, Point end end table.insert(Data, {StartPosition = Frame.Position, EndPosition = Finish}) end return Data end if Modules.Bullet and type(Modules.Bullet.new) == "function" then Functions.Hooks.Add("Effects.Bullet", Modules.Bullet.new, function(Original, Character, Weapon, RenderTime, Seed, ...) local Simulation, LocalCharacter = Functions.Game.Simulation() if not Self.Alive or not Get("Bullet Tracer", false) or not Character or Character ~= LocalCharacter or Character.Simulation ~= Simulation or not Simulation or not Weapon then return Original(Character, Weapon, RenderTime, Seed, ...) end local Frame = Simulation:BuildShotCFrame(true) local Inaccuracy, Spread = Weapon:GetInaccuracy(Simulation), Weapon:GetSpread(Weapon) local Results = table.pack(Original(Character, Weapon, RenderTime, Seed, ...)) Identity(function() local Traces = Results[2] local Alternate = Weapon.Data.AltFunction local Silenced = Alternate and Alternate.Name == "Silencer" and Weapon.Mode == 2 local Dual = Weapon.Name == "Dual Berettas" and Weapon.Data.Ammo % 2 == 0 if type(Traces) == "table" and next(Traces) then Self:Process(Weapon, Traces, Dual, Silenced) else local Data = Fallback(Weapon, Frame, Inaccuracy, Spread, Seed, Results[1], Results[3]) Self:Process(Weapon, Data, Dual, Silenced) if type(Traces) == "table" then Self.Seen[Traces] = true end end end) return table.unpack(Results, 1, Results.n) end, {"Bullet Tracer"}) end function Self:Destroy() self.Alive = false table.clear(self.Seen) end return Self end local MIN_SIZE = Vector3.new(0.05,0.05,0.05) local RAIN_DEFAULT_COLOR = Color3.new(1,1,1) local RAIN_DEFAULT_TRANSPARENCY = 0 local RAIN_DEFAULT_SPEEDRATIO = 1 local RAIN_DEFAULT_INTENSITYRATIO = 1 local RAIN_DEFAULT_LIGHTEMISSION = 0.05 local RAIN_DEFAULT_LIGHTINFLUENCE = 0.9 local RAIN_DEFAULT_DIRECTION = Vector3.new(0,-1,0) local RAIN_TRANSPARENCY_T1 = .25 local RAIN_TRANSPARENCY_T2 = .75 local RAIN_SCANHEIGHT = 1000 local RAIN_EMITTER_DIM_DEFAULT = 40 local RAIN_EMITTER_DIM_MAXFORWARD = 100 local RAIN_EMITTER_UP_MODIFIER = 20 local RAIN_SOUND_ASSET = "rbxassetid://1516791621" local RAIN_SOUND_BASEVOLUME = 0.2 local RAIN_SOUND_FADEIN_TIME = 1 local RAIN_SOUND_FADEOUT_TIME = 1 local RAIN_STRAIGHT_ASSET = "rbxassetid://1822883048" local RAIN_STRAIGHT_ALPHA_LOW = 0.7 local RAIN_STRAIGHT_SIZE = NumberSequence.new(10) local RAIN_STRAIGHT_LIFETIME = NumberRange.new(0.8) local RAIN_STRAIGHT_MAX_RATE = 600 local RAIN_STRAIGHT_MAX_SPEED = 60 local RAIN_TOPDOWN_ASSET = "rbxassetid://1822856633" local RAIN_TOPDOWN_ALPHA_LOW = 0.85 local RAIN_TOPDOWN_SIZE = NumberSequence.new { NumberSequenceKeypoint.new(0, 5.33, 2.75); NumberSequenceKeypoint.new(1, 5.33, 2.75); } local RAIN_TOPDOWN_LIFETIME = NumberRange.new(0.8) local RAIN_TOPDOWN_ROTATION = NumberRange.new(0,360) local RAIN_TOPDOWN_MAX_RATE = 600 local RAIN_TOPDOWN_MAX_SPEED = 60 local RAIN_SPLASH_ASSET = "rbxassetid://1822856633" local RAIN_SPLASH_ALPHA_LOW = 0.6 local RAIN_SPLASH_SIZE = NumberSequence.new { NumberSequenceKeypoint.new(0, 0); NumberSequenceKeypoint.new(.4, 3); NumberSequenceKeypoint.new(1, 0); } local RAIN_SPLASH_LIFETIME = NumberRange.new(0.1, 0.15) local RAIN_SPLASH_ROTATION = NumberRange.new(0,360) local RAIN_SPLASH_NUM = 8 local RAIN_SPLASH_CORRECTION_Y = .5 local RAIN_SPLASH_STRAIGHT_OFFSET_Y = 50 local RAIN_NOSPLASH_STRAIGHT_OFFSET_Y_MIN = 20 local RAIN_NOSPLASH_STRAIGHT_OFFSET_Y_MAX = 100 local RAIN_OCCLUDED_MINSPEED = 70 local RAIN_OCCLUDED_MAXSPEED = 100 local RAIN_OCCLUDED_SPREAD = Vector2.new(10,10) local RAIN_OCCLUDED_MAXINTENSITY = 2 local RAIN_OCCLUDECHECK_OFFSET_Y = 500 local RAIN_OCCLUDECHECK_OFFSET_XZ_MIN = -100 local RAIN_OCCLUDECHECK_OFFSET_XZ_MAX = 100 local RAIN_OCCLUDECHECK_SCAN_Y = 550 local RAIN_UPDATE_PERIOD = 6 local RAIN_VOLUME_SCAN_RADIUS = 35 local RAIN_VOLUME_SCAN_GRID = { Vector3.new(0.141421363, 0, 0.141421363); Vector3.new(-0.141421363, 0, 0.141421363); Vector3.new(-0.141421363, 0, -0.141421363); Vector3.new(0.141421363, 0, -0.141421363); Vector3.new(0.400000006, 0, 0); Vector3.new(0.282842726, 0, 0.282842726); Vector3.new(2.44929371e-17, 0, 0.400000006); Vector3.new(-0.282842726, 0, 0.282842726); Vector3.new(-0.400000006, 0, 4.89858741e-17); Vector3.new(-0.282842726, 0, -0.282842726); Vector3.new(-7.34788045e-17, 0, -0.400000006); Vector3.new(0.282842726, 0, -0.282842726); Vector3.new(0.600000024, 0, 0); Vector3.new(0.485410213, 0, 0.352671146); Vector3.new(0.185410202, 0, 0.570633948); Vector3.new(-0.185410202, 0, 0.570633948); Vector3.new(-0.485410213, 0, 0.352671146); Vector3.new(-0.600000024, 0, 7.34788112e-17); Vector3.new(-0.485410213, 0, -0.352671146); Vector3.new(-0.185410202, 0, -0.570633948); Vector3.new(0.185410202, 0, -0.570633948); Vector3.new(0.485410213, 0, -0.352671146); Vector3.new(0.772740662, 0, 0.207055241); Vector3.new(0.565685451, 0, 0.565685451); Vector3.new(0.207055241, 0, 0.772740662); Vector3.new(-0.207055241, 0, 0.772740662); Vector3.new(-0.565685451, 0, 0.565685451); Vector3.new(-0.772740662, 0, 0.207055241); Vector3.new(-0.772740662, 0, -0.207055241); Vector3.new(-0.565685451, 0, -0.565685451); Vector3.new(-0.207055241, 0, -0.772740662); Vector3.new(0.207055241, 0, -0.772740662); Vector3.new(0.565685451, 0, -0.565685451); Vector3.new(0.772740662, 0, -0.207055241); } local CollisionMode = { None = 0; Whitelist = 1; Blacklist = 2; Function = 3; } local Services = State.Services local Workspace = Services.Workspace or game:GetService("Workspace") local Players = Services.Players or game:GetService("Players") local TweenService = Services.TweenService or game:GetService("TweenService") local RunService = Services.RunService or game:GetService("RunService") local SoundService = Services.SoundService or game:GetService("SoundService") local Destroyed = false local RadiusScale = 1 local PersistentConnections, Tweens = {}, {} local function StopTween(Target) local Entry = Tweens[Target] if not Entry then return end Tweens[Target] = nil if Entry.Connection then Entry.Connection:Disconnect() end Entry.Tween:Cancel() Entry.Tween:Destroy() end local function PlayTween(Target, Info, Properties, Complete) if Destroyed then return end StopTween(Target) local Tween = TweenService:Create(Target, Info, Properties) local Entry = {Tween = Tween} Tweens[Target] = Entry Entry.Connection = Tween.Completed:Connect(function(Status) if Tweens[Target] ~= Entry then return end Tweens[Target] = nil Entry.Connection:Disconnect() Tween:Destroy() if not Destroyed and Status == Enum.PlaybackState.Completed and Complete then Complete() end end) Tween:Play() end local function Number(Value) return type(Value) == "number" and Value == Value and math.abs(Value) < math.huge end local SplashRatio = 1 local GlobalModifier = Instance.new("NumberValue") GlobalModifier.Value = 1 local connections = {} local disabled = true local rainDirection = RAIN_DEFAULT_DIRECTION local currentCeiling = nil local roofCheck = false local collisionMode = CollisionMode.None local collisionList = nil local collisionFunc = nil local straightLowAlpha = 1 local topdownLowAlpha = 1 local intensityOccludedRain = 0 local numSplashes = 0 local volumeTarget = 0 local v3 = Vector3.new local NSK010 = NumberSequenceKeypoint.new(0, 1, 0) local NSK110 = NumberSequenceKeypoint.new(1, 1, 0) local volumeScanGrid = {} for _,v in pairs(RAIN_VOLUME_SCAN_GRID) do table.insert(volumeScanGrid, v * RAIN_VOLUME_SCAN_RADIUS) end table.sort(volumeScanGrid, function(a,b) return a.magnitude < b.magnitude end) local SoundGroup = Instance.new("SoundGroup") SoundGroup.Name = "__RainSoundGroup" SoundGroup.Volume = RAIN_SOUND_BASEVOLUME SoundGroup.Archivable = false local Sound = Instance.new("Sound") Sound.Name = "RainSound" Sound.Volume = volumeTarget Sound.SoundId = RAIN_SOUND_ASSET Sound.Looped = true Sound.SoundGroup = SoundGroup Sound.Parent = SoundGroup Sound.Archivable = false local Emitter do Emitter = Instance.new("Part") Emitter.Transparency = 1 Emitter.Anchored = true Emitter.CanCollide = false Emitter.CanTouch = false Emitter.CanQuery = false Emitter.CastShadow = false Emitter.Locked = false Emitter.Archivable = false Emitter.TopSurface = Enum.SurfaceType.Smooth Emitter.BottomSurface = Enum.SurfaceType.Smooth Emitter.Name = "__RainEmitter" Emitter.Size = MIN_SIZE Emitter.Archivable = false local straight = Instance.new("ParticleEmitter") straight.Name = "RainStraight" straight.LightEmission = RAIN_DEFAULT_LIGHTEMISSION straight.LightInfluence = RAIN_DEFAULT_LIGHTINFLUENCE straight.Size = RAIN_STRAIGHT_SIZE straight.Texture = RAIN_STRAIGHT_ASSET straight.LockedToPart = true straight.Enabled = false straight.Lifetime = RAIN_STRAIGHT_LIFETIME straight.Rate = RAIN_STRAIGHT_MAX_RATE straight.Speed = NumberRange.new(RAIN_STRAIGHT_MAX_SPEED) straight.EmissionDirection = Enum.NormalId.Bottom straight.Parent = Emitter straight.Orientation = Enum.ParticleOrientation.FacingCameraWorldUp local topdown = Instance.new("ParticleEmitter") topdown.Name = "RainTopDown" topdown.LightEmission = RAIN_DEFAULT_LIGHTEMISSION topdown.LightInfluence = RAIN_DEFAULT_LIGHTINFLUENCE topdown.Size = RAIN_TOPDOWN_SIZE topdown.Texture = RAIN_TOPDOWN_ASSET topdown.LockedToPart = true topdown.Enabled = false topdown.Rotation = RAIN_TOPDOWN_ROTATION topdown.Lifetime = RAIN_TOPDOWN_LIFETIME topdown.Rate = RAIN_TOPDOWN_MAX_RATE topdown.Speed = NumberRange.new(RAIN_TOPDOWN_MAX_SPEED) topdown.EmissionDirection = Enum.NormalId.Bottom topdown.Orientation = Enum.ParticleOrientation.FacingCamera topdown.Parent = Emitter end local splashAttachments, rainAttachments do splashAttachments = {} rainAttachments = {} for i = 1, RAIN_SPLASH_NUM do local splashAttachment = Instance.new("Attachment") splashAttachment.Name = "__RainSplashAttachment" local splash = Instance.new("ParticleEmitter") splash.LightEmission = RAIN_DEFAULT_LIGHTEMISSION splash.LightInfluence = RAIN_DEFAULT_LIGHTINFLUENCE splash.Size = RAIN_SPLASH_SIZE splash.Texture = RAIN_SPLASH_ASSET splash.Rotation = RAIN_SPLASH_ROTATION splash.Lifetime = RAIN_SPLASH_LIFETIME splash.Transparency = NumberSequence.new { NSK010; NumberSequenceKeypoint.new(RAIN_TRANSPARENCY_T1, RAIN_SPLASH_ALPHA_LOW, 0); NumberSequenceKeypoint.new(RAIN_TRANSPARENCY_T2, RAIN_SPLASH_ALPHA_LOW, 0); NSK110; } splash.Enabled = false splash.Rate = 0 splash.Speed = NumberRange.new(0) splash.Name = "RainSplash" splash.Parent = splashAttachment splashAttachment.Archivable = false table.insert(splashAttachments, splashAttachment) local rainAttachment = Instance.new("Attachment") rainAttachment.Name = "__RainOccludedAttachment" local straightOccluded = Emitter.RainStraight:Clone() straightOccluded.Speed = NumberRange.new(RAIN_OCCLUDED_MINSPEED, RAIN_OCCLUDED_MAXSPEED) straightOccluded.SpreadAngle = RAIN_OCCLUDED_SPREAD straightOccluded.LockedToPart = false straightOccluded.Enabled = false straightOccluded.Parent = rainAttachment local topdownOccluded = Emitter.RainTopDown:Clone() topdownOccluded.Speed = NumberRange.new(RAIN_OCCLUDED_MINSPEED, RAIN_OCCLUDED_MAXSPEED) topdownOccluded.SpreadAngle = RAIN_OCCLUDED_SPREAD topdownOccluded.LockedToPart = false topdownOccluded.Enabled = false topdownOccluded.Parent = rainAttachment rainAttachment.Archivable = false table.insert(rainAttachments, rainAttachment) end end local ignoreEmitterList = { Emitter } local collisionParameters = RaycastParams.new() collisionParameters.FilterType = Enum.RaycastFilterType.Exclude collisionParameters.RespectCanCollide = false local function Cast(RayValue, FilterType, Filter) collisionParameters.FilterType = FilterType collisionParameters.FilterDescendantsInstances = Filter local Hit = Workspace:Raycast(RayValue.Origin, RayValue.Direction, collisionParameters) if Hit then return Hit.Instance, Hit.Position, Hit.Normal, Hit.Material end end local raycastFunctions = { [CollisionMode.None] = function(RayValue, IgnoreCharacter) local Filter = {Emitter} local Character = IgnoreCharacter and Players.LocalPlayer and Players.LocalPlayer.Character if Character then table.insert(Filter, Character) end return Cast(RayValue, Enum.RaycastFilterType.Exclude, Filter) end, [CollisionMode.Blacklist] = function(RayValue) return Cast(RayValue, Enum.RaycastFilterType.Exclude, collisionList) end, [CollisionMode.Whitelist] = function(RayValue) return Cast(RayValue, Enum.RaycastFilterType.Include, collisionList) end, [CollisionMode.Function] = function(RayValue) local Filter = {Emitter} for _ = 1, 32 do local Part, Position, Normal, Material = Cast(RayValue, Enum.RaycastFilterType.Exclude, Filter) if not Part or collisionFunc(Part) then return Part, Position, Normal, Material end table.insert(Filter, Part) end end, } local raycast = raycastFunctions[collisionMode] local function connectLoop() local rand = Random.new() local inside = true local frame = RAIN_UPDATE_PERIOD local roofBlocked = false table.insert(connections, RunService.RenderStepped:Connect(function() if Destroyed then return end local Camera = Workspace.CurrentCamera if not Camera then StopTween(Sound) Emitter.RainStraight.Enabled, Emitter.RainTopDown.Enabled = false, false Emitter.RainStraight:Clear() Emitter.RainTopDown:Clear() Emitter.Parent = nil Sound.Volume, volumeTarget = 0, 0 return end if Emitter.Parent ~= Camera then Emitter.RainStraight:Clear() Emitter.RainTopDown:Clear() Emitter.Parent = Camera end local t = math.abs(Workspace.CurrentCamera.CFrame.lookVector:Dot(rainDirection)) local center = Workspace.CurrentCamera.CFrame.p local right = Workspace.CurrentCamera.CFrame.lookVector:Cross(-rainDirection) right = right.magnitude > 0.001 and right.unit or rainDirection:Cross(math.abs(rainDirection.X) < 0.9 and v3(1, 0, 0) or v3(0, 0, 1)).unit local forward = rainDirection:Cross(right).unit Emitter.Size = v3( RAIN_EMITTER_DIM_DEFAULT * RadiusScale, RAIN_EMITTER_DIM_DEFAULT * RadiusScale, (RAIN_EMITTER_DIM_DEFAULT + (1 - t)*(RAIN_EMITTER_DIM_MAXFORWARD - RAIN_EMITTER_DIM_DEFAULT)) * RadiusScale ) Emitter.CFrame = CFrame.new( center.x, center.y, center.z, right.x, -rainDirection.x, forward.x, right.y, -rainDirection.y, forward.y, right.z, -rainDirection.z, forward.z ) + (1 - t) * Workspace.CurrentCamera.CFrame.lookVector * Emitter.Size.Z/3 - t * rainDirection * RAIN_EMITTER_UP_MODIFIER * RadiusScale local part = roofCheck and raycast(Ray.new(Workspace.CurrentCamera.CFrame.p, v3(0, RAIN_SCANHEIGHT, 0)), true) if not roofCheck or (not currentCeiling or Workspace.CurrentCamera.CFrame.p.y <= currentCeiling) and not part then if volumeTarget < 1 and not disabled then volumeTarget = 1 PlayTween(Sound, TweenInfo.new(.5), {Volume = 1}) end frame = RAIN_UPDATE_PERIOD Emitter.RainStraight.Enabled = true Emitter.RainTopDown.Enabled = true inside = false roofBlocked = false else Emitter.RainStraight.Enabled = false Emitter.RainTopDown.Enabled = false inside = true if roofCheck and not roofBlocked then roofBlocked = true Emitter.RainStraight:Clear() Emitter.RainTopDown:Clear() for _, Attachment in rainAttachments do Attachment.RainStraight:Clear() Attachment.RainTopDown:Clear() end for _, Attachment in splashAttachments do Attachment.RainSplash:Clear() end volumeTarget = 0.2 PlayTween(Sound, TweenInfo.new(0.3), {Volume = volumeTarget}) end end end)) local signal = RunService:IsRunning() and RunService.Stepped or RunService.RenderStepped table.insert(connections, signal:Connect(function() if Destroyed or not Workspace.CurrentCamera then return end if roofCheck and inside then return end frame = frame + 1 if frame >= RAIN_UPDATE_PERIOD then local t = math.abs(Workspace.CurrentCamera.CFrame.lookVector:Dot(rainDirection)) local straightSequence = NumberSequence.new { NSK010; NumberSequenceKeypoint.new(RAIN_TRANSPARENCY_T1, (1 - t)*straightLowAlpha + t, 0); NumberSequenceKeypoint.new(RAIN_TRANSPARENCY_T2, (1 - t)*straightLowAlpha + t, 0); NSK110; } local topdownSequence = NumberSequence.new { NSK010; NumberSequenceKeypoint.new(RAIN_TRANSPARENCY_T1, t*topdownLowAlpha + (1 - t), 0); NumberSequenceKeypoint.new(RAIN_TRANSPARENCY_T2, t*topdownLowAlpha + (1 - t), 0); NSK110; } local mapped = Workspace.CurrentCamera.CFrame:inverse() * (Workspace.CurrentCamera.CFrame.p - rainDirection) local straightRotation = NumberRange.new(math.deg(math.atan2(-mapped.x, mapped.y))) if inside then for _,v in pairs(rainAttachments) do v.RainStraight.Transparency = straightSequence v.RainStraight.Rotation = straightRotation v.RainTopDown.Transparency = topdownSequence end if not disabled then local volume = 0 if (not currentCeiling or Workspace.CurrentCamera.CFrame.p.y <= currentCeiling) then local minDistance = RAIN_VOLUME_SCAN_RADIUS local rayDirection = -rainDirection * RAIN_SCANHEIGHT for i = 1, #volumeScanGrid do if not raycast(Ray.new(Workspace.CurrentCamera.CFrame * volumeScanGrid[i], rayDirection), true) then minDistance = volumeScanGrid[i].magnitude break end end volume = 1 - minDistance / RAIN_VOLUME_SCAN_RADIUS end if math.abs(volume - volumeTarget) > .01 then volumeTarget = volume PlayTween(Sound, TweenInfo.new(1), {Volume = volumeTarget}) end end else Emitter.RainStraight.Transparency = straightSequence Emitter.RainStraight.Rotation = straightRotation Emitter.RainTopDown.Transparency = topdownSequence end frame = 0 end local center = Workspace.CurrentCamera.CFrame.p local right = Workspace.CurrentCamera.CFrame.lookVector:Cross(-rainDirection) right = right.magnitude > 0.001 and right.unit or rainDirection:Cross(math.abs(rainDirection.X) < 0.9 and v3(1, 0, 0) or v3(0, 0, 1)).unit local forward = rainDirection:Cross(right).unit local transform = CFrame.new( center.x, center.y, center.z, right.x, -rainDirection.x, forward.x, right.y, -rainDirection.y, forward.y, right.z, -rainDirection.z, forward.z ) local rayDirection = rainDirection * RAIN_OCCLUDECHECK_SCAN_Y for i = 1, math.floor(numSplashes * (inside and 1 or SplashRatio)) do local splashAttachment = splashAttachments[i] local rainAttachment = rainAttachments[i] local x = rand:NextNumber(RAIN_OCCLUDECHECK_OFFSET_XZ_MIN * RadiusScale, RAIN_OCCLUDECHECK_OFFSET_XZ_MAX * RadiusScale) local z = rand:NextNumber(RAIN_OCCLUDECHECK_OFFSET_XZ_MIN * RadiusScale, RAIN_OCCLUDECHECK_OFFSET_XZ_MAX * RadiusScale) local part, position, normal if inside or SplashRatio > 0 then part, position, normal = raycast(Ray.new(transform * v3(x, RAIN_OCCLUDECHECK_OFFSET_Y, z), rayDirection)) end if part then splashAttachment.Position = position + normal * RAIN_SPLASH_CORRECTION_Y if SplashRatio > 0 then splashAttachment.RainSplash:Emit(1) end if inside then local corrected = position - rainDirection * RAIN_SPLASH_STRAIGHT_OFFSET_Y if currentCeiling and corrected.Y > currentCeiling and rainDirection.Y < 0 then corrected = corrected + rainDirection * (currentCeiling - corrected.Y) / rainDirection.Y end rainAttachment.CFrame = transform - transform.p + corrected rainAttachment.RainStraight:Emit(intensityOccludedRain) rainAttachment.RainTopDown:Emit(intensityOccludedRain) end elseif inside then local corrected = transform * v3(x, rand:NextNumber(RAIN_NOSPLASH_STRAIGHT_OFFSET_Y_MIN, RAIN_NOSPLASH_STRAIGHT_OFFSET_Y_MAX), z) if currentCeiling and corrected.Y > currentCeiling and rainDirection.Y < 0 then corrected = corrected + rainDirection * (currentCeiling - corrected.Y) / rainDirection.Y end rainAttachment.CFrame = transform - transform.p + corrected rainAttachment.RainStraight:Emit(intensityOccludedRain) rainAttachment.RainTopDown:Emit(intensityOccludedRain) end end end)) end local function disconnectLoop() if #connections > 0 then for _,v in pairs(connections) do v:Disconnect() end connections = {} end end local function ClearParticles() Emitter.RainStraight.Enabled, Emitter.RainTopDown.Enabled = false, false Emitter.RainStraight:Clear() Emitter.RainTopDown:Clear() for _, Attachment in rainAttachments do Attachment.RainStraight:Clear() Attachment.RainTopDown:Clear() end for _, Attachment in splashAttachments do Attachment.RainSplash:Clear() end end local function disable() disconnectLoop() ClearParticles() Emitter.Size, Emitter.Parent = MIN_SIZE, nil for _, Attachment in rainAttachments do Attachment.Parent = nil end for _, Attachment in splashAttachments do Attachment.Parent = nil end end local function makeProperty(valueObjectClass, defaultValue, setter) local valueObject = Instance.new(valueObjectClass) if defaultValue then valueObject.Value = defaultValue end table.insert(PersistentConnections, valueObject.Changed:Connect(function(Value) if not Destroyed then setter(Value) end end)) setter(valueObject.Value) return valueObject end local Color = makeProperty("Color3Value", RAIN_DEFAULT_COLOR, function(value) local value = ColorSequence.new(value) Emitter.RainStraight.Color = value Emitter.RainTopDown.Color = value for _,v in pairs(splashAttachments) do v.RainSplash.Color = value end for _,v in pairs(rainAttachments) do v.RainStraight.Color = value v.RainTopDown.Color = value end end) local function updateTransparency(value) local opacity = (1 - value) * (1 - GlobalModifier.Value) local transparency = 1 - opacity straightLowAlpha = RAIN_STRAIGHT_ALPHA_LOW * opacity + transparency topdownLowAlpha = RAIN_TOPDOWN_ALPHA_LOW * opacity + transparency local splashSequence = NumberSequence.new { NSK010; NumberSequenceKeypoint.new(RAIN_TRANSPARENCY_T1, opacity*RAIN_SPLASH_ALPHA_LOW + transparency, 0); NumberSequenceKeypoint.new(RAIN_TRANSPARENCY_T2, opacity*RAIN_SPLASH_ALPHA_LOW + transparency, 0); NSK110; } for _,v in pairs(splashAttachments) do v.RainSplash.Transparency = splashSequence end end local Transparency = makeProperty("NumberValue", RAIN_DEFAULT_TRANSPARENCY, updateTransparency) table.insert(PersistentConnections, GlobalModifier.Changed:Connect(function() if not Destroyed then updateTransparency(Transparency.Value) end end)) local SpeedRatio = makeProperty("NumberValue", RAIN_DEFAULT_SPEEDRATIO, function(value) Emitter.RainStraight.Speed = NumberRange.new(value * RAIN_STRAIGHT_MAX_SPEED) Emitter.RainTopDown.Speed = NumberRange.new(value * RAIN_TOPDOWN_MAX_SPEED) end) local IntensityRatio = makeProperty("NumberValue", RAIN_DEFAULT_INTENSITYRATIO, function(value) Emitter.RainStraight.Rate = RAIN_STRAIGHT_MAX_RATE * value Emitter.RainTopDown.Rate = RAIN_TOPDOWN_MAX_RATE * value intensityOccludedRain = math.ceil(RAIN_OCCLUDED_MAXINTENSITY * value) numSplashes = math.floor(RAIN_SPLASH_NUM * value) end) local LightEmission = makeProperty("NumberValue", RAIN_DEFAULT_LIGHTEMISSION, function(value) Emitter.RainStraight.LightEmission = value Emitter.RainTopDown.LightEmission = value for _,v in pairs(rainAttachments) do v.RainStraight.LightEmission = value v.RainTopDown.LightEmission = value end for _,v in pairs(splashAttachments) do v.RainSplash.LightEmission = value end end) local LightInfluence = makeProperty("NumberValue", RAIN_DEFAULT_LIGHTINFLUENCE, function(value) Emitter.RainStraight.LightInfluence = value Emitter.RainTopDown.LightInfluence = value for _,v in pairs(rainAttachments) do v.RainStraight.LightInfluence = value v.RainTopDown.LightInfluence = value end for _,v in pairs(splashAttachments) do v.RainSplash.LightInfluence = value end end) local RainDirection = makeProperty("Vector3Value", RAIN_DEFAULT_DIRECTION, function(value) if value.magnitude > 0.001 then rainDirection = value.unit end end) local Rain = {} Rain.CollisionMode = CollisionMode local function ValidTween(Info) return Info == nil or typeof(Info) == "TweenInfo" end local function SetValue(Target, Key, Value, Info) StopTween(Target) if Info then PlayTween(Target, Info, {[Key] = Value}) else Target[Key] = Value end end function Rain:Enable(Info) if Destroyed or not ValidTween(Info) then return end disconnectLoop() StopTween(GlobalModifier) StopTween(Sound) disabled = false volumeTarget = 0 Sound.Volume = 0 Emitter.Parent = Workspace.CurrentCamera Emitter.RainStraight.Enabled, Emitter.RainTopDown.Enabled = false, false for Index = 1, RAIN_SPLASH_NUM do splashAttachments[Index].Parent = Workspace.Terrain rainAttachments[Index].Parent = Workspace.Terrain end SoundGroup.Parent = SoundService SetValue(GlobalModifier, "Value", 0, Info) if not Sound.Playing then Sound:Play() if Sound.TimeLength > 0 then Sound.TimePosition = math.random() * Sound.TimeLength end end connectLoop() end function Rain:Disable(Info) if Destroyed or not ValidTween(Info) then return end disabled = true volumeTarget = 0 disconnectLoop() StopTween(GlobalModifier) StopTween(Sound) if Info then PlayTween(GlobalModifier, Info, {Value = 1}, disable) PlayTween(Sound, Info, {Volume = 0}, function() Sound:Stop() end) else GlobalModifier.Value = 1 Sound.Volume = 0 Sound:Stop() disable() end end function Rain:SetColor(Value, Info) if Destroyed or typeof(Value) ~= "Color3" or not ValidTween(Info) then return end SetValue(Color, "Value", Value, Info) end local function RatioSetter(Target) local function Setter(_, Value, Info) if Destroyed or not Number(Value) or not ValidTween(Info) then return end SetValue(Target, "Value", math.clamp(Value, 0, 1), Info) end return Setter end Rain.SetTransparency = RatioSetter(Transparency) Rain.SetSpeedRatio = RatioSetter(SpeedRatio) Rain.SetIntensityRatio = RatioSetter(IntensityRatio) Rain.SetLightEmission = RatioSetter(LightEmission) Rain.SetLightInfluence = RatioSetter(LightInfluence) function Rain:SetVolume(Value, Info) if Destroyed or not Number(Value) or not ValidTween(Info) then return end SetValue(SoundGroup, "Volume", math.clamp(Value, 0, 1), Info) end function Rain:SetDirection(Value, Info) if Destroyed or typeof(Value) ~= "Vector3" or not ValidTween(Info) then return end if not Number(Value.Magnitude) or Value.Magnitude < 0.001 then return end SetValue(RainDirection, "Value", Value.Unit, Info) end function Rain:SetCeiling(Value) if Destroyed or Value ~= nil and not Number(Value) then return end currentCeiling = Value end function Rain:SetStraightTexture(Value) if Destroyed or type(Value) ~= "string" then return end Emitter.RainStraight.Texture = Value for _, Attachment in rainAttachments do Attachment.RainStraight.Texture = Value end end function Rain:SetTopDownTexture(Value) if Destroyed or type(Value) ~= "string" then return end Emitter.RainTopDown.Texture = Value for _, Attachment in rainAttachments do Attachment.RainTopDown.Texture = Value end end function Rain:SetSplashTexture(Value) if Destroyed or type(Value) ~= "string" then return end for _, Attachment in splashAttachments do Attachment.RainSplash.Texture = Value end end function Rain:SetSoundId(Value) if Destroyed or type(Value) ~= "string" then return end Sound.SoundId = Value end function Rain:SetCollisionMode(Mode, Value) if Destroyed or not raycastFunctions[Mode] then return end local Filter, Test if Mode == CollisionMode.Blacklist or Mode == CollisionMode.Whitelist then if typeof(Value) == "Instance" then Filter = {Value} elseif type(Value) == "table" then Filter = {} for _, Object in Value do if typeof(Object) ~= "Instance" then return end table.insert(Filter, Object) end else return end if Mode == CollisionMode.Blacklist then table.insert(Filter, Emitter) end elseif Mode == CollisionMode.Function then if type(Value) ~= "function" then return end Test = Value end collisionMode, collisionList, collisionFunc = Mode, Filter, Test raycast = raycastFunctions[Mode] end function Rain:SetRoofCheck(Value) if Destroyed then return end roofCheck = Value == true end function Rain:SetSplashRatio(Value) if Destroyed or not Number(Value) then return end SplashRatio = math.clamp(Value, 0, 1) if SplashRatio == 0 then for _, Attachment in splashAttachments do Attachment.RainSplash:Clear() end end end function Rain:SetRadius(Value) if Destroyed or not Number(Value) then return end RadiusScale = math.clamp(Value, 24, 80) / 48 end function Rain:Destroy() if Destroyed then return end Destroyed, disabled = true, true disconnectLoop() for Target in Tweens do StopTween(Target) end for _, Connection in PersistentConnections do Connection:Disconnect() end table.clear(PersistentConnections) Sound:Stop() ClearParticles() for _, Attachment in splashAttachments do Attachment:Destroy() end for _, Attachment in rainAttachments do Attachment:Destroy() end Emitter:Destroy() SoundGroup:Destroy() for _, Value in {GlobalModifier, Color, Transparency, SpeedRatio, IntensityRatio, LightEmission, LightInfluence, RainDirection} do Value:Destroy() end table.clear(splashAttachments) table.clear(rainAttachments) end Rain.Notice = Notice Rain.License = License return Rain end do local Config, Utility = Functions.Config, Functions.Utility local Identity, Connect, Notify = Utility.Identity, Utility.Connect, Utility.Notify local Color = Config.Color local function Get(Name, Default) local WeaponName = Name:match('^(.*) Skin$') if WeaponName then local Entry = State.UI.Skins:GetSkin(WeaponName) if Entry then return Entry.Skin.Name end end return Config.Get(Name, Default) end local Managers = State.Shared:WaitForChild("Managers") local WeaponManager = Managers:WaitForChild("WeaponManager") local SkinManager = Managers:WaitForChild("SkinManager") local Self = {Available = {}, Types = {}, KnifeModels = {"Default"}, Original = setmetatable({}, {__mode = "k"}), Replacement = nil, Errors = {}} local CatalogueOkay, Catalogue = Identity(function() return State.Modules.SkinManager.GetAllSkins and State.Modules.SkinManager.GetAllSkins() or {} end, 2) Self.CatalogueLoaded = CatalogueOkay and type(Catalogue) == "table" and type(State.Modules.SkinManager.GetAllSkins) == "function" Self.CatalogueError = not CatalogueOkay and tostring(Catalogue):sub(1, 300) or nil Catalogue = CatalogueOkay and type(Catalogue) == "table" and Catalogue or {} Self.Updates = 0 for _, Category in SkinManager:GetChildren() do if Category:IsA("Folder") and Category.Name ~= "Arms" and Category.Name ~= "Misc" then table.insert(Self.Types, Category.Name) Self.Available[Category.Name] = {} for _, Weapon in Category:GetChildren() do local Skins = {} if Catalogue[Weapon.Name] then for Name in Catalogue[Weapon.Name] do table.insert(Skins, Name) end else for _, Skin in Weapon:GetChildren() do if Skin:IsA("Configuration") then table.insert(Skins, Skin.Name) end end end table.sort(Skins) Self.Available[Category.Name][Weapon.Name] = Skins end end end table.sort(Self.Types) local Knives = WeaponManager:WaitForChild("Knives") for _, Knife in Knives:GetChildren() do if Knife:IsA("ModuleScript") then table.insert(Self.KnifeModels, Knife.Name) end end table.sort(Self.KnifeModels) if State.UI.KnifeModel then State.UI.KnifeModel:SetOptions(Self.KnifeModels) end local Definitions = Functions.Cosmetics.Catalog local Categories = {} for _, Definition in Definitions do local Category = Categories[Definition.Category] if not Category then Category = State.UI.Skins:AddCategory({Name = Definition.Category}); Categories[Definition.Category] = Category end local NativeWeapon = State.Modules.WeaponManager.Get(Definition.Name) local Information = NativeWeapon and NativeWeapon.GuiInformation local Icon = Information and (Information.IconHorizontal or Information.Icon) or Definition.Icon local Skins = {} local NativeSkins = Catalogue[Definition.Name] local function Add(Name, Data) if Name == "Stock" then return end local Thumbnail = Data.Thumbnail or Data.Image table.insert(Skins, {Name = Name, Rarity = Data.Rarity or "Stock", Image = Thumbnail and "rbxassetid://" .. tostring(Thumbnail) or nil}) end if NativeSkins then for Name, Data in NativeSkins do Add(Name, Data) end else for _, Data in Definition.Skins do Add(Data.Name, Data) end end table.sort(Skins, function(A, B) return A.Name < B.Name end) local WeaponName = Definition.Name Category:AddWeapon({Name = WeaponName, Icon = Icon and "rbxassetid://" .. tostring(Icon) or nil, Skins = Skins, Elements = function(Container) local Prefix = "Skin " .. WeaponName .. " " local Emissive = Container:AddToggle({Text = "Emissive", Flag = Prefix .. "Emissive", Default = false}) Emissive:AddColorPicker({Text = "Tint", Flag = Prefix .. "Tint", Default = Color3.new(1, 1, 1)}) Emissive:Settings():AddSlider({Text = "Strength", Flag = Prefix .. "Strength", Min = 0, Max = 20, Default = 1, Increment = 0.1}) end}) end local function Emissive(Name, Default) local Entry = State.UI.Skins:GetSkin(Name) local Settings = Entry and Entry.Settings local Prefix = "Skin " .. Name .. " " if not Settings or not Settings[Prefix .. "Emissive"] then return Default end local Tint = Settings[Prefix .. "Tint"] if type(Tint) == "table" then Tint = Tint.Color end if type(Tint) == "string" then local Okay, Value = pcall(Color3.fromHex, Tint); Tint = Okay and Value or nil end return {Tint = typeof(Tint) == "Color3" and Tint or Color3.new(1, 1, 1), Strength = math.clamp(tonumber(Settings[Prefix .. "Strength"]) or 1, 0, 20)} end local function ClearSurface(Part) for _, Child in Part:GetChildren() do if Child:IsA("SurfaceAppearance") then Child:Destroy() end end end local function SaveParts(Model, Parts) if State.LocalChams then State.LocalChams:RestoreModel(Model) end Parts = Parts or {} for _, Part in Model:GetDescendants() do if Part:IsA("MeshPart") and not Parts[Part] then local Surfaces = {} for _, Child in Part:GetChildren() do if Child:IsA("SurfaceAppearance") then table.insert(Surfaces, Child:Clone()) end end Parts[Part] = {Texture = Part.TextureID, Surfaces = Surfaces} end end return Parts end local function RestorePart(Part, Original) if State.LocalChams then State.LocalChams:RestoreModel(Part) end ClearSurface(Part) Part.TextureID = Original.Texture local Surfaces = {} for _, Surface in Original.Surfaces do local Clone = Surface:Clone() Clone.Parent = Part table.insert(Surfaces, Clone) end return {Texture = Part.TextureID, Surfaces = Surfaces} end local function RestoreParts(Parts) for Part, Original in Parts do if Part.Parent then RestorePart(Part, Original) end for _, Surface in Original.Surfaces do Surface:Destroy() end end end local function GetSkin(Name, Skin) local Manager = State.Modules.SkinManager if not Manager or type(Manager.GetWeaponSkin) ~= "function" then Self.LookupError = "Skin lookup API is unavailable" return nil end local Okay, Data = pcall(Manager.GetWeaponSkin, Name, Skin) if not Okay then Self.LookupError = tostring(Data):sub(1, 300) end return Okay and Data or nil end function Self:ResolveSkin(Name, Selected) if Selected and GetSkin(Name, Selected) then return Selected end if Selected == nil or Selected == "Stock" or Selected == "Default" then if GetSkin(Name, "Stock") then return "Stock" end if GetSkin(Name, "Vanilla") then return "Vanilla" end end return Selected end State.SkinController = Self local function ApplyModel(Model, Name, Skin, Parts, Emissive) local Data = GetSkin(Name, Skin) if not Data then return false end SaveParts(Model, Parts) local Targets = {} for _, Part in Model:GetDescendants() do if Part:IsA("MeshPart") then local Surface = Data.Assets and Data.Assets[Part.Name] local Texture = Data.WorldModel and Data.WorldModel[Part.Name] if Surface and Surface:IsA("SurfaceAppearance") then Targets[Part] = {Surface = Surface} elseif Texture and Texture:IsA("StringValue") then Targets[Part] = {Texture = Texture.Value} end end end if not next(Targets) then return false end local Applied = {} for Part, Original in Parts do if Part.Parent and not Targets[Part] then Applied[Part] = RestorePart(Part, Original) end end for Part, Target in Targets do if Target.Surface then ClearSurface(Part) Part.TextureID = "" local Clone = Target.Surface:Clone() if Emissive then Clone.EmissiveTint, Clone.EmissiveStrength = Emissive.Tint, Emissive.Strength end if Data.AnimatedTint and State.Modules.Viewmodel.ApplyAnimatedTint then pcall(State.Modules.Viewmodel.ApplyAnimatedTint, Clone, Data.AnimatedTint) end Clone.Parent = Part Applied[Part] = {Texture = "", Surfaces = {Clone}} else ClearSurface(Part) Part.TextureID = Target.Texture Applied[Part] = {Texture = Target.Texture, Surfaces = {}} end end return true, Applied end local function Matches(Record) if not Record.Applied or not next(Record.Applied) then return false end if Record.Model then for _, Part in Record.Model:GetDescendants() do if Part:IsA("MeshPart") and not Record.Applied[Part] then return false end end end for Part, Expected in Record.Applied do local Chams = State.LocalChams local Texture = Chams and Chams:ReadOriginal(Part, "TextureID") or Part.TextureID if not Part.Parent or Texture ~= Expected.Texture then return false end for _, Surface in Expected.Surfaces do local Parent = Chams and Chams:ReadOriginal(Surface, "Parent") or Surface.Parent if Parent ~= Part then return false end end local Count = Chams and Chams:SurfaceCount(Part) or 0 if not Chams then for _, Child in Part:GetChildren() do if Child:IsA("SurfaceAppearance") then Count += 1 end end end if Count ~= #Expected.Surfaces then return false end end return true end local function RestoreWeapon(Weapon, Record) RestoreParts(Record.Parts) if Weapon and Weapon.Viewmodel == Record.Viewmodel and Record.Model.Parent == Record.Viewmodel and Weapon.Skin == Record.Selected then Weapon.Skin = Record.Skin Weapon.AnimatedTintAction = nil end Self.Original[Weapon] = nil end local function Report(Key, Message) Self.LastError = tostring(Message):sub(1, 300) if Self.Errors[Key] then return end Self.Errors[Key] = true if State.Notify then Notify(Message, "Warning") end end function Self:Diagnostics() local Result = { Enabled = Get("Skin Changer", false), Updates = self.Updates, CatalogueLoaded = self.CatalogueLoaded, Categories = #self.Types, CatalogueError = self.CatalogueError, KnifeModel = Get("Knife Model", "Default"), LastError = self.LastError, LookupError = self.LookupError, } local Okay, Error = Identity(function() local Manager = State.Modules.Weapon local Weapon = Manager.GetCurrentWeapon() local Count = 0 for _, Item in Manager.GetWeaponInventory() or {} do if Item then Count += 1 end end Result.InventoryWeapons = Count Result.HasCurrentWeapon = Weapon ~= nil Result.HasViewmodel = Weapon ~= nil and Weapon.Viewmodel ~= nil if Weapon then Result.Weapon = tostring(Weapon.Name) Result.SelectedSkin = Get(Weapon.Name .. " Skin", "Stock") Result.CurrentSkin = Weapon.Skin Result.ViewmodelParented = Weapon.Viewmodel ~= nil and Weapon.Viewmodel.Parent ~= nil local Record = self.Original[Weapon] Result.AppliedSkin = Record and Record.Selected Result.AppliedMatches = Record ~= nil and Matches(Record) end local Replacement = self.Replacement if Replacement then Result.Replacement = {Name = Replacement.Name, Skin = Replacement.Skin} end end, 2) if not Okay then Result.ReadError = tostring(Error):sub(1, 300) end return Result end local function DestroyRig(Rig) local Model = Rig.Viewmodel if State.LocalChams and Model then State.LocalChams:RestoreModel(Model) end pcall(State.Modules.Viewmodel.Destroy, Rig) if Model then pcall(Model.Destroy, Model) end end local function Rebuild(Weapon, Name, Skin) local Viewmodel = State.Modules.Viewmodel if type(Viewmodel.new) ~= "function" or type(Viewmodel.Destroy) ~= "function" then return false end local Before = table.clone(Weapon) local Model = Before.Viewmodel if not Model then return false end local Failed = Self.FailedBuild if Failed and Failed.Weapon == Weapon and Failed.Model == Model and Failed.Name == Name and Failed.Skin == Skin then return false end local Animations = {} for AnimationName, Animator in Before.Animators or {} do if type(Animator.Track) == "table" then Animations[AnimationName] = {Track = table.clone(Animator.Track), Playing = Animator.Playing, Direction = Animator.Direction, Speed = Animator.Speed} end end local Team = State.LocalPlayer:GetAttribute("Team") local Gloves local Loadout = State.LocalPlayer:GetAttribute("WeaponLoadout") if Loadout then local Okay, Data = pcall(State.Services.HttpService.JSONDecode, State.Services.HttpService, Loadout) if Okay and Data and Data[Team] then Gloves = Data[Team]["16"] end end local Options = { Team = Team, Gloves = Gloves, Scale = Model:GetScale(), CFrame = Model:GetPivot(), } Weapon.Name, Weapon.Skin = Name, Skin local Okay, Error = Identity(function() Viewmodel.new(Weapon, Options) end, 2) Weapon.Name, Weapon.Skin = Before.Name, Before.Skin if not Okay or Weapon.Viewmodel == Model or not Weapon.Viewmodel then if Weapon.Viewmodel and Weapon.Viewmodel ~= Model then local Partial = table.clone(Weapon) if Partial.Animators == Before.Animators then Partial.Animators = {} end DestroyRig(Partial) end for Key in Weapon do Weapon[Key] = nil end for Key, Value in Before do Weapon[Key] = Value end Self.FailedBuild = {Weapon = Weapon, Model = Model, Name = Name, Skin = Skin} Report(Name, "Could Not Load " .. Name .. ": " .. tostring(Error)) return false end local Parent = Model.Parent DestroyRig(Before) Self.FailedBuild = nil Weapon.CurrentAnimator, Weapon.CurrentAnimationName = nil, nil local Current = Weapon == State.Modules.Weapon.GetCurrentWeapon() if Current and Viewmodel.RestoreScale then Viewmodel.RestoreScale(Weapon) end if Viewmodel.SetVisible then local Visible = Current and Before.ViewmodelIsVisible == true Weapon.ViewmodelIsVisible = not Visible Viewmodel.SetVisible(Weapon, Visible) end local function ResumeAnimation(AnimationName, State, IsCurrent) local TargetName = AnimationName local Animator = Weapon.Animators and Weapon.Animators[TargetName] if not Animator and IsCurrent then TargetName = AnimationName:gsub("%d+$", "") Animator = Weapon.Animators and Weapon.Animators[TargetName] end if Animator and type(Animator.Track) == "table" then for Key, Value in State.Track do Animator.Track[Key] = Value end if State.Direction ~= nil then Animator.Direction = State.Direction end if State.Speed ~= nil then Animator.Speed = State.Speed end if Current and State.Playing and type(Animator.Play) == "function" then Animator:Play() end if IsCurrent then Weapon.CurrentAnimator, Weapon.CurrentAnimationName = Animator, TargetName end end end for AnimationName, State in Animations do if AnimationName ~= Before.CurrentAnimationName then ResumeAnimation(AnimationName, State, false) end end local ActiveState = Animations[Before.CurrentAnimationName] if ActiveState then ResumeAnimation(Before.CurrentAnimationName, ActiveState, true) end Weapon.Viewmodel.Parent = Parent return true end local function RestoreKnife() local Replacement = Self.Replacement if not Replacement then return end local Weapon = Replacement.Weapon if Weapon.Viewmodel == Replacement.Viewmodel then if not Rebuild(Weapon, Weapon.Name, Replacement.OriginalSkin) then return false end else DestroyRig(Replacement.State) end Self.Replacement = nil return true end local function ReplaceKnife(Weapon, Name, Skin) local Viewmodel = Weapon.Viewmodel if not Viewmodel then return end local Previous = Self.Replacement if Previous and Previous.Weapon == Weapon and Previous.Viewmodel == Viewmodel and Previous.Name == Name and Previous.Skin == Skin and not Previous.Dirty and Matches(Previous) then return end if Previous and (Previous.Weapon ~= Weapon or Previous.Viewmodel ~= Viewmodel) then if RestoreKnife() == false then return end Previous = nil end if not Knives:FindFirstChild(Name) or not GetSkin(Name, Skin) then Report(Name .. Skin, "Knife Model Or Skin Is Unavailable") return end local OriginalSkin = Previous and Previous.OriginalSkin or Weapon.Skin or "Stock" if not Rebuild(Weapon, Name, Skin) then return end local Data = GetSkin(Name, Skin) local Model = Weapon.Viewmodel:FindFirstChild(Data.ModelName or "Weapon") or Weapon.Viewmodel:FindFirstChild("Weapon") local Parts = Model and SaveParts(Model) local Applied, Surfaces = false, nil if Model then Applied, Surfaces = ApplyModel(Model, Name, Skin, Parts, Emissive(Name, Weapon.Emissive)) end if Model and not Applied then Surfaces = {} for _, Part in Model:GetDescendants() do if Part:IsA("MeshPart") then local Current = {} for _, Surface in Part:GetChildren() do if Surface:IsA("SurfaceAppearance") then table.insert(Current, Surface) end end Surfaces[Part] = {Texture = Part.TextureID, Surfaces = Current} end end end if Parts then for _, Part in Parts do for _, Surface in Part.Surfaces do Surface:Destroy() end end end Self.Replacement = {Weapon = Weapon, Name = Name, Skin = Skin, OriginalSkin = OriginalSkin, Viewmodel = Weapon.Viewmodel, Model = Model, Applied = Surfaces, State = table.clone(Weapon)} end local function RestoreSkins() RestoreKnife() for Weapon, Record in Self.Original do RestoreWeapon(Weapon, Record) end end function Self:Refresh() for _, Record in self.Original do Record.Dirty = true end if self.Replacement then self.Replacement.Dirty = true end end State.UI.Skins:OnChanged(function() Self:Refresh() end) local function Update() Self.Updates += 1 if not Get("Skin Changer", false) then if next(Self.Original) or Self.Replacement then RestoreSkins() end return end local Inventory = table.clone(State.Modules.Weapon.GetWeaponInventory() or {}) local Current = State.Modules.Weapon.GetCurrentWeapon() if Current then Inventory.Current = Current end local ModelName = Get("Knife Model", "Default") local Knife = Current and Current.Data and Current.Data.Type == "Melee" and Current or nil if not Knife then for _, Weapon in Inventory do if Weapon and Weapon.Data and Weapon.Data.Type == "Melee" and Weapon.Viewmodel then Knife = Weapon; break end end end local CustomKnife = Knife and ModelName ~= "Default" if Self.Replacement and (not CustomKnife or Self.Replacement.Weapon ~= Knife or Self.Replacement.Viewmodel ~= Knife.Viewmodel) then RestoreKnife() end local Seen = {} for _, Weapon in Inventory do if Weapon and Weapon.Name and Weapon.Viewmodel and not Seen[Weapon] then Seen[Weapon] = true local Okay, Error = pcall(function() local Record = Self.Original[Weapon] if CustomKnife and Weapon == Knife then if Record then RestoreWeapon(Weapon, Record) end elseif not State.UI.Skins:GetSkin(Weapon.Name) then if Record then RestoreWeapon(Weapon, Record) end else local Selected = Self:ResolveSkin(Weapon.Name, Get(Weapon.Name .. " Skin", "Stock")) local Data = GetSkin(Weapon.Name, Selected) local Model = Weapon.Viewmodel:FindFirstChild(Data and Data.ModelName or "Weapon") or Weapon.Viewmodel:FindFirstChild("Weapon") if Record and (Record.Viewmodel ~= Weapon.Viewmodel or Record.Model ~= Model) then RestoreWeapon(Weapon, Record) Record = nil end if Model and Selected and (not Record or Record.Selected ~= Selected or Record.Dirty or not Matches(Record)) and Data then if not Record then Record = {Viewmodel = Weapon.Viewmodel, Model = Model, Skin = Weapon.Skin or "Stock", Parts = SaveParts(Model)} Self.Original[Weapon] = Record end local Applied, Surfaces = ApplyModel(Model, Weapon.Name, Selected, Record.Parts, Emissive(Weapon.Name, Weapon.Emissive)) if Applied then Record.Selected = Selected Record.Dirty = false Record.Applied = Surfaces Weapon.Skin = Selected Weapon.AnimatedTintAction = nil else Report(Weapon.Name .. Selected, "No Matching Meshes For " .. Weapon.Name .. " " .. Selected) end elseif Record and Record.Selected == Selected and Matches(Record) then Weapon.Skin = Selected elseif not Data then Report(Weapon.Name .. tostring(Selected), "Skin Is Unavailable For " .. Weapon.Name) end end end) if not Okay then Report(Weapon.Name, "Could Not Apply " .. Weapon.Name .. " Skin: " .. tostring(Error)) end end end if CustomKnife then local Selected = Self:ResolveSkin(ModelName, Get(ModelName .. " Skin", "Stock")) local Okay, Error = pcall(ReplaceKnife, Knife, ModelName, Selected) if not Okay then Report(ModelName, "Could Not Replace Knife: " .. tostring(Error)) end end end if State.Modules.Weapon.OnWeaponCreate then Connect(State.Modules.Weapon.OnWeaponCreate, function() Identity(Update, 2) end) end local Elapsed = 0 function Self:Update(Delta) Elapsed += Delta or 0.2 if Elapsed < 0.15 then return end Elapsed = 0 Identity(Update, 2) end function Self:Destroy() Identity(RestoreSkins, 2) if State.SkinController == self then State.SkinController = nil end end State.Controllers.Skins = Self end Functions.Utility.Register("Skins", State.Controllers.Skins, "Colon") do local Get = Functions.Config.Get local Native = State.Modules.Camera local Player = State.LocalPlayer or State.Services.Players.LocalPlayer local Self = {} local function RestoreAspect() if Self.AspectCamera and Self.AspectCamera.Parent and Self.AspectCamera.CFrame == Self.AppliedFrame then Self.AspectCamera.CFrame = Self.BaseFrame end Self.AspectCamera, Self.AppliedFrame, Self.BaseFrame = nil, nil, nil end local function RestoreFov() if Self.FovCamera then local Value = Self.OriginalFov if Native and Native.SetFOVAmount then pcall(Native.SetFOVAmount, Value) end if Self.FovCamera.Parent then Self.FovCamera.FieldOfView = Value end end Self.FovCamera, Self.OriginalFov = nil, nil end local function RestoreZoom() if Self.Zoom then Player.CameraMinZoomDistance = 0 Player.CameraMaxZoomDistance = Self.Zoom[2] Player.CameraMinZoomDistance = Self.Zoom[1] if Native and Native.SetZoom then pcall(Native.SetZoom, Native.GetTarget() == 1 and 0 or 16) end Self.Zoom = nil end end if Native and Native.SetFOVAmount then Functions.Hooks.Add("Camera.Fov", Native.SetFOVAmount, function(Original, Value) return Original(Get("FOV Override", false) and math.clamp(Get("Field of View", 90), 40, 120) or Value) end) end function Self:Update() RestoreAspect() local Camera = Functions.Game.Camera() if self.FovCamera and (Camera ~= self.FovCamera or not Get("FOV Override", false)) then RestoreFov() end if Camera and Get("FOV Override", false) then if not self.FovCamera then self.FovCamera, self.OriginalFov = Camera, Camera.FieldOfView end local Fov = math.clamp(Get("Field of View", 90), 40, 120) if Native and Native.SetFOVAmount then Native.SetFOVAmount(Fov) else Camera.FieldOfView = Fov end end if Get("Zoom Override", false) and not Get("Third Person", false) then if not self.Zoom then self.Zoom = {Player.CameraMinZoomDistance, Player.CameraMaxZoomDistance} end local Maximum = math.clamp(Get("Max Zoom", 16), 0, 128) Player.CameraMinZoomDistance, Player.CameraMaxZoomDistance = 0, Maximum if Native and Native.SetZoom then Native.SetZoom(Maximum) end elseif not Get("Third Person", false) then RestoreZoom() end if Camera and Get("Aspect Ratio Enabled", false) then local Horizontal, Vertical = math.clamp(Get("Aspect Horizontal", 1), 0.25, 3), math.clamp(Get("Aspect Vertical", 1), 0.25, 3) if Horizontal ~= 1 or Vertical ~= 1 then local Scale = math.max(1, Horizontal, Vertical) self.AspectCamera, self.BaseFrame = Camera, Camera.CFrame self.AppliedFrame = Camera.CFrame * CFrame.new(0, 0, 0, Horizontal / Scale, 0, 0, 0, Vertical / Scale, 0, 0, 0, 1 / Scale) Camera.CFrame = self.AppliedFrame end end end function Self:Destroy() Functions.Hooks.Remove("Camera.Fov") RestoreAspect() RestoreFov() RestoreZoom() end State.Controllers.Camera = Self end Functions.Utility.Register("Camera", State.Controllers.Camera, "Colon") do local Get, Color = Functions.Config.Get, Functions.Config.Color local Game, Utility = Functions.Game, Functions.Utility local Identity, Connect, Own, Notify = Utility.Identity, Utility.Connect, Utility.Own, Utility.Notify local Parent = State.GuiParent or State.Services.CoreGui local CameraController = State.Modules.Camera local Player = State.LocalPlayer local Self = {Model = nil, HiddenParts = {}, Active = false, PreviousMode = nil, PreviousMaxZoom = nil, LastDistance = nil, EquippedName = nil, EquippedSkin = nil} local function OwnAnimations() for _, Animator in Self.Animation and Self.Animation.Animators or {} do if Animator.ActiveAnimators and Animator.ActiveAnimators ~= Self.ActiveAnimators then Animator.ActiveAnimators[Animator] = nil Animator.ActiveAnimators = Self.ActiveAnimators if Animator.Playing then Self.ActiveAnimators[Animator] = true end end end end Self.ActiveAnimators = {} local function RestorePart(Part, Original) pcall(function() local Weapon = Original.Weapon local Visible = Weapon == State.Modules.Weapon.GetCurrentWeapon() and Weapon.ViewmodelIsVisible ~= false Part.Transparency = Visible and Original.Transparency or 1 if Original.LocalTransparencyModifier ~= nil then Part.LocalTransparencyModifier = Original.LocalTransparencyModifier end end) end local function RestoreViewmodel() for Part, Original in Self.HiddenParts do RestorePart(Part, Original) Self.HiddenParts[Part] = nil end end local function HideViewmodel() local Weapon = State.Modules.Weapon.GetCurrentWeapon() local Models = {} local function Add(Current) local Model = Current and Current.Viewmodel if Model and Model.Parent then Models[Model] = Current end end Add(Weapon) for _, Current in State.Modules.Weapon.GetWeaponInventory() or {} do Add(Current) end for Part, Original in Self.HiddenParts do if not Models[Original.Model] or not Part:IsDescendantOf(Original.Model) then RestorePart(Part, Original) Self.HiddenParts[Part] = nil end end for Viewmodel, Current in Models do if State.LocalChams then State.LocalChams:RestoreModel(Viewmodel) end for _, Part in Viewmodel:GetDescendants() do if Part:IsA("BasePart") or Part:IsA("Decal") or Part:IsA("Texture") then if Self.HiddenParts[Part] == nil then local Original = Current.VisiblePartsMap and Current.VisiblePartsMap[Part] Self.HiddenParts[Part] = {Weapon = Current, Model = Viewmodel, Transparency = Original or Part.Transparency, LocalTransparencyModifier = Part:IsA("BasePart") and Part.LocalTransparencyModifier or nil} end Part.Transparency = 1 if Part:IsA("BasePart") then Part.LocalTransparencyModifier = 1 end end end end end local function Remove() if Self.Active then if CameraController.GetTarget() == 1 then pcall(CameraController.SetZoom, 0) end Player.CameraMaxZoomDistance = Self.PreviousMaxZoom Player.CameraMode = Self.PreviousMode end RestoreViewmodel() State.ThirdPersonModel = nil if Self.Animation then State.Modules.CharacterModel.DestroyAnimations(Self.Animation); Self.Animation = nil end if Self.Legs then Self.Legs:Destroy(); Self.Legs = nil end if Self.Model then Self.Model:Destroy(); Self.Model = nil end Self.Active, Self.PreviousMode, Self.PreviousMaxZoom, Self.LastDistance = false, nil, nil, nil Self.EquippedName, Self.EquippedSkin = nil, nil Self.Simulation, Self.VisualWeapon = nil, nil Self.NextEquip = nil table.clear(Self.ActiveAnimators) end local function CreateModel() if Self.Model and Self.Model.Parent then return Self.Model end local Okay, Model = Identity(function() return State.Modules.CharacterModel.new({Name = "SwiftLocalCharacter", Parent = State.Services.Workspace}) end, 2) if not Okay or not Model then return nil end Self.Model = Model State.ThirdPersonModel = Model Self.EquipFailure = nil local Animator = Model:FindFirstChildOfClass("AnimationController") if Animator then Animator:Destroy() end for _, Part in Model:GetDescendants() do if Part:IsA("BasePart") then Part.CanCollide, Part.CanTouch, Part.CanQuery = false, false, false end end if Model.PrimaryPart then Model.PrimaryPart.Anchored = true end Self.Animation = {Model = Model} Identity(function() State.Modules.CharacterModel.InitAnimations(Self.Animation, Model) OwnAnimations() local Rig = State.Shared.Managers.AnimationManager.Rigs.Character.Character local Stand = State.Modules.GameConfig.Get("Character", "StandCollisionSize") local Duck = State.Modules.GameConfig.Get("Character", "DuckCollisionSize") Self.Legs = State.Modules.Legs.new(Model, { DuckDrop = Stand.Y - Duck.Y, LadderReach = Stand.X * 0.5, WalkFolder = Rig.Walk, CrouchFolder = Rig.Crouch, ClimbFolder = Rig.Climb, }) if Self.Legs then Self.Legs:EnableTransforms(); Self.Legs:Snap() end end, 2) return Model end function Self:Update(Delta) local Simulation, Character = Game.Simulation() if not Get("Third Person", false) or not Simulation or not Game.Camera() or CameraController.GetTarget() ~= 1 or Character and Character.Health and Character.Health <= 0 then Remove(); return end if Self.Simulation and Self.Simulation ~= Simulation then Remove() end Self.Simulation = Simulation if not Self.Active then Self.PreviousMode, Self.PreviousMaxZoom = Player.CameraMode, Player.CameraMaxZoomDistance Player.CameraMaxZoomDistance = 99999 Player.CameraMode = Enum.CameraMode.Classic Self.Active = true end local Distance = Get("Third Person Distance", 12) if Distance ~= Self.LastDistance then Self.LastDistance = Distance pcall(CameraController.SetZoom, Distance) end local Model = CreateModel() if not Model or not Model.PrimaryPart then return end local Current = State.Modules.Weapon.GetCurrentWeapon() local Name = Current and Current.Name local Skin = Current and Current.Skin or "Stock" if Current and Get("Skin Changer", false) then local Knife = Get("Knife Model", "Default") if Current.Data and Current.Data.Type == "Melee" and Knife ~= "Default" then Name = Knife Skin = Get(Knife .. " Skin", "Stock") else Skin = Get(Name .. " Skin", "Stock") end if State.SkinController then Skin = State.SkinController:ResolveSkin(Name, Skin) end end local Changed = Name ~= Self.EquippedName or Skin ~= Self.EquippedSkin if Changed and (not Self.NextEquip or os.clock() >= Self.NextEquip) then local Okay, Added = Identity(function() if Name then Self.VisualWeapon = table.clone(Current) Self.VisualWeapon.Name, Self.VisualWeapon.Skin = Name, Skin State.Modules.CharacterModel.EquipWeapon(Self.Animation, Self.VisualWeapon) OwnAnimations() return Self.Animation.CurrentWeaponModel else State.Modules.CharacterModel.DestroyAnimations(Self.Animation) local Old = Self.Animation.CurrentWeaponModel if Old then Old:Destroy() end Self.Animation.CurrentWeaponModel, Self.VisualWeapon = nil, nil State.Modules.CharacterModel.InitAnimations(Self.Animation, Model) OwnAnimations() end end, 2) if Okay and (not Name or Added) then Self.EquippedName, Self.EquippedSkin = Name, Skin Self.EquipFailure, Self.NextEquip = nil, nil else Self.NextEquip = os.clock() + 1 if Self.EquipFailure ~= Name then Self.EquipFailure = Name Notify("Third Person could not display " .. tostring(Name) .. "; retrying", "Warning") end end end if Current and Self.VisualWeapon then for _, Key in {"Data", "Ammo", "Reloading", "Firing", "Mode", "SilencerMode", "ZoomLevel", "ReloadStage", "Planting"} do Self.VisualWeapon[Key] = Current[Key] end State.Modules.CharacterModel.SyncWeaponAnimation(Self.Animation, Self.VisualWeapon) OwnAnimations() end for Animator in Self.ActiveAnimators do Animator:Step(Delta or 1 / 60) end local FakeYaw = (Get("Anti Aim", false) or Get("Fake Yaw", false) or Get("Fake Pitch", false)) and State.AntiAimYaw local Yaw = FakeYaw or Simulation.BodyYaw or Simulation.Yaw or 0 local Pitch = FakeYaw and State.AntiAimPitch or Simulation.Pitch or 0 local LookYaw = FakeYaw or Simulation.Yaw or Yaw local Okay, Frame = pcall(State.Modules.CharacterModel.Pose, Model, Yaw, Simulation.Position, LookYaw, Pitch, true) if Okay then Model:PivotTo(Frame) if Self.Legs then local Duck = Simulation.Ducking and (Simulation.Ducked and 0 or 1) or (Simulation.Ducked and 1 or 0) Self.Legs:Update(Delta, Frame, Simulation.Velocity, Simulation.OnGround ~= false, Simulation.Climbing and Simulation.LadderNormal or nil, Duck, 0) Self.Legs:Apply(1) end State.Modules.CharacterModel.UpdateAnimation(Self.Animation) end if Self.Active then HideViewmodel() end end function Self:Destroy() Remove() end State.Controllers.ThirdPerson = Self end Functions.Utility.Register("ThirdPerson", State.Controllers.ThirdPerson, "Colon") do local Get, Color = Functions.Config.Get, Functions.Config.Color local Game, Utility = Functions.Game, Functions.Utility local Identity, Connect, Own, Notify = Utility.Identity, Utility.Connect, Utility.Own, Utility.Notify local Parent = State.GuiParent or State.Services.CoreGui local Self = {Model = nil, UserId = nil, Request = 0, Hidden = {}, Source = nil} local BodyParts = { Head = true, UpperTorso = true, LowerTorso = true, LeftUpperArm = true, LeftLowerArm = true, LeftHand = true, RightUpperArm = true, RightLowerArm = true, RightHand = true, LeftUpperLeg = true, LeftLowerLeg = true, LeftFoot = true, RightUpperLeg = true, RightLowerLeg = true, RightFoot = true, } local function Restore() if State.AvatarModel == Self.Model then State.AvatarModel = nil end for Object, Original in Self.Hidden do if Object.Parent then if Object:IsA("BasePart") then Object.LocalTransparencyModifier = Original else Object.Transparency = Original end end Self.Hidden[Object] = nil end Self.Source = nil if Self.Model then Self.Model.Parent = nil end end function Self:Disable() self.Request += 1 Restore() end local function Prepare(Model) for _, Item in Model:GetDescendants() do if Item:IsA("BasePart") then Item.CanCollide = false Item.CanTouch = false Item.CanQuery = false Item.Massless = true if BodyParts[Item.Name] and Item.Parent == Model then Item.Anchored = true end elseif Item:IsA("Script") or Item:IsA("LocalScript") then Item:Destroy() end end local Root = Model:FindFirstChild("HumanoidRootPart") if Root then Root.Anchored = true; Root.Transparency = 1 end local Humanoid = Model:FindFirstChildOfClass("Humanoid") if Humanoid then Humanoid.AutoRotate = false Humanoid.PlatformStand = true Humanoid.DisplayDistanceType = Enum.HumanoidDisplayDistanceType.None end Model.Name = "SwiftAvatar" end function Self:Apply(Input, Callback) self.Request += 1 local Id = tonumber(tostring(Input or ""):match("^%s*(%d+)%s*$")) if not Id or Id < 1 or Id % 1 ~= 0 then Notify("Enter a valid avatar User ID", "Warning") if Callback then Callback(false) end return end local Request = self.Request if self.Model and self.UserId == Id then if Callback then Callback(true) end return end task.spawn(function() local Players = State.Services.Players local Valid, Name = Identity(function() return Players:GetNameFromUserIdAsync(Id) end) if not State.Alive or Request ~= Self.Request then return end if not Valid or type(Name) ~= "string" or Name == "" then Notify("Avatar User ID is invalid or unavailable", "Warning") if Callback then Callback(false) end return end local Okay, Model = Identity(function() local Description = Players:GetHumanoidDescriptionFromUserIdAsync(Id) return Players:CreateHumanoidModelFromDescriptionAsync(Description, Enum.HumanoidRigType.R15) end) if not State.Alive or Request ~= Self.Request then if Model then Model:Destroy() end return end if not Okay or not Model then Notify("Could not load avatar for @" .. Name, "Warning") if Callback then Callback(false) end return end Prepare(Model) Restore() if Self.Model then Self.Model:Destroy() end Self.Model, Self.UserId = Model, Id if Callback then Callback(true) end Notify("Avatar replaced with @" .. Name, "Success") end) end local function Hide(Source) if State.LocalChams then State.LocalChams:RestoreModel(Source) end local Weapon = Source:FindFirstChild("CurrentWeapon") for _, Item in Source:GetDescendants() do if not Weapon or not Item:IsDescendantOf(Weapon) then if Item:IsA("BasePart") and Item.Name ~= "HumanoidRootPart" and Item.Name ~= "CollisionBox" then if Self.Hidden[Item] == nil then Self.Hidden[Item] = Item.LocalTransparencyModifier end Item.LocalTransparencyModifier = 1 elseif Item:IsA("Decal") then if Self.Hidden[Item] == nil then Self.Hidden[Item] = Item.Transparency end Item.Transparency = 1 end end end end function Self:Update() local Source = State.ThirdPersonModel if not Get("Avatar Replacer", false) or not Self.Model or not Source or not Source.Parent then if Self.Source or Self.Model and Self.Model.Parent then Restore() end return end if Self.Source ~= Source then Restore(); Self.Source = Source; Hide(Source) end if not Self.Model.Parent then Self.Model.Parent = State.Services.Workspace end for Name in BodyParts do local AvatarPart = Self.Model:FindFirstChild(Name) local SourcePart = Source:FindFirstChild(Name) if AvatarPart and SourcePart then AvatarPart.CFrame = SourcePart.CFrame end end State.AvatarModel = Self.Model end function Self:Destroy() self:Disable() if self.Model then self.Model:Destroy(); self.Model = nil end end State.Controllers.Avatar = Self end Functions.Utility.Register("Avatar", State.Controllers.Avatar, "Colon") do local Get, Color = Functions.Config.Get, Functions.Config.Color local Game, Utility = Functions.Game, Functions.Utility local Identity, Connect, Own, Notify = Utility.Identity, Utility.Connect, Utility.Own, Utility.Notify local Parent = State.GuiParent or State.Services.CoreGui local Self = {Detached = {}, Rigs = setmetatable({}, {__mode = "k"})} local function CleanRigs() local Referenced, Weapons = {}, {} local function Add(Weapon) if Weapon and Weapon.Viewmodel then Referenced[Weapon.Viewmodel], Weapons[Weapon] = true, true end end Add(State.Modules.Weapon.GetCurrentWeapon()) for _, Weapon in State.Modules.Weapon.GetWeaponInventory() or {} do Add(Weapon) end for Weapon, Previous in Self.Rigs do if Weapon.Viewmodel and Weapon.Viewmodel ~= Previous and not Referenced[Previous] then if State.LocalChams then State.LocalChams:RestoreModel(Previous) end Previous:Destroy() Self.Rigs[Weapon] = nil elseif not Previous.Parent then Self.Rigs[Weapon] = nil end end for Weapon in Weapons do Self.Rigs[Weapon] = Weapon.Viewmodel end end local function Restore(Object, Record) if Record.Parent:IsDescendantOf(Record.Viewmodel) then local Weapon = Record.Weapon if Weapon.Viewmodel == Record.Viewmodel then Object.Transparency = Weapon.ViewmodelIsVisible == false and 1 or Record.Transparency if Weapon.VisiblePartsMap then Weapon.VisiblePartsMap[Object] = Record.Transparency end end Object.Parent = Record.Parent else Object:Destroy() end Self.Detached[Object] = nil end local function RenderFrame() CleanRigs() local Weapon = State.Modules.Weapon.GetCurrentWeapon() local Model = Weapon and Weapon.Viewmodel local Gloves = Get("Remove Viewmodel Gloves", false) local Sleeves = Get("Remove Viewmodel Sleeves", false) for Object, Record in Self.Detached do if Record.Viewmodel ~= Model or not (Record.Glove and Gloves or not Record.Glove and Sleeves) then Restore(Object, Record) end end local Arms = Model and Model:FindFirstChild("Arms") if not Arms or not (Gloves or Sleeves) then return end for _, Side in {"Left", "Right"} do local Arm = Arms:FindFirstChild(Side .. " Arm") if Arm then local Suffix = Side == "Left" and "L" or "R" for _, Kind in {"Glove", "Sleeve"} do if Kind == "Glove" and Gloves or Kind == "Sleeve" and Sleeves then local Object = Arm:FindFirstChild(Kind .. Suffix) if Object then if State.LocalChams then State.LocalChams:RestoreModel(Object) end local Transparency = Weapon.VisiblePartsMap and Weapon.VisiblePartsMap[Object] Self.Detached[Object] = {Parent = Arm, Viewmodel = Model, Weapon = Weapon, Transparency = Transparency or Object.Transparency, Glove = Kind == "Glove"} Object.Parent = nil end end end end end end function Self:Update() Identity(RenderFrame) end function Self:Destroy() for Object, Record in self.Detached do Restore(Object, Record) end table.clear(self.Rigs) end State.Controllers.ViewmodelCosmetics = Self end Functions.Utility.Register("ViewmodelCosmetics", State.Controllers.ViewmodelCosmetics, "Colon") do local Get, Game, Identity = Functions.Config.Get, Functions.Game, Functions.Utility.Identity local Self = {Entries = {}, Renderers = {}} local Categories = {"Character", "Arms", "Gun", "Knife"} local function BodyPart(Part, Model) if Part == Model then return true end local Parent = Part.Parent while Parent and Parent ~= Model do if Parent:IsA("Tool") or Parent.Name == "CurrentWeapon" or Parent.Name == "Weapon" or Parent.Name:sub(1, 5) == "Swift" then return false end Parent = Parent.Parent end return true end local function WeaponPart(Part, Model) if Part == Model then return true end local Parent = Part.Parent while Parent and Parent ~= Model do if Parent.Name == "Arms" then return false end Parent = Parent.Parent end return true end for _, Category in Categories do Self.Entries[Category] = {} Self.Renderers[Category] = Functions.Visuals.CreateChams("Local " .. Category .. " Chams", Category == "Character" and BodyPart or Category ~= "Arms" and WeaponPart or nil) end function Self:ReadOriginal(Object, Name) for _, Renderer in self.Renderers do local Found, Value = Renderer:ReadOriginal(Object, Name) if Found then return Value end end return Object[Name] end function Self:SurfaceCount(Part) local Count = 0 for _, Child in Part:GetChildren() do if Child:IsA("SurfaceAppearance") then Count += 1 end end for _, Renderer in self.Renderers do Count += Renderer:DetachedSurfaces(Part) end return Count end function Self:RestoreModel(Model) if self.Weapon then for _, Renderer in self.Renderers do Renderer:NormalizeVisibility(self.Weapon.VisiblePartsMap) end end for _, Renderer in self.Renderers do Renderer:RestoreModel(Model) end end State.LocalChams = Self local function Active(Model) return Model and Model.Parent and Model or nil end local function WeaponModel(Current, Viewmodel) local Skins = State.SkinController local Replacement = Skins and Skins.Replacement if Replacement and Replacement.Weapon == Current and Replacement.Viewmodel == Viewmodel and Active(Replacement.Model) then return Replacement.Model end local Original = Skins and Skins.Original and Skins.Original[Current] if Original and Original.Viewmodel == Viewmodel and Active(Original.Model) then return Original.Model end local Name = Current.Data and Current.Data.ModelName return Name and Viewmodel:FindFirstChild(Name) or Viewmodel:FindFirstChild("Weapon") or Viewmodel:FindFirstChild(Current.Name or "Weapon") or Viewmodel end local function Update(Category, Model) local Renderer, Entry = Self.Renderers[Category], Self.Entries[Category] if not Get("Local " .. Category .. " Chams", false) or not Active(Model) then Renderer:Remove(Entry); return end Renderer:Render(Entry, Model) end local function Clear() for _, Category in Categories do Self.Renderers[Category]:Remove(Self.Entries[Category]) end end local function RenderFrame() local Current = State.Modules.Weapon.GetCurrentWeapon() for _, Renderer in Self.Renderers do if Self.Weapon then Renderer:NormalizeVisibility(Self.Weapon.VisiblePartsMap) end if Current and Current ~= Self.Weapon then Renderer:NormalizeVisibility(Current.VisiblePartsMap) end end Self.Weapon = Current local Enabled = false for _, Category in Categories do if Get("Local " .. Category .. " Chams", false) then Enabled = true; break end end if not Enabled then Clear(); return end local Camera = Game.Camera() local Simulation, Character = Game.Simulation() if not Camera or not Simulation or Character and (Character.Health or 100) <= 0 then Clear(); return end local Third = Active(State.ThirdPersonModel) local Avatar = Get("Avatar Replacer", false) and Active(State.AvatarModel) or nil local Body = Avatar or Third or Active(State.LocalPlayer.Character) Update("Character", Body) local Viewmodel = Current and Active(Current.Viewmodel) local IsKnife = Current and Current.Data and Current.Data.Type == "Melee" local Equipped if Third then Equipped = Third:FindFirstChild("CurrentWeapon") Update("Arms", nil) elseif Viewmodel and Current.ViewmodelIsVisible ~= false then Equipped = WeaponModel(Current, Viewmodel) Update("Arms", Viewmodel:FindFirstChild("Arms")) else Update("Arms", nil) end Update("Gun", Current and not IsKnife and Equipped or nil) Update("Knife", IsKnife and Equipped or nil) end function Self:Update() Identity(RenderFrame) end function Self:Destroy() for _, Renderer in self.Renderers do if self.Weapon then Renderer:NormalizeVisibility(self.Weapon.VisiblePartsMap) end Renderer:Destroy() end if State.LocalChams == self then State.LocalChams = nil end end State.Controllers.LocalChams = Self end Functions.Utility.Register("LocalChams", State.Controllers.LocalChams, "Colon") do local Get, Color = Functions.Config.Get, Functions.Config.Color local Game, Utility = Functions.Game, Functions.Utility local Identity, Connect, Own, Notify = Utility.Identity, Utility.Connect, Utility.Own, Utility.Notify local Parent = State.GuiParent or State.Services.CoreGui local Self = {Scopes = {}, Originals = {}} local Gui = Own(Instance.new("ScreenGui")) Gui.Name, Gui.ResetOnSpawn, Gui.IgnoreGuiInset, Gui.DisplayOrder = "SwiftReticle", false, true, 6 Gui.Parent = Parent local Root = Instance.new("Frame") Root.BackgroundTransparency, Root.Size, Root.Parent = 1, UDim2.fromScale(1, 1), Gui local Lines = {} for Index = 1, 5 do local Line = Instance.new("Frame") Line.BorderSizePixel, Line.AnchorPoint, Line.Parent = 0, Vector2.new(0.5, 0.5), Root Lines[Index] = Line end local function ScopeImage(Object) return (Object:IsA("ImageLabel") or Object:IsA("ImageButton")) and Object.Name == "Center" and Object.Parent and Object.Parent.Name == "Scope" end local PlayerGui = State.LocalPlayer:FindFirstChildOfClass("PlayerGui") local function Track(Object) if ScopeImage(Object) then Self.Scopes[Object] = true end end if PlayerGui then for _, Object in PlayerGui:GetDescendants() do Track(Object) end Connect(PlayerGui.DescendantAdded, Track) end local function ImageId(Value) Value = tostring(Value or ""):match("^%s*(.-)%s*$") local Id = Value:match("^rbxassetid://(%d+)$") or Value:match("^(%d+)$") return Id and tonumber(Id) and tonumber(Id) > 0 and "rbxassetid://" .. Id or nil end local function Restore(Object) local Original = Self.Originals[Object] if Original ~= nil and Object.Parent then Object.Image = Original end Self.Originals[Object] = nil end local function Update() local Camera, Simulation = Game.Camera(), Game.Simulation() local Weapon = State.Modules.Weapon.GetCurrentWeapon() local Scoped = Weapon and ((Weapon.ZoomLevel or 0) > 0 or Weapon.Data and Weapon.Data.AltFunction and Weapon.Data.AltFunction.Name == "ScopeRifle" and Weapon.Mode == 2) Root.Visible = Get("Custom Crosshair", false) and Camera ~= nil and Simulation ~= nil and not (Scoped and Get("Crosshair Hide Scoped", true)) if Root.Visible then local Color, Alpha = Color("Crosshair Color", Color3.new(1, 1, 1)) local Length, Gap, Thickness = Get("Crosshair Length", 6), Get("Crosshair Gap", 4), Get("Crosshair Thickness", 2) local X, Y = Camera.ViewportSize.X / 2, Camera.ViewportSize.Y / 2 for Index, Line in Lines do local Horizontal = Index <= 2 local Offset = Gap + Length / 2 local Sign = Index % 2 == 0 and 1 or -1 Line.BackgroundColor3, Line.BackgroundTransparency = Color, 1 - Alpha Line.Size = UDim2.fromOffset(Horizontal and Length or Thickness, Index > 2 and Index < 5 and Length or Thickness) Line.Position = UDim2.fromOffset(X + (Horizontal and Sign * Offset or 0), Y + (Index > 2 and Index < 5 and Sign * Offset or 0)) Line.Visible = Index < 5 or Get("Crosshair Dot", true) end end local Image = Get("Override Scope Image", false) and ImageId(Get("Scope Image", "")) for Object in Self.Scopes do if not Object.Parent then Self.Scopes[Object], Self.Originals[Object] = nil, nil elseif Image then if Self.Originals[Object] == nil then Self.Originals[Object] = Object.Image end Object.Image = Image else Restore(Object) end end end function Self:Update() Update() end function Self:Destroy() for Object in self.Originals do Restore(Object) end Gui:Destroy() end State.Controllers.Reticle = Self end Functions.Utility.Register("Reticle", State.Controllers.Reticle, "Colon") do local Aliases = { ["Player Box"] = "Box", ["Player Box Color"] = "Box Color", ["Player Box Thickness"] = "Box Thickness", ["Player Box Outline"] = "Box Outline Enabled", ["Player Box Fill"] = "Box Fill", ["Player Box Fill Color"] = "Fill Color", ["Player Box Gradient"] = "Box Fill Gradient", ["Player Box Gradient Color"] = "Low Contrast Fill", ["Player Box Gradient Rotation"] = "Box Fill Rotation", ["Player Name"] = "Names", ["Player Name Color"] = "Names Text Color", ["Player Distance"] = "Distance Text", ["Player Distance Color"] = "Distance Text Color", ["Player Weapon"] = "Weapon Text", ["Player Weapon Color"] = "Weapon Text Color", ["Player Flags"] = "Flags", ["Player Flags Types"] = "ESP Flags", ["Player Flags Color"] = "Flags Text Color", ["Player Skeleton"] = "Skeletons", ["Player Skeleton Color"] = "Skeleton Color", ["Player Skeleton Thickness"] = "Skeleton Thickness", ["Player Health"] = "Healthbar", ["Player Health Width"] = "Healthbar Width", ["Player Health Color"] = "Health Color", } local function Get(Name, Default) return Functions.Config.Get(Aliases[Name] or Name, Default) end local function Color(Name, Default) return Functions.Config.Color(Aliases[Name] or Name, Default) end local Game = Functions.Game local Services = State.Services local Fonts = State.Library.Fonts local Self = {Entries = {}, Clock = 0} local White, Black = Color3.new(1, 1, 1), Color3.new(0, 0, 0) local Gradients = setmetatable({}, {__mode = "k"}) local function Transparency(Opacity) return 1 - math.clamp(tonumber(Opacity) or 1, 0, 1) end local function TextSize() return math.clamp(tonumber(Get("Text Size", 10)) or 10, 8, 24) end local function Gradient(Object, Enabled, First, FirstOpacity, Last, LastOpacity, Rotation, Middle, MiddleOpacity) Object.Enabled = Enabled == true if not Object.Enabled then return end local Cached = Gradients[Object] if not Cached then Cached = {}; Gradients[Object] = Cached end if Cached.First ~= First or Cached.Last ~= Last or Cached.Middle ~= Middle then Object.Color = Middle and ColorSequence.new({ColorSequenceKeypoint.new(0, First), ColorSequenceKeypoint.new(0.5, Middle), ColorSequenceKeypoint.new(1, Last)}) or ColorSequence.new(First, Last) Cached.First, Cached.Last, Cached.Middle = First, Last, Middle end local FirstAlpha, LastAlpha = Transparency(FirstOpacity), Transparency(LastOpacity) local MiddleAlpha = Middle and Transparency(MiddleOpacity) or nil if Cached.FirstAlpha ~= FirstAlpha or Cached.LastAlpha ~= LastAlpha or Cached.MiddleAlpha ~= MiddleAlpha then Object.Transparency = Middle and NumberSequence.new({NumberSequenceKeypoint.new(0, FirstAlpha), NumberSequenceKeypoint.new(0.5, MiddleAlpha), NumberSequenceKeypoint.new(1, LastAlpha)}) or NumberSequence.new({NumberSequenceKeypoint.new(0, FirstAlpha), NumberSequenceKeypoint.new(1, LastAlpha)}) Cached.FirstAlpha, Cached.LastAlpha, Cached.MiddleAlpha = FirstAlpha, LastAlpha, MiddleAlpha end if Cached.Rotation ~= (Rotation or 0) then Object.Rotation = Rotation or 0; Cached.Rotation = Rotation or 0 end end local Bones = {{"Head", "UpperTorso"}, {"UpperTorso", "LowerTorso"}, {"UpperTorso", "LeftUpperArm"}, {"LeftUpperArm", "LeftLowerArm"}, {"LeftLowerArm", "LeftHand"}, {"UpperTorso", "RightUpperArm"}, {"RightUpperArm", "RightLowerArm"}, {"RightLowerArm", "RightHand"}, {"LowerTorso", "LeftUpperLeg"}, {"LeftUpperLeg", "LeftLowerLeg"}, {"LeftLowerLeg", "LeftFoot"}, {"LowerTorso", "RightUpperLeg"}, {"RightUpperLeg", "RightLowerLeg"}, {"RightLowerLeg", "RightFoot"}} local function New(Class, Parent, Properties) local Object = Instance.new(Class) for Key, Value in Properties or {} do Object[Key] = Value end Object.Parent = Parent return Object end local Gui = New("ScreenGui", State.UI and State.UI.Parent or Services.CoreGui, {Name = "Swift2ESP", IgnoreGuiInset = true, ResetOnSpawn = false, DisplayOrder = 2}) local function Label(Parent) return New("TextLabel", Parent, {BackgroundTransparency = 1, FontFace = Fonts:ESPFace(Get("ESP Font", "Pixel")), TextSize = 11, TextColor3 = White, TextStrokeColor3 = Black, TextStrokeTransparency = 0, Visible = false}) end local function Bar(Parent) local Root = New("Frame", Parent, {BorderSizePixel = 0, BackgroundColor3 = Black, Visible = false}) return Root, New("Frame", Root, {BorderSizePixel = 0, BackgroundColor3 = White}) end local function Create() local Root = New("Frame", Gui, {BackgroundTransparency = 1, Size = UDim2.fromScale(1, 1), Visible = false}) local Box = New("Frame", Root, {BackgroundTransparency = 1, BorderSizePixel = 0, Visible = false}) local Outline = New("UIStroke", Box, {Color = Black, Thickness = 3, ApplyStrokeMode = Enum.ApplyStrokeMode.Border}) local Border = New("Frame", Root, {BackgroundTransparency = 1, BorderSizePixel = 0, Visible = false}) local Stroke = New("UIStroke", Border, {Thickness = 1, Color = White, ApplyStrokeMode = Enum.ApplyStrokeMode.Border}) local Gradient = New("UIGradient", Box) local StrokeGradient = New("UIGradient", Stroke) local Health, HealthFill = Bar(Root) local Armor, ArmorFill = Bar(Root) local Ammo, AmmoFill = Bar(Root) local Entry = {Root = Root, Box = Box, Outline = Outline, Border = Border, Stroke = Stroke, Gradient = Gradient, StrokeGradient = StrokeGradient, Name = Label(Root), Distance = Label(Root), Weapon = Label(Root), Flags = Label(Root), Timer = Label(Root), AmmoText = Label(Root), Arrow = Label(Root), HealthText = Label(Root), Health = Health, HealthFill = HealthFill, HealthGradient = New("UIGradient", HealthFill, {Enabled = false, Rotation = 90}), Armor = Armor, ArmorFill = ArmorFill, Ammo = Ammo, AmmoFill = AmmoFill, Lines = {}, SkeletonOutlines = {}, Corners = {}, CornerOutlines = {}, CornerGradients = {}} Entry.Glow = New("ImageLabel", Root, {BackgroundTransparency = 1, Image = "rbxassetid://5028857084", ScaleType = Enum.ScaleType.Slice, SliceCenter = Rect.new(24, 24, 276, 276), ZIndex = -1, Visible = false}) Entry.GlowGradient = New("UIGradient", Entry.Glow) Entry.Icon = New("ImageLabel", Root, {BackgroundTransparency = 1, ScaleType = Enum.ScaleType.Fit, Visible = false}) Entry.Head = New("Frame", Root, {BorderSizePixel = 0, AnchorPoint = Vector2.new(0.5, 0.5), Visible = false}) New("UICorner", Entry.Head, {CornerRadius = UDim.new(1, 0)}) for Index = 1, #Bones + 1 do Entry.Lines[Index] = New("Frame", Root, {BorderSizePixel = 0, AnchorPoint = Vector2.new(0, 0.5), Visible = false}) end for Index = 1, #Bones do Entry.SkeletonOutlines[Index] = New("Frame", Root, {BorderSizePixel = 0, AnchorPoint = Vector2.new(0, 0.5), ZIndex = 0, Visible = false}) end for Index = 1, 8 do Entry.Corners[Index] = New("Frame", Root, {BorderSizePixel = 0, AnchorPoint = Vector2.new(0, 0.5), ZIndex = 2, Visible = false}) Entry.CornerOutlines[Index] = New("Frame", Root, {BorderSizePixel = 0, AnchorPoint = Vector2.new(0, 0.5), ZIndex = 1, Visible = false}) Entry.CornerGradients[Index] = New("UIGradient", Entry.Corners[Index]) end Entry.Arrow.Text, Entry.Arrow.TextSize, Entry.Arrow.Size = "▲", 24, UDim2.fromOffset(28, 28) Entry.Arrow.FontFace = Fonts:ESPFace("Code") return Entry end local function Hide(Entry) Entry.Root.Visible = false if Entry.Highlight then Entry.Highlight.Enabled = false end end local function Destroy(Entry) if Entry.Highlight then Entry.Highlight:Destroy() end Entry.Root:Destroy() end local function Bounds(Data, Camera, Character) local Model = Data.Model local Low, High = Vector2.new(math.huge, math.huge), Vector2.new(-math.huge, -math.huge) for _, Part in Character and Model:GetChildren() or Model:GetDescendants() do if not Part:IsA("BasePart") or Part.Name == "CollisionBox" or Part.Name == "HumanoidRootPart" then continue end local Frame = Character and Game.PartFrame(Data, Part) or Part.CFrame if not Frame then continue end for X = -1, 1, 2 do for Y = -1, 1, 2 do for Z = -1, 1, 2 do local Point = Camera:WorldToViewportPoint(Frame * (Part.Size * Vector3.new(X, Y, Z) * 0.5)) if Point.Z <= 0.05 then return nil end Low = Vector2.new(math.min(Low.X, Point.X), math.min(Low.Y, Point.Y)) High = Vector2.new(math.max(High.X, Point.X), math.max(High.Y, Point.Y)) end end end end local View = Camera.ViewportSize if Low.X == math.huge or High.X < 0 or High.Y < 0 or Low.X > View.X or Low.Y > View.Y then return nil end return math.floor(Low.X), math.floor(Low.Y), math.max(2, math.ceil(High.X - Low.X)), math.max(2, math.ceil(High.Y - Low.Y)) end local function Line(Object, A, B, Thickness, Tint, Opacity) local Delta = B - A Object.AnchorPoint = Vector2.new(0.5, 0.5) Object.Position, Object.Size = UDim2.fromOffset((A.X + B.X) * 0.5, (A.Y + B.Y) * 0.5), UDim2.fromOffset(Delta.Magnitude, Thickness) Object.Rotation, Object.BackgroundColor3, Object.Visible = math.deg(math.atan2(Delta.Y, Delta.X)), Tint, true Object.BackgroundTransparency = Transparency(Opacity) end local function Text(Object, Enabled, Value, X, Y, Width, Tint, Opacity) Object.Visible = Enabled if not Enabled then return end Object.Text, Object.Position, Object.Size = tostring(Value), UDim2.fromOffset(X - 30, Y), UDim2.fromOffset(Width + 60, TextSize() + 4) Object.AnchorPoint = Vector2.new(0, 0) Object.TextXAlignment, Object.TextYAlignment = Enum.TextXAlignment.Center, Enum.TextYAlignment.Top Object.TextColor3 = Tint or White Object.TextTransparency = Transparency(Opacity) Object.TextSize = TextSize() Object.FontFace = Fonts:ESPFace(Get("ESP Font", "Pixel")) local OutlineColor, Alpha = Color("ESP Text Outline Color", Black) Object.TextStrokeColor3, Object.TextStrokeTransparency = OutlineColor, Get("ESP Text Outline", false) and 1 - (Alpha or 1) * (1 - Object.TextTransparency) or 1 end local function WeaponIcon(Name) local Manager = State.Modules.WeaponManager local Data = Manager and Manager.Get and Manager.Get(Name) local Information = Data and Data.GuiInformation return Information and (Information.IconHorizontal or Information.Icon) end local function Render(Category, Data, Entry, Camera) Hide(Entry) local Character = Category == "Character" local Model = Data.Model if not Model or not Model.Parent or Character and (not Functions.Target.Valid(Data) or not Functions.Target.Enemy(Data)) then return end local Head = Character and (Model:FindFirstChild("Head") or Model.PrimaryPart) if Character and Get("ESP Visible Check", false) and (not Head or not Functions.Target.Visible(Head, nil, Game.PartPosition(Data, Head))) then return end local Center = Character and ((Head and Game.PartPosition(Data, Head)) or Data.Position) or Model:GetPivot().Position if typeof(Center) ~= "Vector3" then return end if Character and Get("Distance Limit", false) and (Camera.CFrame.Position - Center).Magnitude > Get("Max Distance", 1000) then return end local Screen, Onscreen = Camera:WorldToViewportPoint(Center) local X, Y, Width, Height = Bounds(Data, Camera, Character) for _, Object in Entry.Root:GetChildren() do if Object:IsA("GuiObject") then Object.Visible = false end end if not X then if not Character or not Get("Player Offscreen Arrows", false) then return end local View = Camera.ViewportSize local Direction = Vector2.new(Screen.X - View.X * 0.5, Screen.Y - View.Y * 0.5) if Screen.Z < 0 then Direction = -Direction end Direction = Direction.Magnitude > 0.001 and Direction.Unit or Vector2.new(0, -1) local Radius = math.min(View.X, View.Y) * math.clamp(Get("Player Arrow Distance", 0.45), 0.05, 0.48) local Position = View * 0.5 + Direction * Radius Entry.Root.Visible, Entry.Arrow.Visible = true, true Entry.Arrow.Position, Entry.Arrow.Rotation = UDim2.fromOffset(Position.X - 14, Position.Y - 14), math.deg(math.atan2(Direction.Y, Direction.X)) + 90 local Tint, Opacity = Color("Player Arrow Color", White) Entry.Arrow.TextColor3, Entry.Arrow.TextTransparency = Tint, Transparency(Opacity) Entry.Arrow.TextStrokeTransparency = Transparency(Opacity) return end Entry.Root.Visible = true local Prefix = Character and "Player" or Category == "Bomb" and "C4" or "Dropped" Entry.Box.Position, Entry.Box.Size = UDim2.fromOffset(X, Y), UDim2.fromOffset(Width, Height) Entry.Border.Position, Entry.Border.Size = Entry.Box.Position, Entry.Box.Size Entry.Box.Visible, Entry.Border.Visible = Get(Prefix .. " Box", false), Get(Prefix .. " Box", false) local BoxColor, BoxOpacity = Color(Prefix .. " Box Color", White) Entry.Stroke.Color, Entry.Stroke.Transparency, Entry.Stroke.Thickness = BoxColor, Transparency(BoxOpacity), Get(Prefix .. " Box Thickness", 1) Entry.Outline.Enabled, Entry.Outline.Thickness = Get(Prefix .. " Box Outline", true), Entry.Stroke.Thickness + 2 Entry.Outline.Color, Entry.Outline.Transparency = Black, 0 local Fill, FillOpacity = Color(Prefix .. " Box Fill Color", White) local FillEnd, FillEndOpacity = Color(Prefix .. " Box Gradient Color", White) local FillGradient = Get(Prefix .. " Box Gradient", false) Entry.Box.BackgroundColor3 = FillGradient and White or Fill Entry.Box.BackgroundTransparency = Get(Prefix .. " Box Fill", false) and 1 - Get(Prefix .. " Box Fill Opacity", 0.2) * (FillGradient and 1 or FillOpacity) or 1 Gradient(Entry.Gradient, FillGradient, Fill, FillOpacity, FillEnd, FillEndOpacity, Get(Prefix .. " Box Gradient Rotation", 90)) Entry.StrokeGradient.Enabled = false if Character then local Outline, OutlineOpacity = Color("Box Outline Color", Black) Entry.Outline.Color, Entry.Outline.Transparency, Entry.Outline.Thickness = Outline, Transparency(OutlineOpacity), Get("Box Outline Thickness", 3) local PlayerFill, PlayerFillOpacity = Color("Fill Color", White) local HighFill, HighFillOpacity = Color("High Contrast Fill", PlayerFill) local LowFill, LowFillOpacity = Color("Low Contrast Fill", PlayerFill) local PlayerFillGradient = Get("Box Fill Gradient", false) Entry.Box.BackgroundColor3 = PlayerFillGradient and White or PlayerFill Entry.Box.BackgroundTransparency = Get("Box Fill", false) and (PlayerFillGradient and 0 or Transparency(PlayerFillOpacity)) or 1 Gradient(Entry.Gradient, PlayerFillGradient, HighFill, HighFillOpacity, LowFill, LowFillOpacity, Get("Box Fill Rotation", 0)) local HighBox, HighBoxOpacity = Color("High Contrast Box", BoxColor) local LowBox, LowBoxOpacity = Color("Low Contrast Box", BoxColor) local BoxGradient, BoxRotation = Get("Box Gradient", false), Get("Box Gradient Rotation", 0) Entry.Stroke.Color, Entry.Stroke.Transparency = BoxGradient and White or BoxColor, BoxGradient and 0 or Transparency(BoxOpacity) Gradient(Entry.StrokeGradient, BoxGradient, HighBox, HighBoxOpacity, LowBox, LowBoxOpacity, BoxRotation) local Corners = Get("Box", false) and Get("Box Style", "Full") == "Corners" Entry.Border.Visible, Entry.Outline.Enabled = Get("Box", false) and not Corners, Get("Box Outline Enabled", false) and not Corners if Corners then local Ratio = math.clamp(Get("Box Corner Length", 25) / 100, 0.1, 0.5) local A, B = Width * Ratio, Height * Ratio local Segments = {{X, Y, X + A, Y}, {X, Y, X, Y + B}, {X + Width - A, Y, X + Width, Y}, {X + Width, Y, X + Width, Y + B}, {X, Y + Height, X + A, Y + Height}, {X, Y + Height - B, X, Y + Height}, {X + Width - A, Y + Height, X + Width, Y + Height}, {X + Width, Y + Height - B, X + Width, Y + Height}} for Index, Segment in Segments do local First, Last = Vector2.new(Segment[1], Segment[2]), Vector2.new(Segment[3], Segment[4]) if Get("Box Outline Enabled", false) then Line(Entry.CornerOutlines[Index], First, Last, Get("Box Outline Thickness", 3), Outline, OutlineOpacity) end local SegmentLine = Entry.Corners[Index] Line(SegmentLine, First, Last, Entry.Stroke.Thickness, Entry.Stroke.Color, BoxGradient and 1 or BoxOpacity) Gradient(Entry.CornerGradients[Index], BoxGradient, HighBox, HighBoxOpacity, LowBox, LowBoxOpacity, BoxRotation - SegmentLine.Rotation) end end Entry.Glow.Visible = Get("Box", false) and Get("Box Glow", false) local GlowSize = Get("Glow Size", 45) Entry.Glow.Position, Entry.Glow.Size = UDim2.fromOffset(X - GlowSize * 0.5, Y - GlowSize * 0.5), UDim2.fromOffset(Width + GlowSize, Height + GlowSize) local Glow, GlowOpacity = Color("Glow Color", White) local HighGlow, HighGlowOpacity = Color("High Contrast Glow", Glow) local LowGlow, LowGlowOpacity = Color("Low Contrast Glow", Glow) local GlowGradient = Get("Box Glow Gradient", false) Entry.Glow.ImageColor3, Entry.Glow.ImageTransparency = GlowGradient and White or Glow, 1 - Get("Glow Opacity", 0.2) * (GlowGradient and 1 or GlowOpacity) Gradient(Entry.GlowGradient, GlowGradient, HighGlow, HighGlowOpacity, LowGlow, LowGlowOpacity, Get("Box Glow Rotation", 0)) end local Player = Character and Data.UserId and Services.Players:GetPlayerByUserId(Data.UserId) local Weapon = Character and Data.CharacterCurrentWeapon or Data local WeaponName = Weapon and Weapon.Name or (Character and "none" or "") local Display = Character and (Player and Player.DisplayName or Data.Name or "Bot") or Category == "Bomb" and "C4" or WeaponName if Character and Player then local Choice = Get("ESP Name Type", "Display Name") if Choice == "Username" then Display = Player.Name elseif Choice == "Both" then Display = Player.DisplayName .. " (@" .. Player.Name .. ")" end end local RowHeight = TextSize() + 4 local Ammo = Weapon and Weapon.Ammo local Manager = State.Modules.WeaponManager local WeaponData = Manager and Manager.Get and Manager.Get(WeaponName) local Capacity = WeaponData and WeaponData.Data and WeaponData.Data.ClipSize or 0 local AmmoPrefix = Character and "Player" or "Dropped" Entry.Ammo.Visible = Category == "Bomb" and Get("C4 Timer Bar", false) or Category ~= "Bomb" and Get(AmmoPrefix .. " Ammo Bar", false) and Ammo ~= nil and Capacity > 0 local AmmoHeight = Get("Player Ammo Bar Height", 4) Text(Entry.Name, Get(Prefix .. " Name", false), Display, X, Y - RowHeight - 3, Width, Color(Prefix .. " Name Color", White)) local Bottom = Y + Height + (Entry.Ammo.Visible and AmmoHeight + 5 or 3) Text(Entry.Distance, Get(Prefix .. " Distance", false), string.format("%dst", (Camera.CFrame.Position - Center).Magnitude + 0.5), X, Bottom, Width, Color(Prefix .. " Distance Color", White)) if Entry.Distance.Visible then Bottom += RowHeight end Text(Entry.Weapon, Character and Get("Player Weapon", false), WeaponName, X, Bottom, Width, Color("Player Weapon Color", White)) if Entry.Weapon.Visible then Bottom += RowHeight end local Icon = WeaponIcon(Category == "Bomb" and "C4" or WeaponName) Entry.Icon.Visible = Get(Prefix .. " Icon", false) and Icon ~= nil if Icon then local Image = tostring(Icon) local Tint, Opacity = Color(Prefix .. " Icon Color", White) Entry.Icon.Image, Entry.Icon.Position = Image:match("^%d+$") and "rbxassetid://" .. Image or Image, UDim2.fromOffset(X - 5, Bottom) Entry.Icon.Size, Entry.Icon.ImageColor3, Entry.Icon.ImageTransparency = UDim2.fromOffset(Width + 10, Get("Player Icon Size", 22)), Tint, Transparency(Opacity) if Entry.Icon.Visible then Bottom += Entry.Icon.Size.Y.Offset + 2 end end local SidePadding = Character and Get("Player Armor", false) and Get("Player Armor Width", 4) + 8 or 4 Text(Entry.AmmoText, Category ~= "Bomb" and Get(AmmoPrefix .. " Ammo Text", false) and Ammo ~= nil, Ammo or "", X + Width + SidePadding + 30, Y + Height - RowHeight, 0, Color(AmmoPrefix .. " Ammo Color", White)) Entry.AmmoText.TextXAlignment = Enum.TextXAlignment.Left Entry.Ammo.Position, Entry.Ammo.Size = UDim2.fromOffset(X, Y + Height + 2), UDim2.fromOffset(Width, AmmoHeight) local AmmoTint, AmmoOpacity = Color(AmmoPrefix .. " Ammo Color", White) Entry.AmmoFill.Size, Entry.AmmoFill.BackgroundColor3 = UDim2.fromScale(math.clamp((Ammo or 0) / math.max(1, Capacity), 0, 1), 1), AmmoTint Entry.AmmoFill.BackgroundTransparency = Transparency(AmmoOpacity) if Category == "Bomb" then local Remaining = math.max(0, tonumber(Data.BlowTimer) or 0) Text(Entry.Timer, Get("C4 Timer Text", false), string.format("%.1fs", Remaining), X, Bottom, Width, Color("C4 Timer Color", White)) Entry.Ammo.Visible = Get("C4 Timer Bar", false) local TimerTint, TimerOpacity = Color("C4 Timer Color", White) Entry.AmmoFill.Size, Entry.AmmoFill.BackgroundColor3 = UDim2.fromScale(math.clamp(Remaining / 40, 0, 1), 1), TimerTint Entry.AmmoFill.BackgroundTransparency = Transparency(TimerOpacity) end if not Character then return end Entry.Health.Visible, Entry.Armor.Visible = Get("Player Health", false), Get("Player Armor", false) local HealthWidth = Get("Player Health Width", 4) Entry.Health.Position, Entry.Health.Size = UDim2.fromOffset(X - HealthWidth - 3, Y), UDim2.fromOffset(HealthWidth, Height) Entry.HealthFill.AnchorPoint, Entry.HealthFill.Position = Vector2.new(0, 1), UDim2.fromScale(0, 1) Entry.HealthFill.Size = UDim2.fromScale(1, math.clamp((Data.Health or 0) / 100, 0, 1)) local HealthColor, HealthOpacity = Color("Player Health Color", Color3.fromRGB(0, 255, 0)) local Health = math.clamp((Data.Health or 0) / 100, 0, 1) Entry.HealthGradient.Enabled = Get("Health Gradient", false) Entry.HealthFill.BackgroundColor3, Entry.HealthFill.BackgroundTransparency = HealthColor, Transparency(HealthOpacity) if Entry.HealthGradient.Enabled then local Low, LowOpacity = Color("Low Health", Color3.new(1, 0, 0)) local Mid, MidOpacity = Color("Mid Health", Color3.fromRGB(255, 165, 0)) local High, HighOpacity = Color("High Health", Color3.new(0, 1, 0)) Entry.HealthFill.BackgroundColor3, Entry.HealthFill.BackgroundTransparency = White, 0 Gradient(Entry.HealthGradient, true, High, HighOpacity, Low, LowOpacity, 90, Mid, MidOpacity) if Health < 0.5 then local Ratio = Health * 2 HealthColor, HealthOpacity = Low:Lerp(Mid, Ratio), LowOpacity + (MidOpacity - LowOpacity) * Ratio else local Ratio = Health * 2 - 1 HealthColor, HealthOpacity = Mid:Lerp(High, Ratio), MidOpacity + (HighOpacity - MidOpacity) * Ratio end end if Get("Health Text Color Mode", "Health") == "Custom" then HealthColor, HealthOpacity = Color("Health Text Color", White) end Text(Entry.HealthText, Get("Player Health", false) and Get("Healthbar Text", false), math.ceil(Data.Health or 0), X, Y, 100, HealthColor, HealthOpacity) Entry.HealthText.AnchorPoint = Vector2.new(1, 0.5) Entry.HealthText.Position, Entry.HealthText.Size = UDim2.fromOffset(X - HealthWidth - 6, Y + Height * (1 - Health)), UDim2.fromOffset(160, RowHeight) Entry.HealthText.TextXAlignment, Entry.HealthText.TextYAlignment = Enum.TextXAlignment.Right, Enum.TextYAlignment.Center local Armor = Player and Player:GetAttribute("ArmorValue") or Data.ArmorValue Entry.Armor.Position, Entry.Armor.Size = UDim2.fromOffset(X + Width + 3, Y), UDim2.fromOffset(Get("Player Armor Width", 4), Height) Entry.ArmorFill.AnchorPoint, Entry.ArmorFill.Position = Vector2.new(0, 1), UDim2.fromScale(0, 1) local ArmorTint, ArmorOpacity = Color("Player Armor Color", Color3.fromRGB(90, 150, 255)) Entry.ArmorFill.Size, Entry.ArmorFill.BackgroundColor3 = UDim2.fromScale(1, math.clamp((tonumber(Armor) or 0) / 100, 0, 1)), ArmorTint Entry.ArmorFill.BackgroundTransparency = Transparency(ArmorOpacity) local Tags, Selected = {}, Get("Player Flags Types", {}) local Yaw, Pitch = Data.Yaw, Data.Pitch if Get("Player Flags", false) and type(Game.EntitySnapshot) == "function" and (Yaw == nil or Pitch == nil) then local Current = Game.EntitySnapshot(Data) local Snapshot = Current and Current.Snapshot if Snapshot then if Yaw == nil then Yaw = Snapshot.Yaw end if Pitch == nil then Pitch = Snapshot.Pitch end end end local function Tag(Name, TextValue, Condition) if Condition and type(Selected) == "table" and (Selected[Name] == true or table.find(Selected, Name)) then table.insert(Tags, TextValue) end end Tag("Defuse kit", "KIT", Player and Player:GetAttribute("DefuseKit")) Tag("Bomb", "BOMB", WeaponName == "C4" or WeaponName == "Bomb") Tag("Planting", "PLANT", Data.Planting) Tag("Defusing", "DEFUSE", Data.Defusing) Tag("Aiming", "ZOOM", Weapon and (Weapon.ZoomLevel or 0) > 0) Tag("Yaw", string.format("Y %.0f", math.deg(Yaw or 0)), true) Tag("Pitch", string.format("P %.0f", math.deg(Pitch or 0)), true) Tag("Team", tostring(Data.Team or Data.Data and Data.Data.Team or Player and Player:GetAttribute("Team") or ""), true) Text(Entry.Flags, Get("Player Flags", false) and #Tags > 0, table.concat(Tags, "\n"), X + Width + SidePadding + 30, Y, 80, Color("Player Flags Color", White)) Entry.Flags.TextXAlignment, Entry.Flags.TextYAlignment, Entry.Flags.Size = Enum.TextXAlignment.Left, Enum.TextYAlignment.Top, UDim2.fromOffset(100, RowHeight * math.max(1, #Tags)) if Get("Player Head Dot", false) and Head then local Point, Visible = Camera:WorldToViewportPoint(Game.PartPosition(Data, Head)) local Size = Get("Player Head Dot Size", 5) local HeadTint, HeadOpacity = Color("Player Head Dot Color", White) Entry.Head.Visible, Entry.Head.Position, Entry.Head.Size, Entry.Head.BackgroundColor3 = Visible, UDim2.fromOffset(Point.X, Point.Y), UDim2.fromOffset(Size, Size), HeadTint Entry.Head.BackgroundTransparency = Transparency(HeadOpacity) end if Get("Player Skeleton", false) then for Index, Bone in Bones do local A, B = Model:FindFirstChild(Bone[1]), Model:FindFirstChild(Bone[2]) if A and B then local AP, AV = Camera:WorldToViewportPoint(Game.PartPosition(Data, A)) local BP, BV = Camera:WorldToViewportPoint(Game.PartPosition(Data, B)) if AV and BV then if Get("Skeleton Outline", false) then Line(Entry.SkeletonOutlines[Index], Vector2.new(AP.X, AP.Y), Vector2.new(BP.X, BP.Y), Get("Skeleton Outline Thickness", 3), Color("Skeleton Outline Color", Black)) end Line(Entry.Lines[Index], Vector2.new(AP.X, AP.Y), Vector2.new(BP.X, BP.Y), Get("Player Skeleton Thickness", 1), Color("Player Skeleton Color", White)) end end end end if Get("Player Tracer", false) then Line(Entry.Lines[#Bones + 1], Vector2.new(Camera.ViewportSize.X * 0.5, Camera.ViewportSize.Y), Vector2.new(X + Width * 0.5, Y + Height), Get("Player Tracer Thickness", 1), Color("Player Tracer Color", White)) end if Get("Player Chams", false) then if not Entry.Highlight then Entry.Highlight = New("Highlight", Services.Workspace, {Name = "Swift2Chams"}) end Entry.Highlight.Adornee, Entry.Highlight.Enabled = Model, true Entry.Highlight.DepthMode = Get("Player Chams Visible Only", false) and Enum.HighlightDepthMode.Occluded or Enum.HighlightDepthMode.AlwaysOnTop local Fill, FillAlpha = Color("Player Chams Color", White) local Edge, EdgeAlpha = Color("Player Chams Outline Color", White) Entry.Highlight.FillColor, Entry.Highlight.OutlineColor = Fill, Edge Entry.Highlight.FillTransparency, Entry.Highlight.OutlineTransparency = 1 - Get("Player Chams Opacity", 0.35) * (FillAlpha or 1), 1 - (EdgeAlpha or 1) end end function Self:Update() local Camera, Seen = Game.Camera(), {} for _, Category in {"Character", "Bomb", "DroppedWeapon"} do local Enabled = Camera and Get(Category == "Character" and "Esp Enabled" or Category .. " ESP", false) if Enabled then for Id, Data in Game.Entities(Category) do if type(Game.Entity) == "function" then Data = Game.Entity(Category, Id) end if not Data or type(Game.EntityCurrent) == "function" and not Game.EntityCurrent(Data, Category) then continue end local Key = Category .. ":" .. tostring(Id) local Entry = self.Entries[Key] if Entry and Entry.Entity ~= Data then Destroy(Entry); Entry = nil end if not Entry then Entry = Create(); Entry.Entity = Data; self.Entries[Key] = Entry end Seen[Key] = true Render(Category, Data, Entry, Camera) end end end for Key, Entry in self.Entries do if not Seen[Key] then Destroy(Entry) self.Entries[Key] = nil end end end function Self:Destroy() for _, Entry in self.Entries do if Entry.Highlight then Entry.Highlight:Destroy() end end table.clear(self.Entries) Gui:Destroy() end State.Controllers.ESP = Self end Functions.Utility.Register("ESP", State.Controllers.ESP, "Colon") do local Get, Color = Functions.Config.Get, Functions.Config.Color local Lighting, Terrain = State.Services.Lighting, State.Services.Workspace.Terrain local Self = {Originals = {}, Owned = {}, Objects = {}, Elapsed = 0} local function Object(Class, Parent) local Found = Self.Objects[Class] if Found and Found.Parent == Parent then return Found end Found = Parent:FindFirstChildOfClass(Class) if not Found then Found = Instance.new(Class) Found.Name = "Swift" .. Class if Found:IsA("PostEffect") or Class == "Clouds" then Found.Enabled = false end Self.Owned[Found] = true Found.Parent = Parent end Self.Objects[Class] = Found return Found end local function Reconcile(Desired) for Target, Saved in Self.Originals do for Property, Value in Saved do if not Desired[Target] or Desired[Target][Property] == nil then if Target.Parent then Target[Property] = Value end Saved[Property] = nil end end if not next(Saved) then Self.Originals[Target] = nil if Self.Owned[Target] then Target:Destroy(); Self.Owned[Target] = nil end end end for Target, Properties in Desired do local Saved = Self.Originals[Target] or {} Self.Originals[Target] = Saved for Property, Value in Properties do if Saved[Property] == nil then Saved[Property] = Target[Property] end if Target[Property] ~= Value then Target[Property] = Value end end end end local function Allowed(Class) if not Get("Disable Post Effects", false) then return true end local Disabled = Get("Disabled Effects", nil) return Disabled ~= nil and not table.find(Disabled, Class) end local function Update() local Desired, Properties = {}, {} Desired[Lighting] = Properties if Get("Fullbright", false) then Properties.Brightness = Get("World Brightness", 2) Properties.GlobalShadows = Get("World Shadows", "Off") == "On" Properties.Ambient, Properties.OutdoorAmbient = Color3.fromRGB(178, 178, 178), Color3.fromRGB(178, 178, 178) end if Get("Global Shadows Enabled", false) then Properties.GlobalShadows = Get("Global Shadows", "On") == "On" end if Get("Custom Time", false) then Properties.ClockTime = math.clamp(Get("Clock Time", 12), 0, 24) end if Get("Ambient Override", false) then Properties.Ambient = Color("Ambient Color", Color3.fromRGB(178, 178, 178)) Properties.OutdoorAmbient = Properties.Ambient end if Get("Remove Fog", false) then Properties.FogStart, Properties.FogEnd = 0, Get("Fog Distance", 1000000) for _, Object in Lighting:GetDescendants() do if Object:IsA("Atmosphere") then Desired[Object] = {Density = 0, Haze = 0} end end end if Get("Disable Post Effects", false) then local Selected = Get("Disabled Effects", nil) for _, Root in {Lighting, State.Services.Workspace.CurrentCamera} do for _, Object in Root:GetDescendants() do if Object:IsA("PostEffect") and (Selected == nil or table.find(Selected, Object.ClassName)) then Desired[Object] = {Enabled = false} end end end end if Get("Exposure Changer", false) then Properties.ExposureCompensation = Get("World Exposure", 0) end if Get("Environment Changer", false) then Properties.EnvironmentDiffuseScale = Get("Environment Diffuse", 1) Properties.EnvironmentSpecularScale = Get("Environment Specular", 1) Properties.GeographicLatitude = Get("Sun Latitude", 41.73) Properties.ColorShift_Top = Color("Light Top Color", Color3.new(0, 0, 0)) Properties.ColorShift_Bottom = Color("Light Bottom Color", Color3.new(0, 0, 0)) end if Get("Fog Changer", false) and not Get("Remove Fog", false) then Properties.FogColor = Color("World Fog Color", Color3.new(0.7, 0.75, 0.8)) Properties.FogStart = Get("World Fog Start", 0) Properties.FogEnd = math.max(Properties.FogStart + 1, Get("World Fog End", 500)) end if Get("Sunrays Changer", false) and Allowed("SunRaysEffect") then Desired[Object("SunRaysEffect", Lighting)] = {Enabled = true, Intensity = Get("Sunrays Intensity", 0.25), Spread = Get("Sunrays Spread", 1)} end if Get("Cloud Changer", false) then Desired[Object("Clouds", Terrain)] = {Enabled = true, Cover = Get("Cloud Cover", 0.5), Density = Get("Cloud Density", 0.6), Color = Color("Cloud Color", Color3.new(1, 1, 1))} end if Get("Bloom Changer", false) and Allowed("BloomEffect") then Desired[Object("BloomEffect", Lighting)] = {Enabled = true, Intensity = Get("Bloom Intensity", 0.6), Size = Get("Bloom Size", 24), Threshold = Get("Bloom Threshold", 0.9)} end if Get("Color Grading", false) and Allowed("ColorCorrectionEffect") then Desired[Object("ColorCorrectionEffect", Lighting)] = {Enabled = true, Brightness = Get("Grade Brightness", 0), Contrast = Get("Grade Contrast", 0.15), Saturation = Get("Grade Saturation", 0.2), TintColor = Color("Grade Tint", Color3.new(1, 1, 1))} end if Get("Depth Of Field", false) and Allowed("DepthOfFieldEffect") then Desired[Object("DepthOfFieldEffect", Lighting)] = {Enabled = true, FocusDistance = Get("Focus Distance", 25), InFocusRadius = Get("Focus Radius", 20), NearIntensity = Get("Near Blur", 0.1), FarIntensity = Get("Far Blur", 0.3)} end if Get("Atmosphere Changer", false) and not Get("Remove Fog", false) then Desired[Object("Atmosphere", Lighting)] = {Density = Get("Atmosphere Density", 0.3), Offset = Get("Atmosphere Offset", 0), Haze = Get("Atmosphere Haze", 1), Glare = Get("Atmosphere Glare", 0), Color = Color("Atmosphere Color", Color3.new(0.8, 0.85, 1)), Decay = Color("Atmosphere Decay", Color3.new(0.4, 0.45, 0.55))} end if Get("Water Changer", false) then Desired[Terrain] = {WaterColor = Color("Water Color", Color3.new(0.1, 0.4, 0.5)), WaterTransparency = Get("Water Transparency", 0.3), WaterReflectance = Get("Water Reflectance", 0.5), WaterWaveSize = Get("Water Wave Size", 0.15), WaterWaveSpeed = Get("Water Wave Speed", 10)} end Reconcile(Desired) end function Self:Update(Delta) Self.Elapsed += Delta if Self.Elapsed >= 0.1 then Self.Elapsed = 0; Update() end end function Self:Destroy() Reconcile({}) end State.Controllers.World = Self end Functions.Utility.Register("World", State.Controllers.World, "Colon") do local Get = Functions.Config.Get local Lighting = State.Services.Lighting local Self = {Hidden = {}, Elapsed = 0} local Faces = {"SkyboxBk", "SkyboxDn", "SkyboxFt", "SkyboxLf", "SkyboxRt", "SkyboxUp"} local Names = {"Back", "Down", "Front", "Left", "Right", "Up"} local Presets = { Sunset = {323494035, 323494368, 323494130, 323494252, 323494067, 323493360}, Galaxy = {159454299, 159454296, 159454293, 159454286, 159454300, 159454288}, ["Red Night"] = {401664839, 401664862, 401664960, 401664881, 401664901, 401664936}, ["Warm Horizon"] = {162001887, 161998893, 162001897, 162001904, 162001919, 162001926}, } local function Asset(Value) local Id = tostring(Value or ""):match("^%s*(%d+)%s*$") or tostring(Value or ""):match("^rbxassetid://(%d+)$") return Id and tonumber(Id) > 0 and "rbxassetid://" .. Id or nil end function Self:Clear() if self.Sky then self.Sky:Destroy(); self.Sky = nil end for Object in self.Hidden do if Object.Parent == nil then Object.Parent = Lighting end; self.Hidden[Object] = nil end end function Self:Update(Delta) self.Elapsed += Delta if self.Elapsed < 0.1 then return end self.Elapsed = 0 if not Get("Custom Sky", false) then self:Clear(); return end if not self.Sky then self.Sky = Instance.new("Sky"); self.Sky.Name = "Swift2Sky"; self.Sky.CelestialBodiesShown = false; self.Sky.Parent = Lighting end for _, Object in Lighting:GetChildren() do if Object:IsA("Sky") and Object ~= self.Sky then self.Hidden[Object] = true; Object.Parent = nil end end local Preset = Get("Sky Preset", "Sunset") local Values = Presets[Preset] or Presets.Sunset for Index, Face in Faces do self.Sky[Face] = Preset == "Custom" and (Asset(Get("Sky " .. Names[Index], "")) or Asset(Get("Sky All Faces", "")) or "rbxassetid://" .. Values[Index]) or "rbxassetid://" .. Values[Index] end end function Self:Destroy() self:Clear() end State.Controllers.Sky = Self end Functions.Utility.Register("Sky", State.Controllers.Sky, "Colon") do local Get, Color = Functions.Config.Get, Functions.Config.Color local Workspace = State.Services.Workspace local function CreateRain() return Functions.Visuals.CreateRain() end local Self = {Emitters = {}, Rain = nil, Values = {}, Elapsed = 0} local Definitions = { Snow = {Texture = "rbxassetid://241876428", Size = 0.15, Lifetime = 5, Speed = 5, Rate = 160, Radius = 32}, Orbs = {Texture = "rbxasset://textures/particles/flare_main.dds", Size = 0.22, Lifetime = 8, Speed = 0.6, Rate = 3, Radius = 12}, } local Parameters = RaycastParams.new() Parameters.FilterType = Enum.RaycastFilterType.Exclude local function ClearRain() if Self.Rain then Self.Rain:Destroy(); Self.Rain = nil end Self.RainCamera = nil table.clear(Self.Values) end local function Set(Name, Method, Value) if Self.Values[Name] ~= Value then Self.Values[Name] = Value Self.Rain[Method](Self.Rain, Value) end end local function ConfigureRain(Camera) if not Camera or not Get("Rain", false) then return end local Created = Self.Rain == nil if Created then Self.Rain = CreateRain() end local Character = State.LocalPlayer and State.LocalPlayer.Character local ThirdPerson = State.ThirdPersonModel local Map = Workspace:FindFirstChild("Map") local Geometry = Map and Map:FindFirstChild("Geometry") if Created or Self.RainCamera ~= Camera or Self.Character ~= Character or Self.ThirdPerson ~= ThirdPerson or Self.Geometry ~= Geometry then Self.RainCamera, Self.Character, Self.ThirdPerson, Self.Geometry = Camera, Character, ThirdPerson, Geometry if Geometry then Self.Rain:SetCollisionMode(Self.Rain.CollisionMode.Whitelist, {Geometry, Workspace.Terrain}) else local Ignore = {Camera} if State.Characters then table.insert(Ignore, State.Characters) end if Character then table.insert(Ignore, Character) end if ThirdPerson then table.insert(Ignore, ThirdPerson) end Self.Rain:SetCollisionMode(Self.Rain.CollisionMode.Blacklist, Ignore) end end local Tint, Opacity = Color("Rain Color", Color3.new(0.8, 0.85, 1)) Set("RoofCheck", "SetRoofCheck", Get("Rain Roof Check", false)) Set("Color", "SetColor", Tint) Set("Transparency", "SetTransparency", 1 - (Opacity or 1) * Get("Rain Opacity", 0.65)) Set("Intensity", "SetIntensityRatio", Get("Rain Intensity", 0.45)) Set("Speed", "SetSpeedRatio", Get("Rain Speed", 0.8)) Set("Radius", "SetRadius", Get("Rain Radius", 48)) Set("Splashes", "SetSplashRatio", Get("Rain Splashes", false) and 1 or 0) Set("Emission", "SetLightEmission", Get("Rain Light Emission", 0.05)) Set("Influence", "SetLightInfluence", Get("Rain Light Influence", 0.9)) Set("Volume", "SetVolume", Get("Rain Sound", false) and Get("Rain Volume", 0.2) or 0) local Strength = Get("Rain Wind", false) and Get("Rain Wind Strength", 0.25) or 0 local Angle = math.rad(Get("Rain Wind Direction", 0)) Set("Direction", "SetDirection", Vector3.new(math.sin(Angle) * Strength, -1, math.cos(Angle) * Strength).Unit) if Created then Self.Rain:Enable() end end local function Clear(Name) local Entry = Self.Emitters[Name] if Entry then Entry.Anchor:Destroy(); Self.Emitters[Name] = nil end end local function Create(Name, Camera) local Anchor = Instance.new("Part") Anchor.Name, Anchor.Anchored, Anchor.Transparency, Anchor.CastShadow = "Swift2" .. Name, true, 1, false Anchor.CanCollide, Anchor.CanTouch, Anchor.CanQuery = false, false, false local Emitter = Instance.new("ParticleEmitter", Anchor) Emitter.Shape, Emitter.ShapeStyle = Enum.ParticleEmitterShape.Box, Enum.ParticleEmitterShapeStyle.Volume Emitter.EmissionDirection, Emitter.SpreadAngle, Emitter.LightInfluence = Enum.NormalId.Bottom, Vector2.new(10, 10), 0 Emitter.Orientation = Enum.ParticleOrientation.FacingCamera Emitter.Enabled, Emitter.LockedToPart, Emitter.VelocityInheritance = false, Name == "Orbs", 0 if Name == "Orbs" then Emitter.EmissionDirection, Emitter.SpreadAngle, Emitter.Drag = Enum.NormalId.Top, Vector2.new(180, 180), 0.2 end local Entry = {Anchor = Anchor, Emitter = Emitter, Camera = Camera} Self.Emitters[Name] = Entry return Entry end function Self:Update(Delta) Delta = Delta or 1 / 60 local Camera = Functions.Game.Camera() if self.Rain and (not Camera or not Get("Rain", false) or self.RainCamera ~= Camera) then ClearRain() end for Name, Entry in self.Emitters do if not Camera or not Get(Name, false) or Entry.Camera ~= Camera then Clear(Name) end end self.Elapsed += Delta if self.Elapsed < 0.1 then for Name, Entry in self.Emitters do if Camera then Entry.Anchor.CFrame = CFrame.new(Camera.CFrame.Position + Vector3.new(0, Name == "Orbs" and 0 or 15, 0)) end end return end self.Elapsed = 0 ConfigureRain(Camera) for Name, Definition in Definitions do if not Camera or not Get(Name, false) then Clear(Name); continue end local Entry = self.Emitters[Name] or Create(Name, Camera) local Radius = math.clamp(Get(Name .. " Radius", Definition.Radius), 5, Name == "Orbs" and 80 or 150) local Tint, Opacity = Color(Name .. " Color", Name == "Orbs" and Color3.fromRGB(170, 150, 255) or Color3.new(0.85, 0.9, 1)) local Emitter = Entry.Emitter local Texture = tostring(Get(Name .. " Texture", "")):match("^%s*(.-)%s*$") Emitter.Texture = Texture ~= "" and (Texture:match("^%d+$") and "rbxassetid://" .. Texture or Texture) or Definition.Texture Emitter.Color, Emitter.Size = ColorSequence.new(Tint), NumberSequence.new(Get(Name .. " Size", Definition.Size)) local Transparency = 1 - (Opacity or 1) * Get(Name .. " Opacity", Name == "Orbs" and 1 or 0.65) Emitter.Transparency = NumberSequence.new({NumberSequenceKeypoint.new(0, 1), NumberSequenceKeypoint.new(Name == "Orbs" and 0.08 or 0.1, Transparency), NumberSequenceKeypoint.new(Name == "Orbs" and 0.8 or 0.85, Transparency), NumberSequenceKeypoint.new(1, 1)}) Emitter.Lifetime = NumberRange.new(Definition.Lifetime) local Speed = Get(Name .. " Speed", Definition.Speed) local Count = Name == "Orbs" and math.floor(math.clamp(Get("Orbs Count", 24), 5, 100)) if Name == "Orbs" then Speed = math.clamp(Speed, 0, 5) end Emitter.Speed = Name == "Orbs" and NumberRange.new(Speed * 0.5, Speed) or NumberRange.new(Speed) Emitter.Rate = Count and Count / Definition.Lifetime or Get("Snow Density", 90) Emitter.LightEmission = Get(Name .. " Light Emission", Name == "Orbs" and Get("Orbs Glow", 0.7) or Get("Snow Glow", 0.2)) Emitter.LightInfluence = Get(Name .. " Light Influence", 0) local Wind = Get(Name .. " Wind", false) and Get(Name .. " Wind Strength", 0.25) * 30 or 0 local Angle = math.rad(Get(Name .. " Wind Direction", 0)) Emitter.Acceleration = Vector3.new(math.sin(Angle) * Wind, Name == "Orbs" and 0.08 or -3, math.cos(Angle) * Wind) if Name == "Snow" then Emitter.Acceleration = Vector3.new(Get("Snow Drift", 1), -0.3, 0) end Entry.Anchor.Size = Vector3.new(Radius * 2, Name == "Orbs" and Radius or 1, Radius * 2) Entry.Anchor.CFrame, Entry.Anchor.Parent = CFrame.new(Camera.CFrame.Position + Vector3.new(0, Name == "Orbs" and 0 or 15, 0)), Camera if Get(Name .. " Roof Check", false) then Parameters.FilterDescendantsInstances = {Camera, State.Characters or Camera} Emitter.Enabled = Workspace:Raycast(Camera.CFrame.Position, Vector3.new(0, 32, 0), Parameters) == nil else Emitter.Enabled = true end if Count and Emitter.Enabled and Entry.Count ~= Count then if Entry.Count then Emitter:Clear() end Emitter:Emit(Count) Entry.Count = Count end end end function Self:Destroy() ClearRain() for Name in self.Emitters do Clear(Name) end end State.Controllers.Weather = Self end Functions.Utility.Register("Weather", State.Controllers.Weather, "Colon") do local Get, Color = Functions.Config.Get, Functions.Config.Color local Game, Utility = Functions.Game, Functions.Utility local Identity, Connect, Own, Notify = Utility.Identity, Utility.Connect, Utility.Own, Utility.Notify local Parent = State.GuiParent or State.Services.CoreGui local Self = {Circles = {}, Time = 0} local Parameters = RaycastParams.new() Parameters.FilterType, Parameters.RespectCanCollide = Enum.RaycastFilterType.Exclude, false local Segments = 48 local function Clear() for _, Circle in Self.Circles do Circle.Model:Destroy() end table.clear(Self.Circles) Self.Grounded, Self.Character, Self.Ground = nil, nil, nil end local function Trace(Position) local Ignore = {State.Characters, Game.Camera()} if State.ThirdPersonModel then table.insert(Ignore, State.ThirdPersonModel) end local Map = State.Services.Workspace:FindFirstChild("Map") local Geometry = Map and Map:FindFirstChild("Geometry") Parameters.FilterType = Geometry and Enum.RaycastFilterType.Include or Enum.RaycastFilterType.Exclude Parameters.FilterDescendantsInstances = Geometry and {Geometry, State.Services.Workspace.Terrain} or Ignore return State.Services.Workspace:Raycast(Position + Vector3.new(0, 1, 0), Vector3.new(0, -64, 0), Parameters) end local function Spawn(Hit) if not Hit then return end if #Self.Circles >= 4 then table.remove(Self.Circles, 1).Model:Destroy() end local Model, Parts = Instance.new("Model"), {} Model.Name, Model.Parent = "SwiftJumpCircle", Game.Camera() local Origin = Hit.Position + Hit.Normal * 0.08 local Right = Hit.Normal:Cross(math.abs(Hit.Normal.X) < 0.9 and Vector3.new(1, 0, 0) or Vector3.new(0, 0, 1)).Unit local Forward = Right:Cross(Hit.Normal).Unit local Tint, Alpha = Color("Jump Circle Color", Color3.new(1, 1, 1)) local EndColor = Color("Jump Circle End Color", Tint) for Index = 1, Segments do local Part = Instance.new("Part") Part.Name, Part.Shape, Part.Anchored = "Ring", Enum.PartType.Cylinder, true Part.CanCollide, Part.CanTouch, Part.CanQuery, Part.CastShadow = false, false, false, false Part.Material, Part.Color, Part.Transparency = Get("Jump Circle Glow", false) and Enum.Material.Neon or Enum.Material.SmoothPlastic, Tint, 1 Part.Parent = Model Parts[Index] = Part end table.insert(Self.Circles, {Model = Model, Parts = Parts, Origin = Origin, Right = Right, Forward = Forward, Time = Self.Time, Duration = math.max(0.1, Get("Jump Circle Duration", 1)), Radius = Get("Jump Circle Radius", 4), Thickness = Get("Jump Circle Thickness", 0.1), Color = Tint, EndColor = EndColor, Alpha = Alpha}) end function Self:Update(Delta) Self.Time += Delta local Simulation, Character = Game.Simulation() if not Get("Jump Circles", false) or not Simulation or not Game.Camera() or Character and Character.Health and Character.Health <= 0 then Clear(); return end if Self.Character ~= Character then Clear(); Self.Character = Character end local Grounded = Simulation.OnGround ~= false if Self.Grounded ~= nil and Self.Grounded ~= Grounded then if not Grounded then Spawn(Self.Ground or Trace(Simulation.Position)) elseif Get("Jump Circle Landing", false) then Spawn(Trace(Simulation.Position)) end end if Grounded then Self.Ground = Trace(Simulation.Position) end Self.Grounded = Grounded for Index = #Self.Circles, 1, -1 do local Circle = Self.Circles[Index] local Progress = math.clamp((Self.Time - Circle.Time) / Circle.Duration, 0, 1) if Progress >= 1 then Circle.Model:Destroy(); table.remove(Self.Circles, Index) else Circle.Model.Parent = Game.Camera() local Radius = Circle.Radius * (0.1 + 0.9 * (1 - (1 - Progress) ^ 3)) local Color = Circle.Color:Lerp(Circle.EndColor, Progress) for Segment, Part in Circle.Parts do local A, B = (Segment - 1) / Segments * math.pi * 2, Segment / Segments * math.pi * 2 local First = Circle.Origin + (Circle.Right * math.cos(A) + Circle.Forward * math.sin(A)) * Radius local Last = Circle.Origin + (Circle.Right * math.cos(B) + Circle.Forward * math.sin(B)) * Radius Part.Size = Vector3.new((Last - First).Magnitude + Circle.Thickness * 0.2, Circle.Thickness, Circle.Thickness) Part.CFrame = CFrame.lookAt((First + Last) * 0.5, Last) * CFrame.Angles(0, math.pi * 0.5, 0) Part.Color, Part.Transparency = Color, 1 - Circle.Alpha * (1 - Progress) ^ 0.7 end end end end Connect(State.Services.Workspace:GetPropertyChangedSignal("CurrentCamera"), Clear) function Self:Destroy() Clear() end State.Controllers.JumpCircle = Self end Functions.Utility.Register("JumpCircle", State.Controllers.JumpCircle, "Colon") do local Get, Color = Functions.Config.Get, Functions.Config.Color local Game, Utility = Functions.Game, Functions.Utility local Identity, Connect, Own, Notify = Utility.Identity, Utility.Connect, Utility.Own, Utility.Notify local Parent = State.GuiParent or State.Services.CoreGui local Self = {Alive = true, Halo = nil, Aura = nil, Clock = 0, Request = 0, Templates = {}, Failed = {}} local Assets = {Starlight = "134645216613107", Heavenly = "139300897520961", Ribbon = "132069507632161", Sakura = "81755778619404", Angel = "97658130917593", Wind = "80694081850877", Flow = "119913533725648", Star = "73754563740680"} local Folder local function Part(Name, Parent, Shape) local Object = Instance.new(Shape or "Part") Object.Name, Object.Anchored, Object.Massless, Object.Material = Name, false, true, Enum.Material.Neon Object.LocalTransparencyModifier = 0 Object.CanCollide, Object.CanTouch, Object.CanQuery, Object.CastShadow = false, false, false, false Object.Parent = Parent return Object end local function Clear(Name) if Self[Name] then Self[Name].Model:Destroy(); Self[Name] = nil end end local function Create(Name, Count, Anchor) local Model = Instance.new("Model") Model.Name, Model.Parent = "Swift" .. Name, Folder local Data = {Model = Model, Parts = {}, Joints = {}, Anchor = Anchor} for Index = 1, Count do local Object = Part(Name .. Index, Model) Object.Shape = Enum.PartType.Cylinder Object.CFrame = Anchor.CFrame local Joint = Instance.new("Weld") Joint.Name, Joint.Part0, Joint.Part1, Joint.C0 = Name .. "Joint", Anchor, Object, CFrame.new() Joint.Parent = Object table.insert(Data.Parts, Object) table.insert(Data.Joints, Joint) end Self[Name] = Data return Data end local function Source() local _, Character = Game.Simulation() if Character and type(Character.Health) == "number" and Character.Health <= 0 then return nil end local Model = Get("Avatar Replacer", false) and State.AvatarModel or nil if not Model or not Model.Parent then Model = State.ThirdPersonModel end if not Model or not Model.Parent then return nil end local Root = Model and (Model:FindFirstChild("UpperTorso") or Model:FindFirstChild("Torso") or Model:FindFirstChild("HumanoidRootPart")) local Head = Model and Model:FindFirstChild("Head") if not Root or not Root:IsA("BasePart") or not Head or not Head:IsA("BasePart") then return nil end return Root, Head, Model end local function PrepareAura(Template, Model) Clear("Aura") if not Model then return end local Container = Instance.new("Folder") Container.Name, Container.Parent = "SwiftAura", Folder local Clone, Owned, Emitters = Template:Clone(), {}, {} for _, Item in Clone:GetDescendants() do if Item:IsA("LuaSourceContainer") then Item:Destroy() end end for _, Body in Clone:GetChildren() do local Target = Model:FindFirstChild(Body.Name) if Target and Target:IsA("BasePart") then for _, Item in Body:GetChildren() do if Item:IsA("Attachment") or Item:IsA("ParticleEmitter") or Item:IsA("Beam") or Item:IsA("Trail") then Item.Parent = Target table.insert(Owned, Item) if Item:IsA("ParticleEmitter") or Item:IsA("Beam") or Item:IsA("Trail") then table.insert(Emitters, Item) end for _, Child in Item:GetDescendants() do if Child:IsA("ParticleEmitter") or Child:IsA("Beam") or Child:IsA("Trail") then table.insert(Emitters, Child) end end end end end end Clone:Destroy() Self.Aura = {Model = Container, Source = Model, Owned = Owned, Emitters = Emitters} end local function RemoveAura() if Self.Aura then for _, Item in Self.Aura.Owned do Item:Destroy() end end Clear("Aura") end local function ResetSource(Model) Clear("Halo"); RemoveAura() if Folder then Folder:Destroy(); Folder = nil end Self.Source = Model if Model then Folder = Instance.new("Folder") Folder.Name, Folder.Parent = "SwiftCharacterEffects", Model end end local function UpdateAura(Model) local Preset = Get("Character Aura Preset", "Angel") if not Get("Character Aura", false) or not Model then if Self.Loading then Self.Request += 1; Self.Loading = nil end RemoveAura() return end if Self.Aura and (Self.Aura.Source ~= Model or Self.Aura.Preset ~= Preset) then RemoveAura() end if not Self.Aura and not Self.Loading and not Self.Failed[Preset] and Assets[Preset] then if Self.Templates[Preset] then PrepareAura(Self.Templates[Preset], Model) if Self.Aura then Self.Aura.Preset = Preset end else Self.Request += 1 local Request = Self.Request Self.Loading = Preset task.spawn(function() local Okay, Objects = Identity(function() return game:GetObjects("rbxassetid://" .. Assets[Preset]) end, 2) local Template = Okay and Objects and Objects[1] if Request ~= Self.Request or not State.Alive or not Self.Alive then if Template then Template:Destroy() end return end Self.Loading = nil if not Template then Self.Failed[Preset] = true Notify("Could Not Load " .. Preset .. " Aura", "Warning") return end Self.Templates[Preset] = Template end) end end if Self.Aura then local Color, Alpha = Color("Character Aura Color", Color3.fromRGB(133, 220, 255)) if Self.Aura.Color ~= Color or Self.Aura.Alpha ~= Alpha then for _, Item in Self.Aura.Emitters do Item.Color = ColorSequence.new(Color) if Item:IsA("ParticleEmitter") then Item.Transparency = NumberSequence.new(1 - Alpha) end end Self.Aura.Color, Self.Aura.Alpha = Color, Alpha end end end function Self:Update(Delta) if not Self.Alive then return end if not Get("Character Halo", false) and not Get("Character Aura", false) then ResetSource(nil) if Self.Loading then Self.Request += 1; Self.Loading = nil end return end Self.Clock += math.clamp(Delta or 0, 0, 0.1) local Root, Head, Model = Source() if not Root then ResetSource(nil) return end if Self.Source ~= Model or not Folder or not Folder.Parent then ResetSource(Model) end if Get("Character Halo", false) then if Self.Halo and Self.Halo.Anchor ~= Head then Clear("Halo") end local Halo = Self.Halo or Create("Halo", 48, Head) local Radius, Thickness = Get("Halo Radius", 1), Get("Halo Thickness", 0.08) local Color, Alpha = Color("Halo Color", Color3.fromRGB(255, 215, 110)) local Bob = Get("Halo Animation", false) and math.sin(Self.Clock * Get("Halo Speed", 1.5)) * 0.15 or 0 local Center = CFrame.new(0, Get("Halo Height", 1.2) + Bob, 0) * CFrame.Angles(math.rad(Get("Halo Tilt", 0)), 0, 0) for Index, Object in Halo.Parts do local Angle, Next = (Index - 1) * math.pi / 24, Index * math.pi / 24 local A, B = Vector3.new(math.cos(Angle) * Radius, 0, math.sin(Angle) * Radius), Vector3.new(math.cos(Next) * Radius, 0, math.sin(Next) * Radius) Object.Size = Vector3.new((B - A).Magnitude + 0.01, Thickness, Thickness) local Offset = Center * CFrame.lookAt((A + B) * 0.5, B) * CFrame.Angles(0, math.pi / 2, 0) Halo.Joints[Index].C0 = Offset Object.Color, Object.Transparency = Color, 1 - Alpha Object.LocalTransparencyModifier = 0 end else Clear("Halo") end UpdateAura(Model) end function Self:Destroy() self.Alive = false self.Request += 1 ResetSource(nil) for _, Template in self.Templates do Template:Destroy() end end State.Controllers.CharacterEffects = Self end Functions.Utility.Register("CharacterEffects", State.Controllers.CharacterEffects, "Colon") do local Get, Color = Functions.Config.Get, Functions.Config.Color local Game, Utility = Functions.Game, Functions.Utility local Identity, Connect, Own, Notify = Utility.Identity, Utility.Connect, Utility.Own, Utility.Notify local Parent = State.GuiParent or State.Services.CoreGui local Services, Modules = State.Services, State.Modules local Gui = Own(Instance.new("ScreenGui")) Gui.Name, Gui.ResetOnSpawn, Gui.IgnoreGuiInset, Gui.DisplayOrder = "Swift2Effects", false, true, 3 Gui.Parent = Parent local Self = {Sounds = {}, Objects = {}, LastShoot = 0} local HitSounds = Functions.Visuals.Sounds local function Track(Object, Lifetime, Fade) table.insert(Self.Objects, {Object = Object, Expiry = os.clock() + Lifetime, Fade = Fade}) if #Self.Objects > 128 then table.remove(Self.Objects, 1).Object:Destroy() end end local function Asset(Value) if type(Value) ~= "string" or Value == "" then return nil end if Value:match("^%d+$") then return "rbxassetid://" .. Value end if Value:match("^rbxassetid://") or Value:match("^rbxasset://") then return Value end if type(getcustomasset) == "function" and type(isfile) == "function" and isfile(Value) then local Okay, Result = pcall(getcustomasset, Value) if Okay then return Result end end return nil end local function PlaySound(Value, Volume, Speed) local SoundId = Asset(Value) if not SoundId then return end local Sound = Instance.new("Sound") Sound.SoundId, Sound.Volume, Sound.PlaybackSpeed, Sound.Parent = SoundId, Volume or 1, Speed or 1, Gui Track(Sound, 8) Sound:Play() end function Self:PreviewHitSound(Headshot) local Preset = Get(Headshot and "Headshot Sound Preset" or "Bodyshot Sound Preset", "Custom") local Value = Preset == "Custom" and Get(Headshot and "Headshot Sound" or "Bodyshot Sound", "") or HitSounds:Resolve(Preset) PlaySound(Value, Get("Hit Sound Volume", 1), Get("Hit Sound Speed", 1)) end local function Tracer(Start, Finish) if typeof(Start) ~= "Vector3" or typeof(Finish) ~= "Vector3" then return end local Delta = Finish - Start if Delta.Magnitude <= 0.01 then return end local Part = Instance.new("Part") Part.Name, Part.Anchored, Part.CanCollide, Part.CanTouch, Part.CanQuery = "Swift2Tracer", true, false, false, false Part.Material, Part.CastShadow = Enum.Material.Neon, false Part.Color = Color("Bullet Tracer Color", Color3.new(1, 1, 1)) local Opacity, Width = Get("Bullet Tracer Opacity", 0.9), Get("Bullet Tracer Width", 0.05) local Style = Get("Bullet Tracer Style", "Solid") local Beam if Style == "Solid" then Part.Transparency, Part.Size = 1 - Opacity, Vector3.new(Width, Width, Delta.Magnitude) Part.CFrame = CFrame.lookAt((Start + Finish) * 0.5, Finish) else Part.Transparency, Part.Size, Part.CFrame = 1, Vector3.new(0.05, 0.05, 0.05), CFrame.new(Start) local A, B = Instance.new("Attachment", Part), Instance.new("Attachment", Part) B.Position = Delta Beam = Instance.new("Beam") Beam.Attachment0, Beam.Attachment1, Beam.FaceCamera, Beam.Segments = A, B, true, 1 Beam.Width0, Beam.Width1, Beam.LightEmission, Beam.LightInfluence = Width, Width, 1, 0 local Textures = {Laser = "12781800668", Light = "2382169232", Flow = "12788927812"} Beam.Texture, Beam.TextureMode = "rbxassetid://" .. (Textures[Style] or Textures.Laser), Enum.TextureMode.Wrap Beam.TextureLength, Beam.TextureSpeed = Style == "Light" and 15 or 2, Get("Bullet Tracer Texture Speed", 1.5) local EndColor = Get("Bullet Tracer Gradient", false) and Color("Bullet Tracer End Color", Part.Color) or Part.Color Beam.Color = ColorSequence.new(Part.Color, EndColor) Beam.Transparency, Beam.Parent = NumberSequence.new(1 - Opacity), Part end Part.Parent = Services.Workspace Track(Part, Get("Bullet Tracer Lifetime", 2), {Beam = Beam, Opacity = Opacity}) end local TracerController = Functions.Visuals.CreateTracers(Tracer) local function Impact(Position) if typeof(Position) ~= "Vector3" then return end local Part = Instance.new("Part") Part.Name, Part.Anchored, Part.CanCollide, Part.CanTouch, Part.CanQuery = "Swift2Impact", true, false, false, false Part.Material, Part.CastShadow = Enum.Material.Neon, false Part.Color = Color("Bullet Impact Color", Color3.fromRGB(255, 70, 70)) local Size = Get("Bullet Impact Size", 0.3) Part.Size, Part.Position, Part.Parent = Vector3.new(Size, Size, Size), Position, Services.Workspace Track(Part, Get("Bullet Impact Lifetime", 2)) end local function SoundAllowed(Name) local Categories = Get("Sound ESP Types", {}) local Lower = string.lower(Name) local Kind = "Other" if Lower:find("fire", 1, true) or Lower:find("reload", 1, true) or Lower:find("weapon", 1, true) then Kind = "Weapons" elseif Lower:find("bomb", 1, true) or Lower:find("c4", 1, true) or Lower:find("plant", 1, true) or Lower:find("defus", 1, true) then Kind = "Bomb" elseif Lower:find("footstep", 1, true) or Lower:find("landing", 1, true) or Lower:find("ladder", 1, true) then Kind = "Footsteps" elseif Lower:find("impact", 1, true) or Lower:find("hit", 1, true) then Kind = "Impacts" elseif Lower:find("pickup", 1, true) or Lower:find("drop", 1, true) then Kind = "Items" elseif Lower:find("menu", 1, true) or Lower:find("ui", 1, true) then Kind = "Misc" end for _, Category in Categories do if Category == Kind then return true end end return false end local function AddSound(Name, Position) if not Get("Sound ESP", false) or not SoundAllowed(Name) or typeof(Position) ~= "Vector3" then return end local Text = Instance.new("TextLabel") Text.BackgroundTransparency, Text.BorderSizePixel, Text.AnchorPoint = 1, 0, Vector2.new(0.5, 0.5) Text.Size, Text.TextSize, Text.Font, Text.TextColor3 = UDim2.fromOffset(220, 18), 12, Enum.Font.Code, Color("Sound ESP Color", Color3.new(1, 1, 1)) Text.Text, Text.Parent = Name, Gui local Stroke = Instance.new("UIStroke", Text) Stroke.Thickness, Stroke.Color = 1, Color3.new(0, 0, 0) local Entry = {Label = Text, Position = Position, Expiry = os.clock() + Get("Sound ESP Lifetime", 4)} table.insert(Self.Sounds, Entry) end Functions.Hooks.Add("Effects.Process", Modules.WeaponEffects.Process, function(Original, Weapon, Impacts, Tracers, Hits, Dual, Silenced) Identity(function() if Weapon and Weapon == Modules.Weapon.GetCurrentWeapon() then if Get("Bullet Tracer", false) and Tracers then if TracerController then TracerController:Process(Weapon, Tracers, Dual, Silenced) else local Muzzle = Weapon.Viewmodel and Weapon.Viewmodel:FindFirstChild(Silenced and "SilencerMuzzle" or Dual and "LeftMuzzle" or "Muzzle") for _, Data in Tracers do if Data and typeof(Data.EndPosition) == "Vector3" then Tracer(Muzzle and Muzzle.Position or Data.StartPosition, Data.EndPosition) end end end end if Get("Bullet Impact", false) and Impacts then for _, Data in Impacts do if Data and not Data.Knife then Impact(Data.Position) end end end end if Hits then for Identifier, Data in Hits do local Target = Game.Entity("Character", Identifier) if Target and Functions.Target.Enemy(Target, true) then for _, Hit in Data[1] and Data or {Data} do local Name = Hit.Object and Hit.Object.Name or "body" if Get("Hit Notification", false) then local Player = Target.UserId and Services.Players:GetPlayerByUserId(Target.UserId) Notify(string.format("Hit %s in %s for %d", Player and Player.DisplayName or "Bot", Name, math.floor(Hit.Damage or 0)), "Success", Color("Hit Notification Color", Color3.new(1, 1, 1))) end if Get("Hit Sound", false) then Self:PreviewHitSound(Name == "Head") end end end end end end) return Original(Weapon, Impacts, Tracers, Hits, Dual, Silenced) end, {"Bullet Tracer", "Bullet Impact", "Hit Notification", "Hit Sound"}) Functions.Hooks.Add("Effects.Sound", Modules.Sound.Play, function(Original, Name, Data) local Replace = false Identity(function() if type(Name) == "string" then if Data and Data.Position then AddSound(Name, Data.Position) end if Get("Custom Shoot Sound", false) and Data and Data.LocalReplicated then local Weapon = Modules.Weapon.GetCurrentWeapon() local SoundA, SoundB if Weapon then SoundA = Modules.Sound.GetWeaponFireSound(Weapon.Name, true) SoundB = Modules.Sound.GetWeaponFireSound(Weapon.Name, false) end if Name == SoundA or Name == SoundB then PlaySound(Get("Shoot Sound Id", ""), Get("Shoot Sound Volume", 1), Get("Shoot Sound Speed", 1)) Replace = Get("Replace Shoot Sound", false) end end end end) if Replace then return end return Original(Name, Data) end, {"Sound ESP", "Custom Shoot Sound"}) function Self:Update() local Camera = Game.Camera() local Now = os.clock() for Index = #Self.Objects, 1, -1 do local Entry = Self.Objects[Index] if Now >= Entry.Expiry or not Entry.Object.Parent then Entry.Object:Destroy() table.remove(Self.Objects, Index) elseif Entry.Fade then local Alpha = 1 - Entry.Fade.Opacity * math.clamp((Entry.Expiry - Now) / 0.2, 0, 1) if Entry.Fade.Beam then Entry.Fade.Beam.Transparency = NumberSequence.new(Alpha) else Entry.Object.Transparency = Alpha end end end for Index = #Self.Sounds, 1, -1 do local Entry = Self.Sounds[Index] if os.clock() >= Entry.Expiry or not Entry.Label.Parent then Entry.Label:Destroy() table.remove(Self.Sounds, Index) elseif Camera then local Point, Visible = Camera:WorldToViewportPoint(Entry.Position) Entry.Label.Visible = Visible if Visible then Entry.Label.Position = UDim2.fromOffset(Point.X, Point.Y) end end end end function Self:Destroy() if TracerController then TracerController:Destroy() end for _, Entry in self.Sounds do Entry.Label:Destroy() end for _, Entry in self.Objects do Entry.Object:Destroy() end table.clear(self.Objects) Gui:Destroy() end State.Controllers.Effects = Self end Functions.Utility.Register("Effects", State.Controllers.Effects, "Colon") do local Get, Identity, Connect, Notify = Functions.Config.Get, Functions.Utility.Identity, Functions.Utility.Connect, Functions.Utility.Notify local Self = {NextMessage = 1, Elapsed = 0, LastEnabled = false} local Presets = {"swift on top", "get swift"} local function Message() local Choice = Get("Chatbot Message", "Rotate") if Choice == "Custom" then local Custom = tostring(Get("Chatbot Custom Message", "")):match("^%s*(.-)%s*$") return Custom ~= "" and Custom or nil end if Choice == "Swift On Top" then return Presets[1] end if Choice == "Get Swift" then return Presets[2] end local Selected = Presets[Self.NextMessage] Self.NextMessage = Self.NextMessage % #Presets + 1 return Selected end local function Send() if not State.Alive or not Get("Chatbot", false) then return end local Text = Message() if not Text then return end task.spawn(function() if not State.Alive or not Get("Chatbot", false) then return end local Chat = State.Services.TextChatService local Simulation = Functions.Game.Simulation() local Channel = Chat:FindFirstChild(Simulation and "AllChat" or "DeadChat") or Chat:FindFirstChild("AllChat") if not Channel then return end local Okay = Identity(function() Channel:SendAsync(Text) end) if not Okay then Notify("Chat message could not be sent", "Warning") end end) end function Self:OnKill() local Mode = Get("Chatbot Mode", "On Kill") if Mode == "On Kill" or Mode == "Both" then Send() end end Functions.Hooks.Add("Chatbot.KillFeed", State.Modules.KillFeed.NewKill, function(Original, ...) local Args = table.pack(...) local Result = table.pack(Original(...)) if Args[7] == State.LocalPlayer.Name and Args[6] ~= Args[7] then Self:OnKill() end return table.unpack(Result, 1, Result.n) end, {"Chatbot"}) function Self:Update(Delta) local Enabled = Get("Chatbot", false) if not Enabled then Self.Elapsed = 0; Self.LastEnabled = false; return end if not Self.LastEnabled then Self.Elapsed = 0; Self.LastEnabled = true end local Mode = Get("Chatbot Mode", "On Kill") if Mode ~= "Timed" and Mode ~= "Both" then return end Self.Elapsed += Delta or 0 local Interval = math.max(5, tonumber(Get("Chatbot Interval", 15)) or 15) if Self.Elapsed >= Interval then Self.Elapsed %= Interval; Send() end end function Self:Destroy() end State.Controllers.Chatbot = Self end Functions.Utility.Register("Chatbot", State.Controllers.Chatbot, "Colon") do local Library = State.Library local Self = {Sections = {}, Fields = {}, Names = {}} local Schema = { {"Minimum Damage", "Rage Minimum Damage", 0, 0, 200}, {"Minimum Hit Chance", "Rage Minimum Hit Chance", 65, 1, 100}, {"Accuracy Check", "Rage Accuracy Check", false}, {"Range", "Rage Range", 300, 10, 2000}, {"Hitbox", "Rage Hitbox", "Highest Damage", {"Highest Damage", "Head", "Torso", "Arms", "Legs"}}, {"Target Priority", "Rage Target Priority", "Highest Damage", {"Highest Damage", "Closest", "Crosshair", "Lowest Health"}}, {"Hitscan", "Rage Hitscan", false}, {"Wallbang", "Rage Wallbang", false}, {"Auto Stop", "Rage Auto Stop", false}, {"Auto Scope", "Rage Auto Scope", false}, {"Auto Crouch", "Rage Auto Crouch", false}, {"Auto Reload", "Rage Auto Reload", false}, } local Excluded = {Knives = true, Knife = true, Arms = true, Misc = true, Grenade = true, Grenades = true, Bomb = true} local function Prefix(Name) return "Weapon Config " .. Name .. " / " end local function Show() for Name, Section in Self.Sections do Section:SetVisible(Library.Flags["Weapon Config Editor"] == Name) end end for _, Field in Schema do Self.Fields[Field[2]] = Field end local Section = State.UI.Tabs.Rage:AddSection({Title = "Weapon Configs", Icon = "Gun", Side = 2}) local Enabled = Section:AddToggle({Text = "Use Weapon Configs", Flag = "Weapon Configs", Default = false}) local Selector = Enabled:Settings():AddDropdown({Text = "Edit Weapon", Flag = "Weapon Config Editor", Options = {}, Callback = Show}) local function Add(Name, Category, Data, Names) if type(Name) ~= "string" or Name == "" or Excluded[Category] or Names[Name] then return end if type(Data) == "table" and (Data.WeaponType == "Knife" or Data.Type == "Knife" or Data.Type == "Grenade" or Data.Type == "Bomb") then return end Names[Name] = true end function Self:Refresh() local Names = {} local Skins = State.Controllers.Skins for Category, Weapons in Skins and Skins.Available or {} do if type(Weapons) == "table" then for Name in Weapons do Add(Name, Category, nil, Names) end end end for Name, Weapon in State.UI.Skins and State.UI.Skins.Weapons or {} do Add(Name, Weapon.Category and Weapon.Category.Name, nil, Names) end local Manager = State.Modules and State.Modules.WeaponManager if Manager and type(Manager.GetAllWeapons) == "function" then local Okay, Weapons = pcall(Manager.GetAllWeapons) if Okay and type(Weapons) == "table" then for Name, Weapon in Weapons do if type(Weapon) == "table" and type(Weapon.Data) == "table" then local Data = Weapon.Data if type(Data.MagazineSize) == "number" or type(Data.Ammo) == "number" or type(Data.FireRate) == "number" or Data.Damage ~= nil then Add(type(Name) == "string" and Name or Weapon.Name, Weapon.Category or Data.Category, Data, Names) end end end end end table.clear(Self.Names) for Name in Names do table.insert(Self.Names, Name) end table.sort(Self.Names) for _, Name in Self.Names do if Self.Sections[Name] then continue end local Profile = State.UI.Tabs.Rage:AddSection({Title = Name .. " Settings", Icon = "Gun", Side = 2}) Self.Sections[Name] = Profile local Override = Profile:AddToggle({Text = "Override Global Settings", Flag = Prefix(Name) .. "Enabled", Default = false}) local Settings = Override:Settings() for _, Field in Schema do local Config = {Text = Field[1], Flag = Prefix(Name) .. Field[2], Default = Field[3]} if type(Field[3]) == "boolean" then Settings:AddToggle(Config) elseif type(Field[4]) == "table" then Config.Options = Field[4]; Settings:AddDropdown(Config) else Config.Min, Config.Max, Config.Increment = Field[4], Field[5], 1; Settings:AddSlider(Config) end end end local Previous = Library.Flags["Weapon Config Editor"] Selector:SetOptions(Self.Names, true) if not table.find(Self.Names, Previous) and Self.Names[1] then Selector:Set(Self.Names[1]) end Show() return Self.Names end function Self:Resolve(Flag) local Field, Flags = Self.Fields[Flag], Library.Flags if not Field or not Flags["Weapon Configs"] then return nil end local Okay, Weapon if Functions.Game and Functions.Game.Weapon then Okay, Weapon = pcall(Functions.Game.Weapon) elseif State.Modules and State.Modules.Weapon then Okay, Weapon = pcall(State.Modules.Weapon.GetCurrentWeapon) end local Name = Okay and Weapon and Weapon.Name if not Name or not Self.Sections[Name] or not Flags[Prefix(Name) .. "Enabled"] then return nil end local Value = Flags[Prefix(Name) .. Flag] if type(Value) ~= type(Field[3]) then return Field[3] end if type(Value) == "number" then return Value == Value and math.abs(Value) < math.huge and math.clamp(Value, Field[4], Field[5]) or Field[3] end if type(Value) == "string" and not table.find(Field[4], Value) then return Field[3] end return Value end function Self:Destroy() if State.WeaponConfigs == Self then State.WeaponConfigs = nil end end State.WeaponConfigs = Self Self:Refresh() State.Controllers.WeaponConfigs = Self end Functions.Utility.Register("WeaponConfigs", State.Controllers.WeaponConfigs, "Colon") do local Reports = {} Functions.Utility.Connect(State.Services.RunService.RenderStepped, function(Delta) for _, Name in State.Order do local Controller = State.Controllers[Name] if type(Controller.Update) ~= "function" then continue end local Okay, Reason if State.Styles[Name] == "Colon" then Okay, Reason = pcall(Controller.Update, Controller, Delta) else Okay, Reason = pcall(Controller.Update, Delta) end if not Okay then State.Errors[Name] = tostring(Reason) local Last = Reports[Name] if not Last or os.clock() - Last >= 10 then Reports[Name] = os.clock() warn("Swift 2 " .. Name .. ": " .. tostring(Reason)) if not Last then Functions.Utility.Notify(Name .. " encountered an error", "Error") end end end end end) end function State.Diagnostics() local Result = {Alive = State.Alive, Runtime = table.clone(State.Runtime), Modules = table.clone(State.ModuleSources), Errors = table.clone(State.Errors), Hooks = {}} for Name, Entry in Hooks do Result.Hooks[Name] = Entry.Active == true end for _, Name in {"Combat", "Movement"} do local Controller = State.Controllers[Name] if Controller and Controller.Diagnostics then Result[Name] = Controller.Diagnostics() end end return Result end State.UI:Finish() Functions.Utility.Notify("Swift loaded") return true end do local Okay, Started, Reason = pcall(Functions.Initialize) Functions.Initialize = nil if not Okay or Started ~= true then Reason = tostring(not Okay and Started or Reason or "initialization did not complete") State.Errors.Startup = Reason if State.Library then pcall(State.Library.Unload, State.Library) end if Functions.Utility then pcall(Functions.Utility.Destroy) end State.Alive = false warn("Swift 2 startup: " .. Reason) pcall(function() game:GetService("StarterGui"):SetCore("SendNotification", {Title = "Swift", Text = Reason, Duration = 6}) end) end end ]==========]; local function Launch(Payload, Environment) Environment = Environment or getfenv(); local function Fail(Reason) TABLE_TableIndirection["Message%0"] = _G['tostring'](Reason); TABLE_TableIndirection["Report%0"] = ((type(Environment.warn) == hmmm("\215\214\213\38\242\178\200\16", "\126\177\163\187\69\134\219\167")) and Environment.warn) or _G['warn']; if (type(TABLE_TableIndirection["Report%0"]) == hmmm("\37\216\36\198\232\42\194\36", "\156\67\173\74\165")) then pcall(TABLE_TableIndirection["Report%0"], TABLE_TableIndirection["Message%0"]); end return false, TABLE_TableIndirection["Message%0"]; end local Environments, SeenEnvironments = {}, {}; local function AddEnvironment(Value) if ((type(Value) == hmmm("\32\182\75\26\185", "\38\84\215\41\118\220\70")) and not SeenEnvironments[Value]) then SeenEnvironments[Value] = true; _G['table'].insert(Environments, Value); end end AddEnvironment(Environment); if (type(Environment.getgenv) == hmmm("\86\3\44\17\234\89\25\44", "\158\48\118\66\114")) then local Okay, Globals = _G['pcall'](Environment.getgenv); if Okay then AddEnvironment(Globals); end end AddEnvironment(Environment._G); local function Resolve(Paths) for _, Path in Paths do for _, Globals in Environments do TABLE_TableIndirection["Value%0"] = Globals; for _, Key in Path do TABLE_TableIndirection["Value%0"] = ((type(TABLE_TableIndirection["Value%0"]) == hmmm("\191\37\18\58\118", "\155\203\68\112\86\19\197")) and TABLE_TableIndirection["Value%0"][Key]) or nil; end if (type(TABLE_TableIndirection["Value%0"]) == hmmm("\64\200\56\255\84\113\234\246", "\152\38\189\86\156\32\24\133")) then return TABLE_TableIndirection["Value%0"], _G['table'].concat(Path, "."); end end end end TABLE_TableIndirection["Enumerate%0"] = Resolve({{hmmm("\251\82\179\71\255\67\168\84\239", "\38\156\55\199")},{hmmm("\175\120\104\23\18\119\238\76\186\110", "\35\200\29\28\72\115\20\154")},{hmmm("\24\188\197\208\159", "\84\121\223\177\191\237\76"),hmmm("\188\83\221\161\57\68\63\211\168", "\161\219\54\169\192\90\48\80")},{hmmm("\90\91\14", "\69\41\34\96"),hmmm("\187\198\195\11\1\63\179\209\196", "\75\220\163\183\106\98")}}); local Dispatch, API = Resolve({{hmmm("\16\175\133\8\214\12\133\138\52\205\13\168", "\185\98\218\235\87")},{hmmm("\217\41\41\233\208\171\200\40\40\244", "\202\171\92\71\134\190")},{hmmm("\40\194\56\135\59", "\232\73\161\76"),hmmm("\169\204\76\98\17\181\230\67\94\10\180\203", "\126\219\185\34\61")},{hmmm("\13\205\74\125\108", "\135\108\174\62\18\30\23\147"),hmmm("\164\252\36\196\22\175\48\211\185\251", "\167\214\137\74\171\120\206\83")},{hmmm("\138\243\38\82\234", "\199\235\144\82\61\152"),hmmm("\21\3\183", "\75\103\118\217")},{hmmm("\212\77\126", "\126\167\52\16\116\217"),hmmm("\218\59\46\191\187\23\195\201\45\52\143\166", "\156\168\78\64\224\212\121")},{hmmm("\20\247\171", "\174\103\142\197"),hmmm("\68\61\81\55\43\95\251\66\39\77", "\152\54\72\63\88\69\62")}}); if (not TABLE_TableIndirection["Enumerate%0"] or not Dispatch) then return Fail(hmmm("\231\211\231\90\192\132\188\6\148\229\237\72\219\214\174\89\204\193\237\73\192\205\225\82\148\205\253\28\193\202\239\74\213\205\226\93\214\200\235\28\221\202\174\72\220\205\253\28\209\220\235\95\193\208\225\78", "\60\180\164\142")); end local Okay, Actors = _G['pcall'](TABLE_TableIndirection["Enumerate%0"]); if (not Okay or (type(Actors) ~= hmmm("\76\95\7\37\34", "\114\56\62\101\73\71\141"))) then return Fail(hmmm("\139\254\210\194\172\169\137\158\248\234\212\209\180\237\155\202\183\253\155\200\177\250\207\132\191\232\214\193\248\200\216\208\183\251\200\158\248", "\164\216\137\187") .. _G['tostring'](Actors)); end TABLE_TableIndirection["Game%0"] = Environment.game; if not TABLE_TableIndirection["Game%0"] then for _, Globals in Environments do if Globals.game then TABLE_TableIndirection["Game%0"] = Globals.game; break; end end end if not TABLE_TableIndirection["Game%0"] then return Fail(hmmm("\225\241\56\180\178\190\89\136\166\54\179\171\251\75\219\245\113\167\168\255\29\211\239\61\179\164\242\14", "\107\178\134\81\210\198\158")); end local PlayerOkay, Player = _G['pcall'](function() return TABLE_TableIndirection["Game%0"]:GetService(hmmm("\8\2\131\223\175\42\29", "\202\88\110\226\166")).LocalPlayer; end); if not PlayerOkay then return Fail(hmmm("\240\24\139\241\222\131\93\216\183\201\204\26\142\243\138\205\0\150\183\216\198\14\134\183\222\203\10\194\251\197\192\14\142\183\218\207\14\155\242\216\153\79", "\170\163\111\226\151") .. _G['tostring'](Player)); end if not Player then return Fail(hmmm("\34\39\187\62\90\119\123\75\112\184\55\71\57\105\58\63\188\44\92\54\105\19\53\180\55\92\50\105\3\37\188\54\71\57\46\81\36\186\61\14\36\42\3\57\162\44", "\73\113\80\210\88\46\87")); end local Target, Score, Ambiguous, Count, Only = nil, -1, false, 0, nil; TABLE_TableIndirection["Seen%0"] = {}; for _, Actor in Actors do local Valid, Name, Local = _G['pcall'](function() if not Actor:IsA(hmmm("\160\47\217\29\245", "\135\225\76\173\114")) then return nil; end return Actor.Name, Actor:IsDescendantOf(Player); end); if (not Valid or not Name or TABLE_TableIndirection["Seen%0"][Actor]) then continue; end TABLE_TableIndirection["Seen%0"][Actor], Count, Only = true, Count + 1, Actor; if (Name == hmmm("\50\236\182\180\160\184\181", "\199\122\141\216\208\204\221")) then TABLE_TableIndirection["Value%0"] = (Local and 2) or 1; if (TABLE_TableIndirection["Value%0"] > Score) then Target, Score, Ambiguous = Actor, TABLE_TableIndirection["Value%0"], false; elseif (TABLE_TableIndirection["Value%0"] == Score) then Ambiguous = true; end end end if (not Target and (Count == 1)) then Target = Only; end if (not Target or Ambiguous) then return Fail(hmmm("\158\202\25\246\108\182\255\135\80\243\119\227\161\217\80\254\119\226\237\212\20\245\118\226\164\219\9\176\119\248\168\157\23\241\117\243\237\245\17\254\124\250\168\207\80\209\123\226\162\207\80\184", "\150\205\189\112\144\24") .. _G['tostring'](Count) .. hmmm("\101\165\188\88\11\154\2\89", "\112\69\228\223\44\100\232\113")); end local NameOkay, TargetName = _G['pcall'](function() return Target:GetFullName(); end); if (not NameOkay or (type(TargetName) ~= hmmm("\199\11\21\218\184\123", "\230\180\127\103\179\214\28"))) then return Fail(hmmm("\191\18\86\64\240\1\178\214\69\92\73\241\77\228\204\11\80\82\164\83\229\141\1\31\82\236\68\160\139\4\82\67\164\96\227\152\10\77\6\244\64\244\132", "\128\236\101\63\38\132\33")); end TABLE_TableIndirection["Marker%0"] = 'local SwiftRuntime = {Mode = "Actor"}'; TABLE_TableIndirection["Position%0"] = (type(Payload) == hmmm("\191\189\3\77\184\236", "\175\204\201\113\36\214\139")) and Payload:find(TABLE_TableIndirection["Marker%0"], 1, true); if (not TABLE_TableIndirection["Position%0"] or Payload:find(TABLE_TableIndirection["Marker%0"], TABLE_TableIndirection["Position%0"] + #TABLE_TableIndirection["Marker%0"], true)) then return Fail(hmmm("\116\219\60\218\16\7\158\111\156\37\68\216\58\206\68\87\205\44\208\11\70\200\117\206\17\73\216\60\209\1\7\193\52\206\15\66\222\117\213\23\7\197\59\202\5\75\197\49", "\100\39\172\85\188")); end TABLE_TableIndirection["Metadata%0"] = _G['string'].format(hmmm("\161\119\186\129\63\237\75\174\137\53\185\74\172\142\39\164\117\188\192\110\237\99\148\143\55\168\56\228\192\118\188\52\249\161\3\132\56\228\192\118\188\52\249\161\48\185\119\171\192\110\237\61\168\157", "\83\205\24\217\224"), hmmm("\199\198\217\50\244", "\93\134\165\173"), API, TargetName); TABLE_TableIndirection["Source%1"] = Payload:sub(1, TABLE_TableIndirection["Position%0"] - 1) .. TABLE_TableIndirection["Metadata%0"] .. Payload:sub(TABLE_TableIndirection["Position%0"] + #TABLE_TableIndirection["Marker%0"]); TABLE_TableIndirection["Unloaded%0"] = {}; for _, Globals in Environments do for _, Name in {hmmm("\141\229\200\196\46\156", "\30\222\146\161\162\90\174\210"),hmmm("\214\89\121\12\241\98\121\8\247\79\98\19", "\106\133\46\16"),hmmm("\107\55\122\250\78", "\32\56\64\19\156\58")} do TABLE_TableIndirection["Previous%0"] = Globals[Name]; if ((type(TABLE_TableIndirection["Previous%0"]) ~= hmmm("\78\201\231\90\95", "\224\58\168\133\54\58\146")) or TABLE_TableIndirection["Unloaded%0"][TABLE_TableIndirection["Previous%0"]]) then continue; end TABLE_TableIndirection["Callback%0"] = nil; if (Name == hmmm("\106\65\66\251\97\212", "\107\57\54\43\157\21\230\231")) then TABLE_TableIndirection["Callback%0"] = TABLE_TableIndirection["Previous%0"].Destroy; else TABLE_TableIndirection["Callback%0"] = TABLE_TableIndirection["Previous%0"].Unload; end if (type(TABLE_TableIndirection["Callback%0"]) ~= hmmm("\221\158\31\246\173\213\192\213", "\175\187\235\113\149\217\188")) then continue; end TABLE_TableIndirection["Unloaded%0"][TABLE_TableIndirection["Previous%0"]] = true; local Stopped, Reason; if (Name == hmmm("\15\184\136\74\247\43", "\24\92\207\225\44\131\25")) then Stopped, Reason = _G['pcall'](TABLE_TableIndirection["Callback%0"]); else Stopped, Reason = _G['pcall'](TABLE_TableIndirection["Callback%0"], TABLE_TableIndirection["Previous%0"]); end if not Stopped then return Fail(hmmm("\120\196\177\74\15\61\25\137\248\79\20\104\71\215\248\66\20\105\11\192\172\67\11\61\95\219\189\12\11\111\78\197\177\67\14\110\11", "\29\43\179\216\44\123") .. Name .. hmmm("\253\203\53\66\169\208\45\73\231\153", "\44\221\185\64") .. _G['tostring'](Reason)); end end end local Started, Reason = _G['pcall'](Dispatch, Target, TABLE_TableIndirection["Source%1"]); if (not Started or (Reason == false)) then return Fail(hmmm("\50\240\65\89\103\65\181\18\31", "\19\97\135\40\63") .. API .. hmmm("\238\95\60\46\35\53\238\82\60\47\111\34\186\93\33\47\111\56\160\28", "\81\206\60\83\91\79") .. TargetName .. hmmm("\20\235", "\196\46\203\176\18\79\163\45") .. _G['tostring'](Reason)); end return true; end Launch(TABLE_TableIndirection["Source%0"]);
Up to 512 KB. Tab inserts a tab, Ctrl+Enter submits.
Optional Paste Settings
Category:
None
Scripts
Deobfuscation
Logs
Configs
Notes
Data
Other
Tags:
Syntax Highlighting:
None
Luau
Lua
JSON
JavaScript
TypeScript
Python
C++
C
C#
Java
Rust
Go
Bash
SQL
HTML / XML
CSS
YAML
INI / TOML
Markdown
Diff
Paste Expiration:
Never
10 Minutes
1 Hour
1 Day
1 Week
2 Weeks
1 Month
6 Months
1 Year
Paste Exposure:
Public
Unlisted
Password:
NEW
Disabled
Paste password
Burn after read
NEW
Encryption:
NEW
End-to-end encrypt
The text is encrypted in your browser before upload; the key stays in the link after
#
(or is your password). The site can't read it. Title and syntax are not encrypted.
Comments:
Allow comments
Paste Name / Title:
Create New Paste
You are not logged in, so you can't edit or delete anything you paste.
Sign up
or
Login