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/YsDrCSdFYYKEhKwGAcAAAwBilGHMMQimlVAgx5px0VFqLsUKIMeckpNRabMVzzkEoIZXWYiyecw5CKSnFVmNRKYRSUkottliLSqGjklJKrdVYjDGppNZai63GYoxJKbTUWosxFiNsTam12GqrsRhjayottBhjjMUIX2RsLabaag3GCCNbLC3VWmswxhjdW4ultpqLMT742lIsMdZcAAB3gwMARIKNM6wknRWOBhcashIACAkAIBBSijHGGHPOOeekUow55pxzDkIIoVSKMcaccw5CCCGUjDHmnHMQQgghhFJKxpxzEEIIIYSQUuqccxBCCCGEEEopnXMOQgghhBBCKaWDEEIIIYQQSiilpBRCCCGEEEIIqaSUQgghhFJCKCGVlFIIIYQQQiklpJRSCiGEUkIIoYSUUkophRBCCKWUklJKKaUSSgklhBJSKSmlFEoIIZRSSkoppVRKCaGEEkopJaWUUkohhBBKKQUAABw4AAAEGEEnGVUWYaMJFx6AQkNWAgBkAACQopRSKS1FgiKlGKQYS0YVc1BaiqhyDFLNqVLOIOYklogxhJSTVDLmFEIMQuocdUwpBi2VGELGGKTYckuhcw4AAABBAICAkAAAAwQFMwDA4ADhcxB0AgRHGwCAIERmiETDQnB4UAkQEVMBQGKCQi4AVFhcpF1cQJcBLujirgMhBCEIQSwOoIAEHJxwwxNveMINTtApKnUgAAAAAAANAPAAAJBcABER0cxhZGhscHR4fICEiIyQCAAAAAAAGQB8AAAkJUBERDRzGBkaGxwdHh8gISIjJAEAgAACAAAAACCAAAQEBAAAAAAAAgAAAAQET2dnUwAEPhEAAAAAAAAwNwAAAgAAABVH8vIXAdI8QDgzMi8yQzk8RkJBRUIzNENAAQEAMnash+OX4uCDsEA3dqyH45fi4IOwQPeg1WpNq9VqtVotBsuyWCznqkhFQAGkpqniYNgshlodHK2mqWq1mwCmo83BZmmapul0Gm23Z8+2kiaqLWmaThPE/ULLBCIzZV87szfuF1rmnZB5Z4IzBXi/PrWWcdn3ya0lbv/7Y4IwLvlC6zUA6/+vvb1P6H191o5ZQL548eKFAOMWw7g/Yrt2zPpnM44ZDse3Mhz//v9rgeH4OPz/K8O47//fZxjHGIyNj8f91QLArh1/88e/jvU/FIAPxEDq3ZVZxUDq3ZVZ3RqZmYn7sBVoLApiNZ1O0wTnvseQhCIxCeKCMBqNRsNOhHi7WtJpYuITRgFZsdpuFFOq1XNlqMWUavVcGeqqCbmsjAnQhYFqF1PsDoBpgoqDgiBGKX2TaMIQBVSPiBb4hcKokQACOb5bPdsWwJVrMBxX6s0nmh5X6s0nmt7aUhQSL5C4AAgAAhbBtKlhAm11SxPb5/3+jiUUJqbTraZobUX6arSVTvkANFVaosDimyotUWDxt1ojCQxo1QAkwQRAMUaMqlUF0Jau0Br26pHkjr8SQonqdJtoxQsDNFtob8cgmi20t2MQ6+oRIhIFwUwsAKgIqsKrzFg+/JZ9josEBuP0ESAl3XaQq1SnBwAkXdqFoz3p0i4c7aupFhmZkQxyiAXAigFUztKW/85xc6IGgXjwA+g2VYGutml7EhxbaO+Z3LGF9p7JxUlSFAsACeITJhqbMIiIaG65QtsNSMTLbo+AVtqcbp22VNuguIgMNFmf6mWXSZP1qV52mdzaopKRcogv0KzoGQAYY421KhhiiBgGFgcTu2HQSulUT90kUelUFYR0rYAquk3TDU23m6JnCDxXktKiEz1XktKiE63oId4yUzDFajNMR5utd1oKEiUuJkaJ3kpUNZ14m9BIS7aWF0n76akJ2gKEBgRfte2kGHzVtpPiSgeIZ6YMZhUSjRFFZ9BoLkaIJp54oopxv4m2enbbtOW+84W7/v+98cK3nNrbM4T2BVRtFQbAQVZtFQbAQa7aTKtIAzi2Hwcaps2wYFPDxOZoqoJhoFbRJFLU+El1UdI0PZSLOY5EoxEclwgJY0NElDgZ715aVAEUawBpQg0IK4s1gDShBoSV68osqE0XZW2QZxForLVqDIKi1pItDxHpaCJd9YrQKtUpAimdaEzCmBCodDttdeQ5p3AcXyhRmVny+EKJysyS3Tqi3qzAhMsCFCvGgklMInIicYkrLJnjv69LDbc+DIJAxKNYIjHx6lGq0w3FS1hBtypgHBxdKEF2hVZHF0qQXaHVijUuWbemDBnUJwTAtDjg6GCzWGtEjdjrOCCdnilVEioHDwAOogkIFcRj4sJYopG40M//jscIABxdANm8RTE4ugCyeYtisKKVG3sCQG4XAOymg2EapqIMDDtCNUitItgj1MlPSyxSlyx0NDrdqjBAxCW0JMVDvE6bBhRXZesaKK7K1jWwoi2sBnUrYJgLAENwtJlqRcWoCL1lsxF+59oW+FOdaLSHUtPoaKI1DhxPq2VopcfTahla6WpqowgVsRqiWpOwIwAYVUUVq0bVqC+TawjtlLz+QfXQoNsI2vqrExsETauNCgEETauNCgGsamXGlYqqUKglAcAODharKUasFavxjSiaajta0m1SdHerkLbTs9Nq9Oi2MQrDuKi8X6JNzx4AvDwoQWrAxMuDEqQGTKya3BhKyQGqaTMtDo5W5iXV9OzRtj26kLZTUVx6dfgg4Hn5HXN1m2q6aart0QU0PTuKAAoO",
["Neverlose"] = "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AgBRAAAGxbEsTRNFkqRpmieKJEnTPE8UaZrneZ5pwvM8zzQhiqJomhBFUTRNmKZpqiowTVUVAABQ4AAAEGCDpsTiAIWGrAQAQgIAHIpiWZrmeZ4niqapmiRJ0zxPFEXRNE1TVUmSpnmeKIqiaZqmqrIsTfM8URRF01RVVYWmeZ4oiqJpqqrqwvM8TxRF0TRV1XXheZ4niqJomqrquhBFUTRN01RNVXVdIIqmaZqqqqquC0RPFE1TVV3XdYHniaJpqqqrui4QTdNUVVV1XVkGmKZpqqrryjJAVVXVdV1XlgGqqqqu67qyDFBV13VdWZZlAK7rurIsywIAAA4cAAACjKCTjCqLsNGECw9AoSErAoAoAADAGKYUU8owJiGkEBrGJIQUQiYlpdJSqiCkUlIpFYRUSiolo5RSailVEFIpqZQKQiollVIAANiBAwDYgYVQaMhKACAPAIAwRinGGHNOIqQUY845JxFSijHnnJNKMeacc85JKRlzzDnnpJTOOeecc1JK5pxzzjkppXPOOeeclFJK55xzTkopJYTOQSellNI555wTAABU4AAAEGCjyOYEI0GFhqwEAFIBAAyOY1ma5nmiaJqWJGma53meKJqmJkma5nmeJ4qqyfM8TxRF0TRVled5niiKommqKtcVRdM0TVVVXbIsiqZpmqrqujBN01RV13VdmKZpqqrrui5sW1VV1XVlGbatqqrqurIMXNd1ZdmWgSy7ruzasgAA8AQHAKACG1ZHOCkaCyw0ZCUAkAEAQBiDkEIIIWUQQgohhJRSCAkAABhwAAAIMKEMFBqyEgBIBQAAjLHWWmuttdZAZ6211lprrYDMWmuttdZaa6211lprrbXWUmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaay2llFJKKaWUUkoppZRSSimllFJKBQD6VTgA+D/YsDrCSdFYYKEhKwGAcAAAwBilGHMMQimlVAgx5px0VFqLsUKIMeckpNRabMVzzkEoIZXWYiyecw5CKSnFVmNRKYRSUkottliLSqGjklJKrdVYjDGppNZai63GYoxJKbTUWosxFiNsTam12GqrsRhjayottBhjjMUIX2RsLabaag3GCCNbLC3VWmswxhjdW4ultpqLMT742lIsMdZcAAB3gwMARIKNM6wknRWOBhca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",
["Sparkle"] = "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TVUVAABQ4AAAEGCDpsTiAIWGrAQAQgIAHIpiWZrmeZ4niqapmiRJ0zxPFEXRNE1TVUmSpnmeKIqiaZqmqrIsTfM8URRF01RVVYWmeZ4oiqJpqqrqwvM8TxRF0TRV1XXheZ4niqJomqrquhBFUTRN01RNVXVdIIqmaZqqqqquC0RPFE1TVV3XdYHniaJpqqqrui4QTdNUVVV1XVkGmKZpqqrryjJAVVXVdV1XlgGqqqqu67qyDFBV13VdWZZlAK7rurIsywIAAA4cAAACjKCTjCqLsNGECw9AoSErAoAoAADAGKYUU8owJiGkEBrGJIQUQiYlpdJSqiCkUlIpFYRUSiolo5RSailVEFIpqZQKQiollVIAANiBAwDYgYVQaMhKACAPAIAwRinGGHNOIqQUY845JxFSijHnnJNKMeacc85JKRlzzDnnpJTOOeecc1JK5pxzzjkppXPOOeeclFJK55xzTkopJYTOQSellNI555wTAABU4AAAEGCjyOYEI0GFhqwEAFIBAAyOY1ma5nmiaJqWJGma53meKJqmJkma5nmeJ4qqyfM8TxRF0TRVled5niiKommqKtcVRdM0TVVVXbIsiqZpmqrqujBN01RV13VdmKZpqqrrui5sW1VV1XVlGbatqqrqurIMXNd1ZdmWgSy7ruzasgAA8AQHAKACG1ZHOCkaCyw0ZCUAkAEAQBiDkEIIIWUQQgohhJRSCAkAABhwAAAIMKEMFBqyEgBIBQAAjLHWWmuttdZAZ6211lprrYDMWmuttdZaa6211lprrbXWUmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaay2llFJKKaWUUkoppZRSSimllFJKBQD6VTgA+D/YsDrCSdFYYKEhKwGAcAAAwBilGHMMQimlVAgx5px0VFqLsUKIMeckpNRabMVzzkEoIZXWYiyecw5CKSnFVmNRKYRSUkottliLSqGjklJKrdVYjDGppNZai63GYoxJKbTUWosxFiNsTam12GqrsRhjayottBhjjMUIX2RsLabaag3GCCNbLC3VWmswxhjdW4ultpqLMT742lIsMdZcAAB3gwMARIKNM6wknRWOBhcashIACAkAIBBSijHGGHPOOeekUow55pxzDkIIoVSKMcaccw5CCCGUjDHmnHMQQgghhFJK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",
["MC Bow"] = "T2dnUwACAAAAAAAAAAC6NwAAAAAAANHsDIsBHgF2b3JiaXMAAAAAAkSsAAAAAAAAgLUBAAAAAAC4AU9nZ1MAAAAAAAAAAAAAujcAAAEAAAClRVS/EbT///////////////////8HA3ZvcmJpczQAAABYaXBoLk9yZyBsaWJWb3JiaXMgSSAyMDIwMDcwNCAoUmVkdWNpbmcgRW52aXJvbm1lbnQpAwAAABQAAABUSVRMRT1zdWNjZXNzZnVsX2hpdC8AAABFbmNvZGVkIGJ5PVN3aXRjaCBUcmlhbCBWZXJzaW9uIMKpIE5DSCBTb2Z0d2FyZSEAAABQdWJsaXNoZXI9TW9qYW5nIChvcmlnaW5hbCBhdWRpbykBBXZvcmJpcyVCQ1YBAEAAACRzGCpGpXMWhBAaQlAZ4xxCzmvsGUJMEYIcMkxbyyVzkCGkoEKIWyiB0JBVAABAAACHQXgUhIpBCCGEJT1YkoMnPQghhIg5eBSEaUEIIYQQQgghhBBCCCGERTlokoMnQQgdhOMwOAyD5Tj4HIRFOVgQgydB6CCED0K4moOsOQghhCQ1SFCDBjnoHITCLCiKgsQwuBaEBDUojILkMMjUgwtCiJqDSTX4GoRnQXgWhGlBCCGEJEFIkIMGQcgYhEZBWJKDBjm4FITLQagahCo5CB+EIDRkFQCQAACgoiiKoigKEBqyCgDIAAAQQFEUx3EcyZEcybEcCwgNWQUAAAEACAAAoEiKpEiO5EiSJFmSJVmSJVmS5omqLMuyLMuyLMsyEBqyCgBIAABQUQxFcRQHCA1ZBQBkAAAIoDiKpViKpWiK54iOCISGrAIAgAAABAAAEDRDUzxHlETPVFXXtm3btm3btm3btm3btm1blmUZCA1ZBQBAAAAQ0mlmqQaIMAMZBkJDVgEACAAAgBGKMMSA0JBVAABAAACAGEoOogmtOd+c46BZDppKsTkdnEi1eZKbirk555xzzsnmnDHOOeecopxZDJoJrTnnnMSgWQqaCa0555wnsXnQmiqtOeeccc7pYJwRxjnnnCateZCajbU555wFrWmOmkuxOeecSLl5UptLtTnnnHPOOeecc84555zqxekcnBPOOeecqL25lpvQxTnnnE/G6d6cEM4555xzzjnnnHPOOeecIDRkFQAABABAEIaNYdwpCNLnaCBGEWIaMulB9+gwCRqDnELq0ehopJQ6CCWVcVJKJwgNWQUAAAIAQAghhRRSSCGFFFJIIYUUYoghhhhyyimnoIJKKqmooowyyyyzzDLLLLPMOuyssw47DDHEEEMrrcRSU2011lhr7jnnmoO0VlprrbVSSimllFIKQkNWAQAgAAAEQgYZZJBRSCGFFGKIKaeccgoqqIDQkFUAACAAgAAAAABP8hzRER3RER3RER3RER3R8RzPESVREiVREi3TMjXTU0VVdWXXlnVZt31b2IVd933d933d+HVhWJZlWZZlWZZlWZZlWZZlWZYgNGQVAAACAAAghBBCSCGFFFJIKcYYc8w56CSUEAgNWQUAAAIACAAAAHAUR3EcyZEcSbIkS9IkzdIsT/M0TxM9URRF0zRV0RVdUTdtUTZl0zVdUzZdVVZtV5ZtW7Z125dl2/d93/d93/d93/d93/d9XQdCQ1YBABIAADqSIymSIimS4ziOJElAaMgqAEAGAEAAAIriKI7jOJIkSZIlaZJneZaomZrpmZ4qqkBoyCoAABAAQAAAAAAAAIqmeIqpeIqoeI7oiJJomZaoqZoryqbsuq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq4LhIasAgAkAAB0JEdyJEdSJEVSJEdygNCQVQCADACAAAAcwzEkRXIsy9I0T/M0TxM90RM901NFV3SB0JBVAAAgAIAAAAAAAAAMybAUy9EcTRIl1VItVVMt1VJF1VNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVN0zRNEwgNWQkAkAEAkBBTLS3GmgmLJGLSaqugYwxS7KWxSCpntbfKMYUYtV4ah5RREHupJGOKQcwtpNApJq3WVEKFFKSYYyoVUg5SIDRkhQAQmgHgcBxAsixAsiwAAAAAAAAAkDQN0DwPsDQPAAAAAAAAACRNAyxPAzTPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA0jRA8zxA8zwAAAAAAAAA0DwP8DwR8EQRAAAAAAAAACzPAzTRAzxRBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA0jRA8zxA8zwAAAAAAAAAsDwP8EQR0DwRAAAAAAAAACzPAzxRBDzRAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEOAAABBgIRQasiIAiBMAcEgSJAmSBM0DSJYFTYOmwTQBkmVB06BpME0AAAAAAAAAAAAAJE2DpkHTIIoASdOgadA0iCIAAAAAAAAAAAAAkqZB06BpEEWApGnQNGgaRBEAAAAAAAAAAAAAzzQhihBFmCbAM02IIkQRpgkAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAGHAAAAgwoQwUGrIiAIgTAHA4imUBAIDjOJYFAACO41gWAABYliWKAABgWZooAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAYcAAACDChDBQashIAiAIAcCiKZQHHsSzgOJYFJMmyAJYF0DyApgFEEQAIAAAocAAACLBBU2JxgEJDVgIAUQAABsWxLE0TRZKkaZoniiRJ0zxPFGma53meacLzPM80IYqiaJoQRVE0TZimaaoqME1VFQAAUOAAABBgg6bE4gCFhqwEAEICAByKYlma5nmeJ4qmqZokSdM8TxRF0TRNU1VJkqZ5niiKommapqqyLE3zPFEURdNUVVWFpnmeKIqiaaqq6sLzPE8URdE0VdV14XmeJ4qiaJqq6roQRVE0TdNUTVV1XSCKpmmaqqqqrgtETxRNU1Vd13WB54miaaqqq7ouEE3TVFVVdV1ZBpimaaqq68oyQFVV1XVdV5YBqqqqruu6sgxQVdd1XVmWZQCu67qyLMsCAAAOHAAAAoygk4wqi7DRhAsPQKEhKwKAKAAAwBimFFPKMCYhpBAaxiSEFEImJaXSUqogpFJSKRWEVEoqJaOUUmopVRBSKamUCkIqJZVSAADYgQMA2IGFUGjISgAgDwCAMEYpxhhzTiKkFGPOOScRUoox55yTSjHmnHPOSSkZc8w556SUzjnnnHNSSuacc845KaVzzjnnnJRSSuecc05KKSWEzkEnpZTSOeecEwAAVOAAABBgo8jmBCNBhYasBABSAQAMjmNZmuZ5omialiRpmud5niiapiZJmuZ5nieKqsnzPE8URdE0VZXneZ4oiqJpqirXFUXTNE1VVV2yLIqmaZqq6rowTdNUVdd1XZimaaqq67oubFtVVdV1ZRm2raqq6rqyDFzXdWXZloEsu67s2rIAAPAEBwCgAhtWRzgpGgssNGQlAJABAEAYg5BCCCFlEEIKIYSUUggJAAAYcAAACDChDBQashIASAUAAIyx1lprrbXWQGettdZaa62AzFprrbXWWmuttdZaa6211lJrrbXWWmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmstpZRSSimllFJKKaWUUkoppZRSSgUA+lU4APg/2LA6wknRWGChISsBgHAAAMAYpRhzDEIppVQIMeacdFRai7FCiDHnJKTUWmzFc85BKCGV1mIsnnMOQikpxVZjUSmEUlJKLbZYi0qho5JSSq3VWIwxqaTWWoutxmKMSSm01FqLMRYjbE2ptdhqq7EYY2sq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",
["Skeet"] = "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TVUVAABQ4AAAEGCDpsTiAIWGrAQAQgIAHIpiWZrmeZ4niqapmiRJ0zxPFEXRNE1TVUmSpnmeKIqiaZqmqrIsTfM8URRF01RVVYWmeZ4oiqJpqqrqwvM8TxRF0TRV1XXheZ4niqJomqrquhBFUTRN01RNVXVdIIqmaZqqqqquC0RPFE1TVV3XdYHniaJpqqqrui4QTdNUVVV1XVkGmKZpqqrryjJAVVXVdV1XlgGqqqqu67qyDFBV13VdWZZlAK7rurIsywIAAA4cAAACjKCTjCqLsNGECw9AoSErAoAoAADAGKYUU8owJiGkEBrGJIQUQiYlpdJSqiCkUlIpFYRUSiolo5RSailVEFIpqZQKQiollVIAANiBAwDYgYVQaMhKACAPAIAwRinGGHNOIqQUY845JxFSijHnnJNKMeacc85JKRlzzDnnpJTOOeecc1JK5pxzzjkppXPOOeeclFJK55xzTkopJYTOQSellNI555wTAABU4AAAEGCjyOYEI0GFhqwEAFIBAAyOY1ma5nmiaJqWJGma53meKJqmJkma5nmeJ4qqyfM8TxRF0TRVled5niiKommqKtcVRdM0TVVVXbIsiqZpmqrqujBN01RV13VdmKZpqqrrui5sW1VV1XVlGbatqqrqurIMXNd1ZdmWgSy7ruzasgAA8AQHAKACG1ZHOCkaCyw0ZCUAkAEAQBiDkEIIIWUQQgohhJRSCAkAABhwAAAIMKEMFBqyEgBIBQAAjLHWWmuttdZAZ6211lprrYDMWmuttdZaa6211lprrbXWUmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaay2llFJKKaWUUkoppZRSSimllFJKBQD6VTgA+D/YsDrCSdFYYKEhKwGAcAAAwBilGHMMQimlVAgx5px0VFqLsUKIMeckpNRabMVzzkEoIZXWYiyecw5CKSnFVmNRKYRSUkottliLSqGjklJKrdVYjDGppNZai63GYoxJKbTUWosxFiNsTam12GqrsRhjayottBhjjMUIX2RsLabaag3GCCNbLC3VWmswxhjdW4ultpqLMT742lIsMdZcAAB3gwMARIKNM6wknRWOBhcashIACAkAIBBSijHGGHPOOeekUow55pxzDkIIoVSKMcaccw5CCCGUjDHmnHMQQgghhFJKxpxzEEIIIYSQUuqccxBCCCGEEEopnXMOQgghhBBCKaWDEEIIIYQQSiilpBRCCCGEEEIIqaSUQgghhFJCKCGVlFIIIYQQQiklpJRSCiGEUkIIoYSUUkophRBCCKWUklJKKaUSSgklhBJSKSmlFEoIIZRSSkoppVRKCaGEEkopJaWUUkohhBBKKQUAABw4AAAEGEEnGVUWYaMJFx6AQkNWAgBkAACQopRSKS1FgiKlGKQYS0YVc1BaiqhyDFLNqVLOIOYklogxhJSTVDLmFEIMQuocdUwpBi2VGELGGKTYckuhcw4AAABBAICAkAAAAwQFMwDA4ADhcxB0AgRHGwCAIERmiETDQnB4UAkQEVMBQGKCQi4AVFhcpF1cQJcBLujirgMhBCEIQSwOoIAEHJxwwxNveMINTtApKnUgAAAAAAAMAPAAAJBcABER0cxhZGhscHR4fICEiIyQCAAAAAAAFwB8AAAkJUBERDRzGBkaGxwdHh8gISIjJAEAgAACAAAAACCAAAQEBAAAAAAAAgAAAAQET2dnUwAAQDYAAAAAAAALOAAAAgAAAFXyrmkjOEdAPz0/RDtC/yf/DP8a/xb/Dv8C/xb/BP8O/x//Ev8U/xOEUE/oICxwCA2jkrzg2w4zrLEedjG1XK7aU7U7S0a1pVpRWW2a1aaurrrXu5LE9utz9BuNO+gQYozMhuOYGkNnznoQVo1b85gWcLRWtCB06sx/rCbUVUEwlp8fLUnMeFxpXp2V4/7anL8u9++vD+83fXBrLj26jqu2uFrYp0MA/E680a5mwuwcmWx1nxYVgv3z8mIv1u/XpXeR3XZ7F3Oec+k9ukMtGLh6+vU/9etXZTXvy6pqTbD8Xahu6YG3Cixf2SDVeVNXQnL6AiTOiL8eB1y/zZ0FrBPaPmjSW6U0pHFH5WNl6jLOsNrI1KdKkqquTy4nVFulPr5oE7yNATxhABME6POVnTTzAkRkUd9+DZxtoZlUXPu6yjhabalIVquicRiGtYwi7v1opVRVorxnyv/GvueUKKz8fgcsY8jemHvGeEGn74BwvKyfuAH+XXxJ9orLK/LoxK7BZBAXnkCxNgN3L9PUAFHJlB773CaV1Pt6PXYx5QnBmw9EX8BNb6cwXtLbDxDlar0dwPpb1xpK7Fosl94eb5euWhRXPUEF4eL4BN3KcyqoUKU+rtqr0rtKb7W+6PaL2y8cmpUvBmRdHJTaxhCDcefUVNKkKYpQ2oHWjRBOuBKq3iaNpnXJPxdNajVNEu7V2mY9Ev/j+C+p9iPJdW9FvkQBXGFIyMl2FoMiey/QjkOmZmpIaINzmqm/uF2qet/26Mro7dZ9tfPWtKo0eKm95+pUEqleqeeq14+wbPJvpVr7quJr+lpWEuskB6GtiEevZMXRAsQBF8y/AABVj+ZUOp0RbcqByYolxVxFyr5+/6vYwTGGcf/aQZsGDpfqlk8uJrdLBU/L593KineWWsjpE88EXn76ubOR6S/6jsFH6ouSLyJ9datN+WLH6hWbbefWemrYNZN0jzHmuqZBxAO0aeTWfcQns1nPxeoYO6Omtz0AEwLpRaZo1gWvtdw2rJ0D93B5RbbonXuencuexrfB2G1UhjcyB27JE6MLZRiXMroY49nuGzXOPLEHhmXvKKWGXdZ/1WZZnrJ35JmPFJVqilQqUrEsUP1id6Y0TqOJX/By8bhN0g9t8bOVFCD1flHjluGd6+mkSo94RBmpp8oYPMkegAkalupkX0XS5+LKbpmMLiw1ArQ+XgMEnvsVFadSgm4Soi5jtSDSRDJgrjB9uPz5eg2RogPI9im9UaKIYDkpxpgTFsTlXafXqCmiNiTLfknEUnbiCVHsxNJovyftcnzfnZtx62s3pajhwJv0fa1iOIN7T6egpwKDgFo9iXHOnLUe9W7Mg11YzFBLubGEFuOkN3Psk4W5D4WqE6/WCpJTE5xcc6XHcmGAzH6BYIGspCdBKOeWrvHI3RAGjQUCIW8sEypF17YVBrEIsQyMHCNY9MkpGaR4bJFTaqRXRp1AYlmEwuDO/Gw7PtKr3xANDjp6Qd4GIamW4hEijl65TLjjcCRoBoOMYZGl18HIQYrGIAQyYP1JAVlSIHfmaKCFBvs2ENoMHss1CcRT0VbdoMyyNqsLziEJF4gj3oxvny+WMIdW0stYSmTIlRNEiHmBlN7F1Edy3ZDphkDqPaQZtMnqZDIgbK562PLBRRfBQJA+OlylY8HF8v1FjjRaryczqcax3BlzIiyAoe+SqOIMhLXof8s1OheXZu56qKTuwuqDUXZv2nHhALBHF8VOpkpqpMWKZAkCexowkZUCKOisqEzYOOyxOMbWXa7bbgAQFSVAwaGswC9MXj88JdclWCwJg+U5/XrwiSiygzAPnNJO43vXrDjZrdNJhQJZwdM3rWreK3agSDaAgOx7NzYYC1+yAVAUY1kG6CyExdNC9izfhLRIzO4rYVuArdCSjPVVQOX9qdoCR3iA4hKyaXZQ3BreqtUdp7OEC5Rg1SobTjNFvGgUsTwTMYc8B2QZo6RKkmJWMiSV8I2DiHEXgiBQv7LKe0cHvqlqRQ/ayOSuq+exfT9KjCO+4dpBgh2Ra8dzyUMOve4LNEAAFjRV3SOEo6kCIaY0028zVT2sx3zQXJ2c/dBmnHI6Ofq36nBveds1EfZhWRwXl37vaLY5Lnpttz3J3qqG5gGCmoXnnWP3q1/HmebrtzsHRlYIRaMQ4rQKEgAdVr0cG8Mr1yHHz6VDgrkM2KG5WhlFoKjL3/MBJUWWLRI/lu5JAa4nqH5yuVugpOKU2i+IaKgMihCpmsQpFW0qefwrqVi2jCw/xl7u7e5nWyhBqL8WJWBjuCkCAmBwAFgWRugGvlpNEwhZElY1LfpNIJUXqVPfQURmpNWaVukl9XDz4HGxszRaBsPKSTGWK6kGppOOv2H5a7zs2zgT4aTYsn1UqkN/GDxp18AqXq3tf/UgSXpzaPrk8qOpjLRND1TZMgAQwACOJcsNYiUbQTH2ZMa9fJohmXePkCKjznivy/TmpU3e4HPmo2k8+PCX+/2sq3JunGWYG0lh/IgexM0Zajuvvqq5uJyH8kIzy1db3VpUxiaJSFzBce6GKkVENblaGzEvdPCOlHZFpZlip0lpqzptS6m42qHJ5G9i/rkhQovovyrfvjYZAsFN9kAvzb4RIjBCbQY4/mX9zJ353v7/qgpJ/0lEOYANYOoZhWSYETYeGoVdBBywwKh0SicZgREWLOJoGm7Hb0hOlmxL8pDEhspVSFX6P3cvJm6NtcbG1mA293U/eTobEhk/WuX37Hi9MBq3Vg4jErktAiX7FoO1elt6kE95U0PQzFihYAxnSuksABTKgskp4qI3ZvQbZ1wt9tUjhGEil9jFNAA4iQxAnCeTZGc+3m6eXscrQA2gN0AMqJBY3B+Puqd3sZ7zNlQd8HePG2IY0mktVTnlAmCG/xBm6CDkAFlCXMZ5e6UoNXgqlKKKx9o8wqdPR4igtIYjGRCEAnDORjsmrvOT4gZ+KkybVqAT+yDsSAWCK1YSw9Ut8yJPWJhBvPbEJrrJkE8FAH65hBUH2SBMxll8VkUXkRwj9Eyl7IiGt7nxh6uHYICTO2OMyFDSUJXDIe3bSjvxzNm+0RCWRYfc/9Ha1qh+vp+7eDx2b8zttPbn54Fy1M+phTlVb6XVJV+9AUyvdXod3CssiNLujPPfwHS31Sm5ddD46dSyOF/yUMk3O7eBdeG1CwuVChqI7owtGBQNvqA6JfXM9JOK1TEi5wL7quuym2/7PK72L9OYs96NPkxNZ21aESd/orU1taj9enHRLtxPsWAJLEsK5hVfDlGT1nu6xaBp1Q20TaSUzdHAr/ZaIMtGBq5o8xdpvqSzQ8UNRNS054nF9X06ERLGvDZVJVYCxzjmqVlAMoAWlc6x2CGD7Tw2edIAGACe6aRVBnGQKdRyfnQyjZPspGS18BHgjZ+GJ7qF0ebIZKRdUq5CkpDa1L32rqqNpfEfS3+yCeGRN3eGx+NSq3tP/fr8OOevv2+3tXaVdl72vuXUOguwkA0BiFw4ZFJ9OMAr+TbUZvtxH/vsVSveY+umMR1ANeSKVuJnT1LEMlQ12ZMU1eXO2BHPRNa87VJ7SUA8+o5dy8++jznO9/I2b8v1ftjNNWjIBpY7Zwmnm67CAO+/9q7JM6USolLJVRmDEfIKUBDZgZDdXh+atlDVUVGU5+0ss6Ip+FPEmdYsQjgaJOfw0g7cJ7/DTm3bOUmywCxlZcv2APDNf1XYLkNyk4O0DYBsvsn0I0uWDnoaX0BDpFMaFtKlLGrjI4ia3OI0ag7NaIxMmzK1VrGSSOPt+8POX5uW7YfhfeeQVsHn4ekrj65jTvHJpFvj6NBFGxkttdxX917jxYGhn5e8bES5DlAegaD4+Hiy5up4ujuu5GXKiT8i6oUwZ+eCs70huI3Kcs+5yRC0wHSbtW/fjlPjx117hlH7Q81bzjEJpqAS+ge74v4XT58meXVS1Mz5JXR32nx1wR8KRpLLO3oPSlSqkqqofEnFbDzwMbGRtRSERkVDQwDJAHA201Sul9S/T1TQFLTHUQJoqvwiGGHDIkL1cRjTQ5EGjMWWbvNb02S7KuQEBaU+9VZVYYO04FXxw2ZDIAM+ydRJNCJdQS811dfTEzXJbLoiovKSVrFxPXoBsslj5wegKW6aEfUehSUknWpTNdT0ccvJenWs9+Ns3L1acF7zU6UJa7+cXw5ffpTlf3z3aNqDLPq6LNIPWjM/7de3M58WPTcVUpg/7MKDnuiTBe+pjFrX4itBOsvm7Id87NuexhiJoes/pZw7Mazdxh6i87bPbF8/1e3hfH++XxaR5jSnz+7ExrlzGCyZ0vtMT38L5jSiaxTVPll1mvCQ/2aqjwD42ACImunngyweg4RtvSnRxmvyQcGXbMkyMvyrhk3VVKKSPAUVQZrW6II+jQqwECAw14d1bNuLbKEkBnKH31IIqcAoCQDKJsdws1LCDrA/VgxbgIAB8xoAwM02EADWfrnUc2wxT8PARtz0sSmKDvKBjI24yeNceAFObyaSLNFPgVIasbLFkoY1DFVF8f7rT55/WJ5N3ie/253seJXbstzbrU+9/W0/dsfffJEc5XY1UAG9unA7euR40BqLrXmcdNUdJ14P953waZ45Pv3N2fc5z/czDDXVrJP0LJ6aOXm9NfBatmnGHG5fR50leBm6kaTM1z/nuT6+ROl0+OJGJgNVMNkUk/Tjm/33GBhj7odCWzxtdaBlq9H3cPbcX98MHNvY26NsywuG7r317m4HuTU4lF0hRX2TXgphXR8rG0GLAJBWW6ik+h6QQr0ADLdsBPIlC0A46AYAAIDeWYcBIIuCpw62ADOTshtbgLwVNhAPXrgEzhdCXrP2UkuuAZ6ImywupXchXUQZHb0nanJnh8HeCWDQUW+jyoUNibAaRFUEed8f6f2uxnK9Xu2upavz7mRqqrX4Nq8sq4atqooKKi2miAD16qd7yy321H//7c1pHdZLu7k4GNc+TatRGppcz3nw5Uz89/Vm+vHdvqtXpFnXP+8oql93LXcDPZVzD8V3uimK+uTSfZ59fx2vD18/1Z/9H687TQG/Z8i8BwYm5h5ne97jefHb9XpMpkw1N9hfw2+YUXHPccyd/v1nULAaqghxhDnfzRBz+bwy82mVFA0gCsiAgNUQD+byz6aQqEfUDCOuvfuwbQAARQbAC3AqhS8G5AKwJbVNCgxsboBG9lAngAMeufTVRdoLtOJRQmKqjRwuWUpRc0iLEZKL73NUG7mpVZjDj8xoKXRYJVFVrCoU57RxwGbd/WpcS9N6aN5h6b4N/TCw1Fig+JOXrlx5cJMr09au/zP41Umtfve1B/+2dONFvc/JepIF/XjJRIdEJ6F9aij7a2f7YboXj7vWSogz2LSXSeCmGvX0cM98YupKxzHXKepUUKtnFlP98OjDkX8Uk9V/phJ2MQAANEyU4zbr9Z+O+76fbXx8f+/b6cJZeUi4GUQZX8ayBaAVMn6rBJKKSruoPtI9Ov/vaC/NecsqKt1allSFjUt3XSisA2BS2yMcBFCztxwWAkj03xhQEsmGLZ4l7J5McwiANNwxV22gmoAAT2dnUwAEE0sAAAAAAAALOAAAAwAAAE1XBx4K/wb/Cv8A9v8D8T64xDEFvRoYUCtNXOpegpmkHkMaaiVz0LDpdVAkeyYzKVyVUCHR0JWf5b7mAzm5/jqPtepBixS6EYZyL7pOX9++64bXv/K3x/c3l/2Hkd9DhdOPz8otPdlrh+z/N7PI7ee9fzVi7a00trVz975M5fwAapxsfwI6ozWehKaAPJ3A/UUNGIDdZAFvzp2xXvjrrOcf/jywwdq5ryxI5GRDNvymufyYGyj0f7q8c2Bq8UBRk2YgXxBY+IyArBUEgAW9zsxIJV9ToRK7k6kkdtuEUhUsTP2qEECss2Uf4dF6WL2LO8NRoLHJfvPzpA3NkhAxgIRBeZAb2TzkjB0x7QSyNhpMBNgBBb64NHNrsAtS24hrT/qWxvmkbJF1tifU2pGbt4qHuU/2aOl0yGzAUIW4CjaXztPZ+u1D0/7h1Y63Tg25cWl7+f4j9Yqfph/WFq/cGfLoH++q2Hpfz7c74fqHaa7Q5uny7UqMSm9cwmIy+1zUa4Ya7SO6+s/kMwduxpl/7xvnzPI+tqJ46DTQQDVlojRjQEvvmhQ9pG1tyv75n27sWQgS1s00xWaw9407vv6VNT1ZU3PWZJJ+YvJzj072s7vYMFUAACAeAJZV0jugqk8hkAUvAOl/C8O8pxowCnBVoYIASUZWVTabWAYAgwDakGzUNyBwllziZXJ8gAlgEnR3uELGCPHstWFjABEANACeuCxjSsqbQd7bnrT2pG+pfUmSzYADNZOb64Q/18mdS4nCHsJVVQJBYIjdhurVwW86ePsS1j6Pf/jJju1Wr3Sgyz8PDd4WNyZ/o9PJoLn6jqAPbm4pJ1s5mFJ5RV7LdIoCqDVbc7Knn8QMG5Fxh8V8kEvmN7llNM729DhuI8zGABpqg8J+GOYG6Cz1BlT6mrVR49ZyFoCAMx96KJEAYBmqdb+dH7v3C8c05wZ1tZgEmN5O26TuqwwA/AMDACGjgJLyGt3FAMgWgJFfy0gAAJL1kMoaBmAsASh3mzFn1CMLtDiCCChkZMPZh2N80A1sDHs3eOaSgckMAACxAYANGQOetxRxDCYQpXmrDsa1w79lKS02Oars7ROwm3hOdmqnkzOHWEVYFQKDbfXrDV+hvmNggDbt/34t9glnA9HenKOrr6u0fWVcu5yW3edtfIVxaits7Xwx9TnoDNa+7qkmMCuVjE9mZ+H6ayob5tsBpoddd856X9XbfT4jFua6O4K9FIe0Pv/RRml4bD+s7W2/3l7Pq+6TnGrBrILalYK7Z+ifZ4ccoenh/V1AAcy+tRGQxXOU1AE4QKcK6KxeL6TrEQDoEQASBl7LEkBo7Ga4uCt66GEF3wPiAWBDE/aWHDNMYgBKB7OtjRDNSNnI+kqkk6I0DtgAYAA+txTjkoQiOfvr5FF7TFsa3ZKssontz1M92k28Fb6D8mSjNxi0iyKkqhAEoqnD68sLY3zQJcar853rRZAPHm4Nbv3yk+Q9P+7/qrs+3Xo4cGJgQ0GDaUcT0DNzPe3yq54snUbizAPD9fXS0Js4qpwewbvHHMfc+zx3iopz5hrdLwzOXfz42ox5eR1EcY4wqHJKb3f9st1v2muLczD9T6Z9NQAzE52abn+PT5/dzLztt+9ntc3huT3UylIx7XyGfdhik9jliWQAIyNfvMOXjGxLmKdTecKsMnGhMC+mHsc/aeYlNqCGWVkqkLmF/LKn0RCPkGxZy5N7yMf3pey7AQYcQAP+tbxutzzlOyjzSwioKXYtP86FPdIO8vy6zqfWFNvTM0dGBhQBAAAAAADAPl7/mz//m68/7vuPA/Znj9fbbevReevng9M/H5z+eLB1Oau3aaHpYDzd2p9uTdPb+fR2vv+2uf17zus5r6e2sx3VXMfX8dXez8wz75Prk3FfN9fXXGfyTALJ2ZzN+eu8Oms+K8tawcTKWFkklUzDPl7fvP7y89d8f5vrt5nbzG2OMVHQQ2f1VXVVfc79OfXp2s38Zp49vat39T69z6vjv4fT4ZrT6Ymn08lpbqqlRnts8jX5miySSioD8LgcuC4HrstViV0H",
["Break"] = "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",
["Rust"] = "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TVUVAABQ4AAAEGCDpsTiAIWGrAQAQgIAHIpiWZrmeZ4niqapmiRJ0zxPFEXRNE1TVUmSpnmeKIqiaZqmqrIsTfM8URRF01RVVYWmeZ4oiqJpqqrqwvM8TxRF0TRV1XXheZ4niqJomqrquhBFUTRN01RNVXVdIIqmaZqqqqquC0RPFE1TVV3XdYHniaJpqqqrui4QTdNUVVV1XVkGmKZpqqrryjJAVVXVdV1XlgGqqqqu67qyDFBV13VdWZZlAK7rurIsywIAAA4cAAACjKCTjCqLsNGECw9AoSErAoAoAADAGKYUU8owJiGkEBrGJIQUQiYlpdJSqiCkUlIpFYRUSiolo5RSailVEFIpqZQKQiollVIAANiBAwDYgYVQaMhKACAPAIAwRinGGHNOIqQUY845JxFSijHnnJNKMeacc85JKRlzzDnnpJTOOeecc1JK5pxzzjkppXPOOeeclFJK55xzTkopJYTOQSellNI555wTAABU4AAAEGCjyOYEI0GFhqwEAFIBAAyOY1ma5nmiaJqWJGma53meKJqmJkma5nmeJ4qqyfM8TxRF0TRVled5niiKommqKtcVRdM0TVVVXbIsiqZpmqrqujBN01RV13VdmKZpqqrrui5sW1VV1XVlGbatqqrqurIMXNd1ZdmWgSy7ruzasgAA8AQHAKACG1ZHOCkaCyw0ZCUAkAEAQBiDkEIIIWUQQgohhJRSCAkAABhwAAAIMKEMFBqyEgBIBQAAjLHWWmuttdZAZ6211lprrYDMWmuttdZaa6211lprrbXWUmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaay2llFJKKaWUUkoppZRSSimllFJKBQD6VTgA+D/YsDrCSdFYYKEhKwGAcAAAwBilGHMMQimlVAgx5px0VFqLsUKIMeckpNRabMVzzkEoIZXWYiyecw5CKSnFVmNRKYRSUkottliLSqGjklJKrdVYjDGppNZai63GYoxJKbTUWosxFiNsTam12GqrsRhjayottBhjjMUIX2RsLabaag3GCCNbLC3VWmswxhjdW4ultpqLMT742lIsMdZcAAB3gwMARIKNM6wknRWOBhcashIACAkAIBBSijHGGHPOOeekUow55pxzDkIIoVSKMcaccw5CCCGUjDHmnHMQQgghhFJKxpxzEEIIIYSQUuqccxBCCCGEEEopnXMOQgghhBBCKaWDEEIIIYQQSiilpBRCCCGEEEIIqaSUQgghhFJCKCGVlFIIIYQQQiklpJRSCiGEUkIIoYSUUkophRBCCKWUklJKKaUSSgklhBJSKSmlFEoIIZRSSkoppVRKCaGEEkopJaWUUkohhBBKKQUAABw4AAAEGEEnGVUWYaMJFx6AQkNWAgBkAACQopRSKS1FgiKlGKQYS0YVc1BaiqhyDFLNqVLOIOYklogxhJSTVDLmFEIMQuocdUwpBi2VGELGGKTYckuhcw4AAABBAICAkAAAAwQFMwDA4ADhcxB0AgRHGwCAIERmiETDQnB4UAkQEVMBQGKCQi4AVFhcpF1cQJcBLujirgMhBCEIQSwOoIAEHJxwwxNveMINTtApKnUgAAAAAAANAPAAAJBcABER0cxhZGhscHR4fICEiIyQCAAAAAAAGQB8AAAkJUBERDRzGBkaGxwdHh8gISIjJAEAgAACAAAAACCAAAQEBAAAAAAAAgAAAAQET2dnUwAEskIAAAAAAAD5NgAAAgAAAAvrnjceQEYwNDQzNT08Ojrn0t7s1OLS3t7V5dfgz/0rKzI5FEsADBVJBEq9AFHiDIHrAB6Ym97W1Wsy3r1fd0mFU0Ro9SlmrmDBqxUEAtJpknxn9mAhkaaTVk02ermr3r//AAxHwkR6FIGAkz3+xYe1Edm0hJzBPKNUyq4Pf/sKOwovda+3953aYq0AV9FUUzGBh6s2GkTPl9QQ4gDcaEpd03SqVP3hxh8US6AJXZoggvQD4KAK/GQHrNzh5RVPpAuf2wczkju94qercDlp90SaThXPau6HjQAcSfYRi2JIYkb5ByCCUIH7Cjjy2YTw8pHqoqrqIVBGrKo3ql2pdnX9ubDr8kpwZcxU7oYBHFFEySRVBMk+AEQYCwFY1wfwelapxbVp1rtZLaKlRzFxJbJbLI6U6HFfR1SlDfxdWl6pADxV3pS4J0oHJM0xdc/rsRlRwFAAHiEO+1+8cZRObLxkEdrQVDQSwK/KYTpcr3zML3lpbyxNK5fh40lgCfIBIqyEALi1gTN2wvFt+VY+vzU/t/4gY0YVRchyMqTLRZCugibzIfI0hBoJRE8tF8hpmsxpfut9XYmIIWlB4GvRd0nO8kn1l0uXbhElqW63rffrddNEmtVVjQ3QQiXNtSbx0VhtSL9WB3znIG50O5Nd9gPMZEqBd2SCI+7oT4tMQVtjpFkuV/QtiAWd0qR0eruV6haaJJ2k1NkhWtjmylQkSpHOGXxlVMl8ZdRIfwCyQLSA1QA8LqMQUhHV7XaS1vdPzW6btGlj2UbV96pWQhulVw7zU3N9TVWluqU6KQZsX2wztX2xzdStLTJDGkhSgckxFmNs07ZNp9Wm0bOJttPtUZWqmhlBIfarVFU1nffDr/u/n3tVfOUDOrxGc+rWOHoFW17xGiypW+PoFWx5vwAAjO2LSZazzYHlmFUuVlUlqlkIBDIeuTab1aYWGw5Iko0wWt0srTDotBpH6tV0QQDxCWUigeKC0K9JDfKF1q83QlS6O7RsIjVSiwLXpRJzOJJ2pPxrpSMkaQm5iQBDElK61RaajqSo0iIO5OpfbbnXf64Zw6IUokMRJ7VJXL5MtEDBdEjeOHD0iwtxxFX9KxZbxORzrP917BUrC3WTA53CjkQOfusRY5k4+jmXYDBjg0UQFKuguiN+E2B/a4k7aJDZpyd/JgZ6PWzqRHImtL0dXgymq86QBAB6xWC66gxJAKB3dmVZlsUcs5hVVVV1fHxI4gniAxtHQrCikSDxQB7mICDWQSwKHe/QMsR00FFpUpV0u5WeurRto9Iw4gamhanvaRX/1UsriVi+eN99KRzd7/12uoGI4HW7rRZ9SETgxpl04hJDUVYNTM272Ha50q1vqKY6+iJWs2Ior/x9M02L2lY3LZISJTFfrETKFl+cOU3vA+YUrUx1x69/vetNwTa4j0ZghkjIcDBAxjUgQ8bg5YpLWrveVQw4CLtuc5T6WLsB/vslx1gHRCsAut8vOcY6IFoB0J3dJFne5AHOKseqqhpRYhJJmCA2UNgJUegAxyg2MSSMhKGiASFxduAwEhuK2EjaNN2kKm2l26TVtG3Tth1tpzT4hma5rXq0OipVFNK0uSO/VIWf4v+kv0/oUGryTaqKIt2IoBJ9pSLfVGV9eSVseEyYSnp2qpI2UC91CjxWlcUouDzhH0uQ9u0lx9y6htyiSJ+pxn+EXVZV83Iuv4o+7NReuuQodTUUsD+XRHJTgC42V2fBbmCgiRrI2JlNRk1ObrPkgGhrmO1hKjwjnsu1jEYgfgVIzbmXy7WMRsCvASlce/cAdjPMQkGTs1i5qqpqVStWm6GWmsUwTQ3pTikuQVqCuNggiI+GjsqOoqhiYkISiZK0GqqpNF3ddLpJpW1E01ZTobh5xSowGAhhZB/782MNSGJ1IAwQCmFgETYEAA6DFsbQ6JJEpQIhpU9XWq0ypWmjaIoq6T5d+lHj4GTojE+fdqXxQS75bwTbr9rb2Srr1iwdl82okULfPz9o01wYwgkFsn/4913Wy/2encXuiOxDTAz7L7t24u/antgGaFYAqzncEENPAThrB9jVLJg/8jfsigtxAgAevOUEBLQDQN+Ct5yAgHYA6NvZTS7LsizHnFVVVQ2CIEGYMAxChQoiJowLbMUn7pgYiIaEoRUXhgSRIFYKVG2bVE+JtlJVJNKpQjgKppRFVP5QRRci7233+9ffcBu5OYcIUc5r3CXz+Yt4nc2egjWhr9nQku7oDON420R8Gy8A6E1z6V/3MFYPrc+YM9cJGepQY8C+lwDgDIltTG3/TRAzPBQ8w9g6WxZb19b3Oq9EkSb/7g3SlDzW8m5tb2f6CFY00GiCbPhUKPDJ1bXi4zZBfWkmfD5MJrUAxA5IUIPHYTKpBSB2QIIaPN4mQMuKWZZlWVYuZ1VVWbWaDqgYgDgIZnysYyLExUXDaIyiIdWpTrWdnj10u7SNpSBIEEQIJIKI2rK6P7nmQmlNBnu7scr2vLGXEJl3QLQfQcggWkUcohzKjCTSm4t88/Z2CBzv3n437/12w6/P3cgAsuGDSuLFHRGJNh1z13pIcWvfvWfbtPMXDe51LYKr7VgqtABnByFWvbi7ebPEqiIUZbzia3fdNXyiY/V08MXa/y22P59xc5bG0nTNGwyxyBnWrtqgIV/3RgQY4AI+7FUlA5g0AL3hriopwKIBaM9meYBlWc4xllVVVYNIYhLGhIEMMkEgx8VFEsbHQSQSiYmJxhJLTMRRE5sQom4KbZNaS7Vdpzpqd/9hK5ZATKLo3THFQkq7+++ggtKJEszf4Xd+LVOAPtC90nFPWB8Kou5upH7sgAxevVou0jy4hd72AyH+3yD8Sl8zWY7rpYUrNE9N7gZEVLrjWiYQzA4B6tsNm1LFPAQtXbeLhyndel2oz3Z8oAsRkQYGzCJZZpuGT1b6AFl3xKhye4dJTfMi9w0em80DAdABoB9is3kgADoA9MPdtqBlWTbAOWa5rMrlqrIOFquDqWBiqqLEhtF4EhMfF9pBghD1bNP26JlUUtKjdbyjROwAYyn8tedNKwLvlQ05RtIDf+tCpNjSjzT/0aLS0vFlXqaboKCJRkiqZ5SS1Di/s09B7vGps5vab5eBUv/k0uotCJ3Yc0wcO9Lo02j/9D6f/RtbWiq4IuI+aeQr6YvhnbLYfY97l6eJ957bpn/3IsCsn529gGNiQEpn4baFfhE4S7Nz1oa3N+vS5WMvAkUU2yj5U0QE09Kj4Rn+y7WjA8QBgH785drRAeIAQD+ewXIWkyzLcizmilVVOTY2ccc4KisIwyAaOE4kBiJBQsVG1Vbapkd6dJq29Kh0m1JtdBNRXtEzkh2V5IO7L4eb6nTPpNqZOPT7PRFIhYVVtkSE5/LohH5U0alqqtUKVlqJllitY9iIhlCnKxsqFMrdKpLcRaeHy7Ozf8lgfcSUjQAYdTuiQWx7h94j7HtEUEFeBcRil+FXjkuZB8hNHn1tdzrsd1roFfUW8h/DYALGPpZuluEGd7tsv4vhu6uZDNiRecF4dQp/dZMrrgO+67WbB/QHo4A+d71284D+YBTQ5xwGmx2BJpZlVS7LVVVRq82GgV1NVatNiQ8TT0wiQtEIAgWKKDYhImoUEHRToU2loumKyX1Im2cVAkRESaubCtLSDejqD0xTokuoKpoKpe1UFBXq8ClBnfkpEDoSxd657dJ2PRO6C7H4spq1RwfwSSNIRL9WfLsjwxzaZY2bzzJvT18TehUBNarhZRYbCnrGAXDhB2NkUaaBSkBMv7hhy7XXFheVWU1I1ld99rMBCcNsmmZ2fbeiAbkpt0tukbuuGaN+++VSDKUSNGW0t18uxVAqQVNG+w7VukUCQmw2EMAsywZYjrGqqmpRI4I1gLHYMC42jIkkCBUkjCUgAjEKYuMixEUCxym2mkqiLZVONY73pV46nm0JDbLH4/9KqlPVpCpNBFJO31UK0qaFTmfuvlwZURPVtPDL3yOquxPJGZRcTpgwnVaAHlkuNfzSlqGqaZtuCo1KonZclh+mVT6hFri40sP+hOqsBpdFKn4Dai40A2aQS7HNC63EvZP2cxGhHhq5mKK1hzUEZ5KbfgWT+iw4RZ8ShqzKYhF8nw0FnNDBSSoHpSEK3poNXQ1LTAC61mzoalhiAtDds8CkTZZlsSxnuWKuqiqGRU0QTVATq91ih2E0GhsmAo4gE00QGxsvxzqIJRAhX6s3vzx4STj8etO01aRaEelm7+9S6d4oQbmLUbhPSnWEp2g4jzScM1q+NbPBW+lq3w1uS8vh6AuRwVWWhkZuboYvOnoYy7RC5Cbsy7HzDDpG6J95RriLhuxBxvL3oGs3ydZ6etK/oQcuxPHgCOMu8OsM+QzB/zt5AJkLJDvmrxxuDDSeuTa0ZMduU5pWaNJkGyiImVQ2YQM+O1Vmg2b1AgX0ZqfKbNCsXqCA3tmjWTluchxoqqqqSlyiCWKjQbRimG6FEMQ7GoQmjIlKkSAu0YSOjZESJgpBJCToVNpSVQVpEk2ktEpXmiRKOhpQolskUlGLLBcumqYjkiZCLskhfSfy+VPl0rcYbWTOTNJXVaFK02m096wELb9FoNXH/qyq/0X8QMh1j41T220rSVUpkai2W1Vtt201wV9HNnE0YyDcGRcy0Y/sW0MD75pDHIahdJEY4OcAoFsD6LrVA1h8fx0JdCz+XAz2/59+RMKwMAxsqkbzp3wdAN4ZzTiDyHkBoM/OaMYZRM4LAH2eyWZlFWMx5mJVFSlx8YqPcYLYIIyJEsFR4ojGhYGIFYnGJR6TgDBBNAYpXqGC0hTd3dKi06Zp26YtKXkK6YxKqtNWUtpUaurLij1K8aYIfmQEWVNJptHdDuvnvJcLeqdj+h8EXafecojSdNP60S1f2hSOdXg1MjIrNRiHa+bADxV0LCBD7WbpRPPPwHzfcFQ02dkGD4pmLs60jMKd2gJ5I8bGBMoNmPOL1xTsxqzASwqgVQ4v3gVyUwwRALYoHSY9jLyGDDaZUt8SpcOlR468pgw2mVLffgIArGQSGAGMWZZtillVMVc1CoDIEOlgV5shhhpYTNS0WZ3UutMmp2uhtbaqKaXv7CgtQRgmiAuiSkx8JCZBoueLPSgepG2arlQblYqUTjeplGQbZNGV6IpCWm+u7tcvEV+43S1beuIUj1wiTyvPlyUU0ahSDTTxiSUcHd/cHRXTqZI2hFQ3zZm4iW/Zd9N9mjOwY6pdhyecqtJKqvFylVX4rNS8UpNbQnIsOAzpLSiZa5M3k9en0y47DGn6vVZKHB34KMDT+jt63YkexCH7R3a6HKcTuE9lm5ZEo0ENrZ/0FT4Mw+4F9cVQVkf+qg0CPEMFBlFrRekkEm1XixR0In/1z3UzoKgej0RGGQYAFMVWAjUviq0Ear4nALMKQJnA0nTepuiE0NpIaFxlNhWJ/XN9kZx3u3JEABTJVsO2WLYWtrfeIlKQKaUQOChNCqtnklbRtFWdrPT9pk3OS6zKahuoaWn97qzOVbwB3EL+4y4Xsp/Qbb0g9wsysAl1FMPeeDVyaFZ2qvS7Sy9NGUVjYuMSxsUGWKjtdBuVSmF75V8enREM",
}
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"]);
Comments 0
Log in or sign up to comment.