-- Game: Project Vitruvius -- Time: 2026/07/30 -- License: QQ 1990569476 -- Modified: Added World tab, FPS slider, Suicide circle button -- Load Obsidian UI Library local repo = "https://raw.githubusercontent.com/deividcomsono/Obsidian/main/" local Library = loadstring(game:HttpGet(repo .. "Library.lua"))() local ThemeManager = loadstring(game:HttpGet(repo .. "addons/ThemeManager.lua"))() local SaveManager = loadstring(game:HttpGet(repo .. "addons/SaveManager.lua"))() local Options = Library.Options local Toggles = Library.Toggles Library.ForceCheckbox = false Library.ShowToggleFrameInKeybinds = true -- Create main window local Window = Library:CreateWindow({ Title = "Project Vitruvius v4", Footer = "Project Vitruvius v4", NotifySide = "Right", ShowCustomCursor = true, }) -- Tabs order: Combat, Visuals, Fly, World, UI Settings (last) local Tabs = { Combat = Window:AddTab("战斗", "crosshair"), Visuals = Window:AddTab("视觉效果", "eye"), Fly = Window:AddTab("甩飞", "rocket"), World = Window:AddTab("世界", "globe"), -- NEW ["UI Settings"] = Window:AddTab("界面设置", "settings"), } --// ========================================== --// Services & Globals --// ========================================== local Players = game:GetService("Players") local RunService = game:GetService("RunService") local ReplicatedStorage = game:GetService("ReplicatedStorage") local LocalPlayer = Players.LocalPlayer local Workspace = game:GetService("Workspace") local UserInputService = game:GetService("UserInputService") local Camera = workspace.CurrentCamera -- Remote events local eventsFolder = ReplicatedStorage:FindFirstChild("Events") if not eventsFolder then warn("[PV] Events folder not found") return end local combatEvent = eventsFolder:FindFirstChild("CombatEvent") local hitEvent = eventsFolder:FindFirstChild("HitEvent") if not combatEvent or not hitEvent then warn("[PV] CombatEvent or HitEvent missing") return end local serverEvent = nil local function getServerEvent() if not serverEvent then local mark = ReplicatedStorage:FindFirstChild("Characters") if mark then mark = mark:FindFirstChild("Mark") end if mark then local evts = mark:FindFirstChild("Events") if evts then serverEvent = evts:FindFirstChild("ServerEvent") end end end return serverEvent end print("[PV] Events ready") --// Sound IDs local soundIds = { Fatality = "rbxassetid://94204395881101", Neverlose = "rbxassetid://8726881116", Gamesense = "rbxassetid://4817809188", Rust = "rbxassetid://1255040462", Ciallo = "rbxassetid://119294117978411", Osu = "rbxassetid://7147454322", Minecraft = "rbxassetid://1053296915", Bow = "rbxassetid://3442683707", } local selectedSoundId = soundIds.Fatality --// Color presets local colorPresets = { ["红色"] = Color3.fromRGB(255, 50, 50), ["蓝色"] = Color3.fromRGB(50, 150, 255), ["绿色"] = Color3.fromRGB(50, 255, 50), ["黄色"] = Color3.fromRGB(255, 255, 50), ["紫色"] = Color3.fromRGB(200, 50, 255), ["青色"] = Color3.fromRGB(50, 255, 255), ["白色"] = Color3.fromRGB(255, 255, 255), ["橙色"] = Color3.fromRGB(255, 150, 50), } local selectedParticleColor = colorPresets["红色"] local particleShape = "圆形" --// Feature toggles local KillAuraEnabled = false local KillAuraRange = 30 local KillAuraSpeed = 0.04 local KillAuraNotifyCooldown = 0.5 local KillAuraNotifyEnabled = true local HitSoundEnabled = false local AttackSilentAimEnabled = false local ParticleEnabled = false local PriorityMode = "距离最近" local MaxTargets = 1 -- 当前杀戮主目标(用于破防判定) local currentKillTarget = nil local AutoBlockEnabled = false local BlockDistance = 30 local SilentAimEnabled = false local AntiBlockEnabled = false local AntiBlockCooldown = 0.5 local lastAntiBlockTime = 0 -- 破防瞬移位置模式及参数 local AntiBlockPositionMode = "后面" -- 环绕/前面/后面/下面 local AntiBlockFrontDistance = 3 local AntiBlockBackDistance = 3 local AntiBlockBelowDistance = 5 local AntiBlockSurroundDistance = 5 -- 环绕距离 local AntiBlockSurroundSpeed = 5 -- 环绕速度(度/秒) local antiBlockSurroundAngle = 0 -- 破防环绕累计角度 -- Auto teleport local AutoTeleportEnabled = false local TeleportPosition = "前面" -- 前面/后面/下方/环绕 local TeleportDistance = 3 local TeleportCooldown = 0.5 local TeleportMaxDistance = 30 local lastTeleportTime = 0 local TeleportTargetMode = "距离" local SelectedTeleportPlayer = nil local TeleportBelowDistance = 5 -- 环绕瞬移参数 local SurroundDistance = 5 local SurroundSpeed = 5 -- 度/秒 local surroundAngle = 0 -- 内部累计角度 -- Quick move local QuickMoveEnabled = false local QuickMoveSpeed = 50 -- 行走速度修改 local WalkSpeedEnabled = false local CustomWalkSpeed = 16 local lastAttackTime = 0 local lastNotifyTime = 0 local IgnoreDeadEnemies = true -- Hitbox local HitboxConfig = { Enabled = false, Size = 15, Transparency = 0.5, Color = Color3.fromRGB(255, 0, 0) } -- Movement local MovementConfig = { FlyEnabled = false, FlySpeed = 50, } -- Circular buttons local ShowKillButton = true local ShowTeleportButton = true local CircleKillSize = 60 local CircleTeleportSize = 60 -- NEW: Suicide button local ShowSuicideButton = true local CircleSuicideSize = 60 local killToggleRef = nil local blockToggleRef = nil local antiBlockToggleRef = nil local teleportToggleRef = nil --// ESP2 Settings local ESP2_Settings = { Enabled = false, ShowBox = true, ShowName = true, ShowHealth = true, ShowChams = true, ShowStatus = true, TeamCheck = true, MaxDistance = 5000, BoxColor = Color3.fromRGB(255, 255, 255), BoxColorMode = "固定", NameColor = Color3.fromRGB(255, 255, 255), NameColorMode = "固定", HealthBarColor = Color3.fromRGB(0, 255, 0), HealthBarColorMode = "固定", StatusColor = Color3.fromRGB(255, 255, 100), StatusColorMode = "固定", } local ESP2 = { ScreenGui = nil, PlayerElements = {}, Connections = {}, RenderConnection = nil, FontSize = 11, } --// Fly Variables local Fly_SelectedPlayer = nil local Fly_LoopEnabled = false local Fly_LoopTask = nil local Fly_LoopAmplitude = 1 local Fly_DeathCheck = false local Fly_AntiFlyEnabled = false local Fly_FlungDuration = 2 --// ========================================== --// Utility Functions --// ========================================== local function SafeGetCharacter(player) if not player then return nil end local char = player.Character if not char or not char.Parent then return nil end return char end local function SafeGetHRP(char) if not char then return nil end return char:FindFirstChild("HumanoidRootPart") end local function SafeGetHumanoid(char) if not char then return nil end return char:FindFirstChildOfClass("Humanoid") end local function IsPlayerAlive(player) local char = SafeGetCharacter(player) if not char then return false end local hum = SafeGetHumanoid(char) return hum and hum.Health > 0 end --// ========================================== --// ESP2 Functions (Full) --// ========================================== local function ESP2_GetDynamicColor(mode, speed) speed = speed or 2.0 local t = tick() * speed if mode == "循环色相" then return Color3.fromHSV((t % 2) / 2, 1, 1) elseif mode == "瀑布" then local hue = (t % 2) / 2 local brightness = (math.sin(t * 2) + 1) / 2 return Color3.fromHSV(hue, 1, brightness) elseif mode == "波浪" then local r = (math.sin(t * 1.3) + 1) / 2 local g = (math.sin(t * 1.7 + 2) + 1) / 2 local b = (math.sin(t * 2.1 + 4) + 1) / 2 return Color3.new(r, g, b) end return Color3.fromHSV(0, 1, 1) end local function ESP2_GetCurrentColor(mode, fixedColor) if mode == "固定" then return fixedColor end return ESP2_GetDynamicColor(mode) end local function ESP2_FadeOutOnDist(element, distance, maxDist) local maxD = maxDist or ESP2_Settings.MaxDistance local transparency = math.max(0.1, 1 - (distance / maxD)) if element:IsA("TextLabel") then element.TextTransparency = 1 - transparency elseif element:IsA("UIStroke") then element.Transparency = 1 - transparency end end local function ESP2_Create(Class, Properties) local inst = (type(Class) == "string") and Instance.new(Class) or Class for prop, val in pairs(Properties) do inst[prop] = val end return inst end local function CreateESP2ScreenGui() if ESP2.ScreenGui then return end ESP2.ScreenGui = ESP2_Create("ScreenGui", { Parent = game:GetService("CoreGui"), Name = "ESP2Holder", Enabled = true, }) end local function DestroyESP2ForPlayer(plr) local elements = ESP2.PlayerElements[plr] if elements then for _, v in pairs(elements) do if v then pcall(function() v:Destroy() end) end end ESP2.PlayerElements[plr] = nil end end local function CreateESP2ForPlayer(plr) if ESP2.PlayerElements[plr] then return end local sg = ESP2.ScreenGui if not sg then return end local elements = {} elements.Name = ESP2_Create("TextLabel", { Parent = sg, Position = UDim2.new(0.5,0,0,-11), Size = UDim2.new(0,100,0,20), AnchorPoint = Vector2.new(0.5,0.5), BackgroundTransparency = 1, TextColor3 = Color3.fromRGB(255,255,255), Font = Enum.Font.Code, TextSize = ESP2.FontSize, TextStrokeTransparency = 0, TextStrokeColor3 = Color3.fromRGB(0,0,0), RichText = true, Visible = false, }) elements.Status = ESP2_Create("TextLabel", { Parent = sg, Position = UDim2.new(0.5,0,0,11), Size = UDim2.new(0,100,0,20), AnchorPoint = Vector2.new(0.5,0.5), BackgroundTransparency = 1, TextColor3 = Color3.fromRGB(255,255,100), Font = Enum.Font.Code, TextSize = ESP2.FontSize, TextStrokeTransparency = 0, TextStrokeColor3 = Color3.fromRGB(0,0,0), Visible = false, }) elements.Box = ESP2_Create("Frame", { Parent = sg, BackgroundColor3 = Color3.fromRGB(255,255,255), BackgroundTransparency = 1, BorderSizePixel = 0, Visible = false, }) elements.Outline = ESP2_Create("UIStroke", { Parent = elements.Box, Enabled = true, Transparency = 0, Color = Color3.fromRGB(255,255,255), LineJoinMode = Enum.LineJoinMode.Miter, Thickness = 1, }) elements.Healthbar = ESP2_Create("Frame", { Parent = sg, BackgroundColor3 = Color3.fromRGB(0,255,0), BackgroundTransparency = 0, Visible = false, }) elements.BehindHealthbar = ESP2_Create("Frame", { Parent = sg, ZIndex = -1, BackgroundColor3 = Color3.fromRGB(0,0,0), BackgroundTransparency = 0, Visible = false, }) elements.HealthText = ESP2_Create("TextLabel", { Parent = sg, Position = UDim2.new(0.5,0,0,31), Size = UDim2.new(0,100,0,20), AnchorPoint = Vector2.new(0.5,0.5), BackgroundTransparency = 1, TextColor3 = Color3.fromRGB(255,255,255), Font = Enum.Font.Code, TextSize = ESP2.FontSize, TextStrokeTransparency = 0, TextStrokeColor3 = Color3.fromRGB(0,0,0), Visible = false, }) elements.Chams = ESP2_Create("Highlight", { Parent = sg, FillTransparency = 1, OutlineTransparency = 0, OutlineColor = Color3.fromRGB(119,120,255), DepthMode = "AlwaysOnTop", Enabled = false, }) ESP2.PlayerElements[plr] = elements end local function getEnemyStatus(enemyChar) if not enemyChar then return "空闲" end local boostPhase = enemyChar:FindFirstChild("BoostPhase") if boostPhase and typeof(boostPhase.Value) == "number" then return "冲刺" .. boostPhase.Value .. "阶段" end local flying = enemyChar:FindFirstChild("Flying") if flying and flying.Value == true then return "飞行冲刺" end local blocking = enemyChar:FindFirstChild("Blocking") if blocking and blocking.Value == true then return "防御中" end local currentSkill = enemyChar:FindFirstChild("CurrentSkill") if currentSkill and typeof(currentSkill.Value) == "number" then return "技能" .. currentSkill.Value end local usingSkill = enemyChar:FindFirstChild("UsingSkill") if usingSkill and usingSkill.Value == true then local skillNum = enemyChar:FindFirstChild("SkillNumber") if skillNum then return "技能" .. skillNum.Value end return "技能释放" end local hum = enemyChar:FindFirstChildOfClass("Humanoid") if hum then local state = hum:GetState() local stateName = tostring(state):lower() if stateName:find("running") then return "奔跑中" elseif stateName:find("jumping") then return "跳跃中" elseif stateName:find("falling") then return "下落中" elseif stateName:find("swimming") then return "游泳中" elseif stateName:find("climbing") then return "攀爬中" elseif stateName:find("ragdoll") then return "布娃娃" elseif stateName:find("physics") then return "物理移动" end end return "待机" end local function UpdateESP2() local camera = workspace.CurrentCamera if not camera then return end local lp = game.Players.LocalPlayer local maxDist = ESP2_Settings.MaxDistance local boxColor = ESP2_GetCurrentColor(ESP2_Settings.BoxColorMode, ESP2_Settings.BoxColor) local nameColor = ESP2_GetCurrentColor(ESP2_Settings.NameColorMode, ESP2_Settings.NameColor) local healthColor = ESP2_GetCurrentColor(ESP2_Settings.HealthBarColorMode, ESP2_Settings.HealthBarColor) local statusColor = ESP2_GetCurrentColor(ESP2_Settings.StatusColorMode, ESP2_Settings.StatusColor) for plr, elements in pairs(ESP2.PlayerElements) do local shouldHide = true if plr and plr.Character then local char = plr.Character local hrp = char:FindFirstChild("HumanoidRootPart") local hum = char:FindFirstChild("Humanoid") if hrp and hum and hum.Health > 0 then local sameTeam = (ESP2_Settings.TeamCheck and lp.Team == plr.Team and lp.Team ~= nil) if not sameTeam then local pos, onScreen = camera:WorldToScreenPoint(hrp.Position) local dist = (camera.CFrame.Position - hrp.Position).Magnitude if onScreen and dist <= maxDist then shouldHide = false local size = hrp.Size.Y local scaleFactor = (size * camera.ViewportSize.Y) / (pos.Z * 2) local w = 3 * scaleFactor local h = 4.5 * scaleFactor if ESP2_Settings.ShowBox then elements.Box.Position = UDim2.new(0, pos.X - w/2, 0, pos.Y - h/2) elements.Box.Size = UDim2.new(0, w, 0, h) elements.Box.Visible = true elements.Box.BackgroundTransparency = 1 elements.Outline.Color = boxColor elements.Outline.Enabled = true ESP2_FadeOutOnDist(elements.Outline, dist, maxDist) else elements.Box.Visible = false elements.Outline.Enabled = false end if ESP2_Settings.ShowChams then elements.Chams.Adornee = char elements.Chams.Enabled = true elements.Chams.FillColor = Color3.fromRGB(119,120,255) elements.Chams.FillTransparency = 0.8 elements.Chams.OutlineColor = boxColor elements.Chams.OutlineTransparency = 0.5 elements.Chams.DepthMode = "AlwaysOnTop" else elements.Chams.Enabled = false end if ESP2_Settings.ShowName then elements.Name.Text = string.format("%s [%dm]", plr.Name, math.floor(dist)) elements.Name.Position = UDim2.new(0, pos.X, 0, pos.Y - h/2 - 9) elements.Name.TextColor3 = nameColor elements.Name.Visible = true ESP2_FadeOutOnDist(elements.Name, dist, maxDist) else elements.Name.Visible = false end if ESP2_Settings.ShowStatus then local footPos = hrp.Position - Vector3.new(0, 3, 0) local footScreen, _ = camera:WorldToScreenPoint(footPos) elements.Status.Text = "🔄 " .. getEnemyStatus(char) elements.Status.Position = UDim2.new(0, footScreen.X, 0, footScreen.Y) elements.Status.TextColor3 = statusColor elements.Status.Visible = true ESP2_FadeOutOnDist(elements.Status, dist, maxDist) else elements.Status.Visible = false end if ESP2_Settings.ShowHealth then local health = hum.Health / hum.MaxHealth health = math.clamp(health, 0, 1) elements.Healthbar.Position = UDim2.new(0, pos.X - w/2 - 6, 0, pos.Y - h/2 + h * (1 - health)) elements.Healthbar.Size = UDim2.new(0, 2.5, 0, h * health) elements.Healthbar.BackgroundColor3 = healthColor elements.Healthbar.Visible = true elements.BehindHealthbar.Position = UDim2.new(0, pos.X - w/2 - 6, 0, pos.Y - h/2) elements.BehindHealthbar.Size = UDim2.new(0, 2.5, 0, h) elements.BehindHealthbar.Visible = true local healthPercent = math.floor(hum.Health / hum.MaxHealth * 100) elements.HealthText.Position = UDim2.new(0, pos.X - w/2 - 6, 0, pos.Y - h/2 + h * (1 - healthPercent/100) + 3) elements.HealthText.Text = tostring(healthPercent) elements.HealthText.Visible = (hum.Health < hum.MaxHealth) ESP2_FadeOutOnDist(elements.Healthbar, dist, maxDist) ESP2_FadeOutOnDist(elements.BehindHealthbar, dist, maxDist) ESP2_FadeOutOnDist(elements.HealthText, dist, maxDist) else elements.Healthbar.Visible = false elements.BehindHealthbar.Visible = false elements.HealthText.Visible = false end end end end end if shouldHide then for _, v in pairs(elements) do if v and v:IsA("GuiObject") then v.Visible = false end end if elements.Chams then elements.Chams.Enabled = false end end end for plr, _ in pairs(ESP2.PlayerElements) do if not game.Players:FindFirstChild(plr.Name) then DestroyESP2ForPlayer(plr) end end end local function InitESP2Events() if ESP2.Connections.PlayerAdded then return end ESP2.Connections.PlayerAdded = game.Players.PlayerAdded:Connect(function(plr) if plr == game.Players.LocalPlayer then return end CreateESP2ForPlayer(plr) end) ESP2.Connections.PlayerRemoving = game.Players.PlayerRemoving:Connect(DestroyESP2ForPlayer) for _, plr in ipairs(game.Players:GetPlayers()) do if plr ~= game.Players.LocalPlayer then CreateESP2ForPlayer(plr) end end end local function SetESP2Enabled(enabled) ESP2_Settings.Enabled = enabled if enabled then CreateESP2ScreenGui() InitESP2Events() if not ESP2.RenderConnection then ESP2.RenderConnection = RunService.RenderStepped:Connect(function() if ESP2_Settings.Enabled then UpdateESP2() end end) end else if ESP2.RenderConnection then ESP2.RenderConnection:Disconnect(); ESP2.RenderConnection = nil end for _, elements in pairs(ESP2.PlayerElements) do for _, v in pairs(elements) do if v and v:IsA("GuiObject") then v.Visible = false end end if elements.Chams then elements.Chams.Enabled = false end end if ESP2.ScreenGui then ESP2.ScreenGui:Destroy(); ESP2.ScreenGui = nil end end end --// ========================================== --// Particle, Sound, Combat, Block etc. --// ========================================== local function createParticle(targetPos, color) local char = LocalPlayer.Character if not char then return end local hrp = char:FindFirstChild("HumanoidRootPart") if not hrp then return end local startPos = hrp.Position + Vector3.new(0, 1.5, 0) if particleShape == "圆形" then local part = Instance.new("Part") part.Size = Vector3.new(1, 1, 1) part.Shape = Enum.PartType.Ball part.BrickColor = BrickColor.new(color) part.Material = Enum.Material.Neon part.CanCollide = false part.Anchored = false part.CFrame = CFrame.new(startPos) part.Transparency = 0.2 part.Parent = Workspace local light = Instance.new("PointLight") light.Color = color light.Brightness = 2 light.Range = 5 light.Parent = part local attach = Instance.new("Attachment") attach.Parent = part local particle = Instance.new("ParticleEmitter") particle.Parent = attach particle.Texture = "rbxasset://textures/particles/sparkles_main.dds" particle.Lifetime = NumberRange.new(0.3, 0.6) particle.Rate = 100 particle.VelocityInheritance = 0 particle.SpreadAngle = Vector2.new(30, 30) particle.Speed = NumberRange.new(1, 3) particle.Color = ColorSequence.new(color) particle.Transparency = NumberSequence.new({NumberSequenceKeypoint.new(0,0.5), NumberSequenceKeypoint.new(1,1)}) particle.Size = NumberSequence.new({NumberSequenceKeypoint.new(0,0.5), NumberSequenceKeypoint.new(1,0)}) particle.Enabled = true local duration = 0.4 local startTime = tick() local startCF = part.CFrame local targetCF = CFrame.new(targetPos) local connection connection = RunService.Heartbeat:Connect(function() local elapsed = tick() - startTime local alpha = math.min(elapsed / duration, 1) local eased = alpha * alpha * (3 - 2 * alpha) part.CFrame = startCF:Lerp(targetCF, eased) part.Size = Vector3.new(1, 1, 1) * (1 + eased * 0.5) part.Transparency = 0.2 + eased * 0.3 if alpha >= 1 then connection:Disconnect() local burst = Instance.new("ParticleEmitter") burst.Parent = attach burst.Texture = "rbxasset://textures/particles/sparkles_main.dds" burst.Lifetime = NumberRange.new(0.2, 0.5) burst.Rate = 0 burst.SpreadAngle = Vector2.new(180, 180) burst.Speed = NumberRange.new(2, 6) burst.Color = ColorSequence.new(color) burst.Transparency = NumberSequence.new({NumberSequenceKeypoint.new(0,0), NumberSequenceKeypoint.new(1,1)}) burst.Size = NumberSequence.new({NumberSequenceKeypoint.new(0,0.5), NumberSequenceKeypoint.new(1,0)}) burst.Enabled = true pcall(function() burst:Emit(30) end) task.delay(0.1, function() burst:Destroy() end) task.delay(0.3, function() part:Destroy() end) end end) task.delay(2, function() if connection and connection.Connected then connection:Disconnect() end if part and part.Parent then part:Destroy() end end) elseif particleShape == "云形" then for i = 1, 12 do local offset = Vector3.new( (math.random() - 0.5) * 2, (math.random() - 0.5) * 2, (math.random() - 0.5) * 2 ) local part = Instance.new("Part") part.Size = Vector3.new(0.3, 0.3, 0.3) part.Shape = Enum.PartType.Ball part.BrickColor = BrickColor.new(color) part.Material = Enum.Material.Neon part.CanCollide = false part.Anchored = false part.CFrame = CFrame.new(startPos + offset) part.Transparency = 0.5 part.Parent = Workspace local light = Instance.new("PointLight") light.Color = color light.Brightness = 1 light.Range = 3 light.Parent = part local duration = 0.6 + math.random() * 0.3 local startTime = tick() local startCF = part.CFrame local targetCF = CFrame.new(targetPos + Vector3.new( (math.random()-0.5)*1.5, (math.random()-0.5)*1.5, (math.random()-0.5)*1.5 )) local connection connection = RunService.Heartbeat:Connect(function() local elapsed = tick() - startTime local alpha = math.min(elapsed / duration, 1) local eased = alpha * alpha * (3 - 2 * alpha) part.CFrame = startCF:Lerp(targetCF, eased) part.Transparency = 0.5 + eased * 0.5 if alpha >= 1 then connection:Disconnect() part:Destroy() end end) task.delay(2, function() if connection and connection.Connected then connection:Disconnect() end if part and part.Parent then part:Destroy() end end) end elseif particleShape == "激光" then local function createBeam(offset) local beamPart = Instance.new("Part") beamPart.Size = Vector3.new(0.1, 0.1, 0.1) beamPart.BrickColor = BrickColor.new(color) beamPart.Material = Enum.Material.Neon beamPart.CanCollide = false beamPart.Anchored = false beamPart.Transparency = 0.2 beamPart.Parent = Workspace local light = Instance.new("PointLight") light.Color = color light.Brightness = 3 light.Range = 4 light.Parent = beamPart local startPos2 = startPos + offset local endPos = targetPos + offset local duration = 0.25 local startTime = tick() local startCF = CFrame.new(startPos2, endPos) local connection connection = RunService.Heartbeat:Connect(function() local elapsed = tick() - startTime local alpha = math.min(elapsed / duration, 1) local eased = alpha * alpha * (3 - 2 * alpha) local currentPos = startPos2:Lerp(endPos, eased) local currentCF = CFrame.new(currentPos, endPos) local dist = (endPos - startPos2).Magnitude * eased beamPart.CFrame = currentCF beamPart.Size = Vector3.new(0.15, 0.15, math.max(0.1, dist)) beamPart.Transparency = 0.2 + (1 - eased) * 0.3 if alpha >= 1 then connection:Disconnect() beamPart:Destroy() end end) task.delay(1, function() if connection and connection.Connected then connection:Disconnect() end if beamPart and beamPart.Parent then beamPart:Destroy() end end) end createBeam(Vector3.new(0.5, 0, 0)) createBeam(Vector3.new(-0.5, 0, 0)) end end local function playHitSound() local sound = Instance.new("Sound") sound.SoundId = selectedSoundId sound.Volume = 0.8 sound.Parent = workspace.CurrentCamera or Workspace sound:Play() task.delay(sound.TimeLength + 0.1, function() sound:Destroy() end) end local function attackTarget(targetChar) if not targetChar or not targetChar.Parent then return end combatEvent:FireServer("Attack") hitEvent:FireServer({targetChar}) if HitSoundEnabled then playHitSound() end if ParticleEnabled then local root = targetChar:FindFirstChild("HumanoidRootPart") if root then createParticle(root.Position, selectedParticleColor) end end end local function blockActivate() combatEvent:FireServer("Block", true) local se = getServerEvent() if se then se:FireServer("BlockActivate", true) end end local function setCharacterFacing(targetPos) local char = LocalPlayer.Character if not char then return end local hrp = char:FindFirstChild("HumanoidRootPart") if not hrp then return end local direction = (targetPos - hrp.Position) * Vector3.new(1, 0, 1) if direction.Magnitude > 0.001 then hrp.CFrame = CFrame.lookAt(hrp.Position, hrp.Position + direction.Unit) end end local function isEnemyBlocking(enemyChar) if not enemyChar then return false end if enemyChar:GetAttribute("Blocking") then return true end for _, child in ipairs(enemyChar:GetChildren()) do if child:IsA("BoolValue") then local n = child.Name:lower() if n:find("block") or n:find("guard") or n:find("defend") then if child.Value == true then return true end end end end local hum = enemyChar:FindFirstChildOfClass("Humanoid") if hum then local ok, state = pcall(function() return hum:GetState() end) if ok and state then local s = tostring(state):lower() if s:find("block") or s:find("guard") or s:find("defend") then return true end end end return false end -- 通用瞬移函数(支持环绕角度传入) local function teleportToTargetEx(targetRoot, posMode, frontDist, backDist, belowDist, surroundDist, angle) local char = LocalPlayer.Character if not char then return end local hrp = char:FindFirstChild("HumanoidRootPart") if not hrp or not targetRoot then return end local enemyPos = targetRoot.Position if posMode == "前面" then local lookDir = targetRoot.CFrame.LookVector local tpPos = enemyPos + lookDir * (frontDist or 3) tpPos = Vector3.new(tpPos.X, enemyPos.Y, tpPos.Z) hrp.CFrame = CFrame.new(tpPos, enemyPos) elseif posMode == "后面" then local lookDir = targetRoot.CFrame.LookVector local tpPos = enemyPos - lookDir * (backDist or 3) tpPos = Vector3.new(tpPos.X, enemyPos.Y, tpPos.Z) hrp.CFrame = CFrame.new(tpPos, enemyPos) elseif posMode == "下方" then local tpPos = enemyPos - Vector3.new(0, belowDist or 5, 0) hrp.CFrame = CFrame.new(tpPos) elseif posMode == "环绕" then local rad = math.rad(angle or 0) local offset = Vector3.new(math.cos(rad) * (surroundDist or 5), 0, math.sin(rad) * (surroundDist or 5)) local tpPos = enemyPos + offset hrp.CFrame = CFrame.new(tpPos, enemyPos) end end local function applyHitbox() if not HitboxConfig.Enabled then return end for _, player in ipairs(Players:GetPlayers()) do if player == LocalPlayer then continue end local char = player.Character if char then local hrp = char:FindFirstChild("HumanoidRootPart") if hrp then hrp.Size = Vector3.new(HitboxConfig.Size, HitboxConfig.Size, HitboxConfig.Size) hrp.Transparency = HitboxConfig.Transparency hrp.Color = HitboxConfig.Color hrp.Material = Enum.Material.Neon hrp.CanCollide = false end end end end local function updateMovement() local char = LocalPlayer.Character if not char then return end local root = char:FindFirstChild("HumanoidRootPart") local hum = char:FindFirstChildOfClass("Humanoid") if not root or not hum then return end if MovementConfig.FlyEnabled then hum.PlatformStand = true local moveDir = Vector3.new(0, 0, 0) if UserInputService:IsKeyDown(Enum.KeyCode.W) then moveDir += Camera.CFrame.LookVector end if UserInputService:IsKeyDown(Enum.KeyCode.S) then moveDir -= Camera.CFrame.LookVector end if UserInputService:IsKeyDown(Enum.KeyCode.A) then moveDir -= Camera.CFrame.RightVector end if UserInputService:IsKeyDown(Enum.KeyCode.D) then moveDir += Camera.CFrame.RightVector end if UserInputService:IsKeyDown(Enum.KeyCode.Space) then moveDir += Vector3.new(0,1,0) end if UserInputService:IsKeyDown(Enum.KeyCode.LeftShift) then moveDir -= Vector3.new(0,1,0) end if moveDir.Magnitude == 0 and UserInputService.TouchEnabled then moveDir = Camera.CFrame.LookVector end if moveDir.Magnitude > 0 then moveDir = moveDir.Unit end root.AssemblyLinearVelocity = moveDir * MovementConfig.FlySpeed else if hum.PlatformStand then hum.PlatformStand = false end end end --// ========================================== --// ★★★ 全新甩飞逻辑 (彻底修复反弹) ★★★ --// ========================================== local function ThrowPlayer(targetPlayer) local localCharacter = LocalPlayer.Character local localHumanoid = localCharacter and localCharacter:FindFirstChildOfClass("Humanoid") local localRootPart = localHumanoid and localHumanoid.RootPart local targetCharacter = targetPlayer.Character if not targetCharacter then Library:Notify("玩家消失", 3) return end local targetHumanoid = targetCharacter:FindFirstChildOfClass("Humanoid") local targetRootPart = targetHumanoid and targetHumanoid.RootPart local targetHead = targetCharacter:FindFirstChild("Head") local targetAccessory = targetCharacter:FindFirstChildOfClass("Accessory") local accessoryHandle = targetAccessory and targetAccessory:FindFirstChild("Handle") if not localCharacter or not localHumanoid or not localRootPart then Library:Notify("本地玩家异常", 3) return end if targetHumanoid and targetHumanoid.Sit then Library:Notify("目标坐着", 3) return end if not targetCharacter:FindFirstChildWhichIsA("BasePart") then return end -- 记录初始位置(局部变量) local initialCF = localRootPart.CFrame -- 切换相机到目标(可选) if targetHead then workspace.CurrentCamera.CameraSubject = targetHead elseif accessoryHandle then workspace.CurrentCamera.CameraSubject = accessoryHandle elseif targetHumanoid then workspace.CurrentCamera.CameraSubject = targetHumanoid end local function ApplyThrowForce(part, offset, rotation) localRootPart.CFrame = CFrame.new(part.Position) * offset * rotation localCharacter:SetPrimaryPartCFrame(CFrame.new(part.Position) * offset * rotation) localRootPart.Velocity = Vector3.new(90000000, 900000000, 90000000) localRootPart.RotVelocity = Vector3.new(900000000, 900000000, 900000000) end local function PerformThrowAnimation(part) local timeoutDuration = Fly_FlungDuration or 2 local startTime = tick() local rotationAngle = 0 while localRootPart do local velocityMagnitude = part.Velocity.Magnitude if velocityMagnitude < 50 then rotationAngle = rotationAngle + 100 ApplyThrowForce(part, CFrame.new(0, 1.5, 0) + targetHumanoid.MoveDirection * part.Velocity.Magnitude / 1.25, CFrame.Angles(math.rad(rotationAngle), 0, 0)) task.wait() ApplyThrowForce(part, CFrame.new(0, -1.5, 0) + targetHumanoid.MoveDirection * part.Velocity.Magnitude / 1.25, CFrame.Angles(math.rad(rotationAngle), 0, 0)) task.wait() ApplyThrowForce(part, CFrame.new(2.25, 1.5, -2.25) + targetHumanoid.MoveDirection * part.Velocity.Magnitude / 1.25, CFrame.Angles(math.rad(rotationAngle), 0, 0)) task.wait() ApplyThrowForce(part, CFrame.new(-2.25, -1.5, 2.25) + targetHumanoid.MoveDirection * part.Velocity.Magnitude / 1.25, CFrame.Angles(math.rad(rotationAngle), 0, 0)) task.wait() ApplyThrowForce(part, CFrame.new(0, 1.5, 0) + targetHumanoid.MoveDirection, CFrame.Angles(math.rad(rotationAngle), 0, 0)) task.wait() ApplyThrowForce(part, CFrame.new(0, -1.5, 0) + targetHumanoid.MoveDirection, CFrame.Angles(math.rad(rotationAngle), 0, 0)) task.wait() else ApplyThrowForce(part, CFrame.new(0, 1.5, targetHumanoid.WalkSpeed), CFrame.Angles(math.rad(90), 0, 0)) task.wait() ApplyThrowForce(part, CFrame.new(0, -1.5, -targetHumanoid.WalkSpeed), CFrame.Angles(0, 0, 0)) task.wait() ApplyThrowForce(part, CFrame.new(0, 1.5, targetHumanoid.WalkSpeed), CFrame.Angles(math.rad(90), 0, 0)) task.wait() ApplyThrowForce(part, CFrame.new(0, 1.5, targetRootPart.Velocity.Magnitude / 1.25), CFrame.Angles(math.rad(90), 0, 0)) task.wait() ApplyThrowForce(part, CFrame.new(0, -1.5, -targetRootPart.Velocity.Magnitude / 1.25), CFrame.Angles(0, 0, 0)) task.wait() ApplyThrowForce(part, CFrame.new(0, 1.5, targetRootPart.Velocity.Magnitude / 1.25), CFrame.Angles(math.rad(90), 0, 0)) task.wait() ApplyThrowForce(part, CFrame.new(0, -1.5, 0), CFrame.Angles(math.rad(90), 0, 0)) task.wait() ApplyThrowForce(part, CFrame.new(0, -1.5, 0), CFrame.Angles(0, 0, 0)) task.wait() ApplyThrowForce(part, CFrame.new(0, -1.5, 0), CFrame.Angles(math.rad(-90), 0, 0)) task.wait() ApplyThrowForce(part, CFrame.new(0, -1.5, 0), CFrame.Angles(0, 0, 0)) task.wait() end if not targetPlayer.Character then break end if not targetHumanoid or targetHumanoid.Health <= 0 then break end if tick() - startTime > timeoutDuration then break end end end workspace.FallenPartsDestroyHeight = 0 / 0 local bodyVelocity = Instance.new("BodyVelocity") bodyVelocity.Name = "EpixVel" bodyVelocity.Parent = localRootPart bodyVelocity.Velocity = Vector3.new(900000000, 900000000, 900000000) bodyVelocity.MaxForce = Vector3.new(1 / 0, 1 / 0, 1 / 0) localHumanoid:SetStateEnabled(Enum.HumanoidStateType.Seated, false) if targetRootPart and targetHead then if (targetRootPart.Position - targetHead.Position).Magnitude > 5 then PerformThrowAnimation(targetHead) else PerformThrowAnimation(targetRootPart) end elseif targetRootPart then PerformThrowAnimation(targetRootPart) elseif targetHead then PerformThrowAnimation(targetHead) elseif targetAccessory and accessoryHandle then PerformThrowAnimation(accessoryHandle) else Library:Notify("未找到目标部件", 3) bodyVelocity:Destroy() localHumanoid:SetStateEnabled(Enum.HumanoidStateType.Seated, true) workspace.CurrentCamera.CameraSubject = localHumanoid workspace.FallenPartsDestroyHeight = getgenv().FPDH or 0 return end bodyVelocity:Destroy() localHumanoid:SetStateEnabled(Enum.HumanoidStateType.Seated, true) workspace.CurrentCamera.CameraSubject = localHumanoid -- ★★★ 强制归位(PlatformStand 暂停物理) ★★★ if initialCF then for _, child in ipairs(localRootPart:GetChildren()) do if child:IsA("BodyVelocity") or child:IsA("BodyGyro") or child:IsA("BodyAngularVelocity") then child:Destroy() end end localHumanoid.PlatformStand = true localRootPart.CFrame = initialCF localCharacter:SetPrimaryPartCFrame(initialCF) for _, part in ipairs(localCharacter:GetChildren()) do if part:IsA("BasePart") then part.Velocity = Vector3.new() part.RotVelocity = Vector3.new() end end task.wait() localHumanoid.PlatformStand = false localHumanoid.AutoRotate = true workspace.CurrentCamera.CameraSubject = localHumanoid end workspace.FallenPartsDestroyHeight = getgenv().FPDH or 0 end -- 循环甩飞直接使用新 ThrowPlayer local function StartLoopFlung() if Fly_LoopTask then Fly_LoopEnabled = false coroutine.close(Fly_LoopTask) Fly_LoopTask = nil end Fly_LoopEnabled = true Fly_LoopTask = task.spawn(function() while Fly_LoopEnabled do if Fly_DeathCheck and Fly_SelectedPlayer and not IsPlayerAlive(Fly_SelectedPlayer) then Fly_LoopEnabled = false break end if Fly_SelectedPlayer then ThrowPlayer(Fly_SelectedPlayer) end task.wait(0.15) end end) end local function StopLoopFlung() Fly_LoopEnabled = false if Fly_LoopTask then coroutine.close(Fly_LoopTask) Fly_LoopTask = nil end end local function TeleportFlung() if not Fly_SelectedPlayer then Library:Notify("请先选择目标", 2); return end local tChar = SafeGetCharacter(Fly_SelectedPlayer) if not tChar then Library:Notify("目标不在游戏中", 2); return end local tHrp = SafeGetHRP(tChar) if not tHrp then return end local myChar = LocalPlayer.Character if not myChar then return end local myHrp = SafeGetHRP(myChar) if not myHrp then return end local origCFrame = myChar:GetPrimaryPartCFrame() local targetPos = tHrp.Position + tHrp.CFrame.LookVector * 2 myHrp.CFrame = CFrame.new(targetPos) ThrowPlayer(Fly_SelectedPlayer) task.wait(0.15) if myChar and origCFrame then local hrp = SafeGetHRP(myChar) if hrp then hrp.CFrame = origCFrame hrp.Velocity = Vector3.new() hrp.RotVelocity = Vector3.new() end myChar:SetPrimaryPartCFrame(origCFrame) for _, part in ipairs(myChar:GetChildren()) do if part:IsA("BasePart") then part.Velocity = Vector3.new() part.RotVelocity = Vector3.new() end end end Library:Notify("传送甩飞完成", 1.5) end local function AntiFlySelf() if not Fly_AntiFlyEnabled then return end local char = LocalPlayer.Character if not char then return end local hum = char:FindFirstChildOfClass("Humanoid") local hrp = char:FindFirstChild("HumanoidRootPart") if hum and hrp then pcall(function() hum.PlatformStand = false hum.Sit = false hum.AutoRotate = true local state = hum:GetState() if state == Enum.HumanoidStateType.Physics or state == Enum.HumanoidStateType.FallingDown or state == Enum.HumanoidStateType.Ragdoll then hum:ChangeState(Enum.HumanoidStateType.GettingUp) end if hrp.AssemblyLinearVelocity.Magnitude > 30 then hrp.AssemblyLinearVelocity = hrp.AssemblyLinearVelocity.Unit * 10 end hrp.AssemblyAngularVelocity = Vector3.new() end) end end --// ========================================== --// 行走速度修改 --// ========================================== local function ApplyWalkSpeed() local char = LocalPlayer.Character if not char then return end local hum = char:FindFirstChildOfClass("Humanoid") if hum and WalkSpeedEnabled then hum.WalkSpeed = CustomWalkSpeed end end local function SetupAntiReset() local char = LocalPlayer.Character or LocalPlayer.CharacterAdded:Wait() local hum = char:WaitForChild("Humanoid") hum:GetPropertyChangedSignal("WalkSpeed"):Connect(function() if WalkSpeedEnabled then hum.WalkSpeed = CustomWalkSpeed end end) end LocalPlayer.CharacterAdded:Connect(function(char) task.wait(0.5) SetupAntiReset() ApplyWalkSpeed() end) if LocalPlayer.Character then task.spawn(function() task.wait(0.5) SetupAntiReset() ApplyWalkSpeed() end) end local function SetWalkSpeedEnabled(enabled) WalkSpeedEnabled = enabled if enabled then ApplyWalkSpeed() else local char = LocalPlayer.Character if char then local hum = char:FindFirstChildOfClass("Humanoid") if hum then hum.WalkSpeed = 16 end end end end local function SetWalkSpeed(speed) CustomWalkSpeed = speed if WalkSpeedEnabled then ApplyWalkSpeed() end end --// ========================================== --// Circular Buttons --// ========================================== local killButton, teleportButton, killBtnGui, teleBtnGui = nil, nil, nil, nil local suicideButton, suicideBtnGui = nil, nil -- NEW local function updateKillButtonAppearance() if not killButton then return end killButton.Size = UDim2.new(0, CircleKillSize, 0, CircleKillSize) if KillAuraEnabled then killButton.BackgroundColor3 = Color3.fromRGB(0, 255, 0) killButton.TextColor3 = Color3.fromRGB(255, 255, 255) else killButton.BackgroundColor3 = Color3.fromRGB(255, 255, 255) killButton.TextColor3 = Color3.fromRGB(0, 0, 0) end if killBtnGui then killBtnGui.Enabled = ShowKillButton end end local function updateTeleportButtonAppearance() if not teleportButton then return end teleportButton.Size = UDim2.new(0, CircleTeleportSize, 0, CircleTeleportSize) if AutoTeleportEnabled then teleportButton.BackgroundColor3 = Color3.fromRGB(0, 255, 0) teleportButton.TextColor3 = Color3.fromRGB(255, 255, 255) else teleportButton.BackgroundColor3 = Color3.fromRGB(255, 255, 255) teleportButton.TextColor3 = Color3.fromRGB(0, 0, 0) end if teleBtnGui then teleBtnGui.Enabled = ShowTeleportButton end end -- NEW: update suicide button appearance local function updateSuicideButtonAppearance() if not suicideButton then return end suicideButton.Size = UDim2.new(0, CircleSuicideSize, 0, CircleSuicideSize) suicideButton.BackgroundColor3 = Color3.fromRGB(255, 50, 50) -- red background suicideButton.TextColor3 = Color3.fromRGB(255, 255, 255) if suicideBtnGui then suicideBtnGui.Enabled = ShowSuicideButton end end local function setKillAura(state) if KillAuraEnabled == state then return end KillAuraEnabled = state if killToggleRef then killToggleRef:SetValue(state) end updateKillButtonAppearance() end local function setAutoBlock(state) if AutoBlockEnabled == state then return end AutoBlockEnabled = state if blockToggleRef then blockToggleRef:SetValue(state) end end local function setAntiBlock(state) if AntiBlockEnabled == state then return end AntiBlockEnabled = state if antiBlockToggleRef then antiBlockToggleRef:SetValue(state) end end -- NEW: Suicide function local function doSuicide() local char = LocalPlayer.Character if char then local hum = char:FindFirstChildOfClass("Humanoid") if hum and hum.Health > 0 then hum.Health = 0 Library:Notify("你已自杀", 1.5) else Library:Notify("无法自杀 (已死亡或无角色)", 2) end else Library:Notify("角色不存在", 2) end end local function createRoundButton(buttonName, startPos, defaultSize, enabledState, onToggle) local btnGui = Instance.new("ScreenGui") btnGui.Name = buttonName .. "ButtonGui" btnGui.Parent = game:GetService("CoreGui") btnGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling btnGui.Enabled = true local button = Instance.new("TextButton") button.Size = UDim2.new(0, defaultSize, 0, defaultSize) button.Position = startPos button.BackgroundColor3 = Color3.fromRGB(255, 255, 255) button.Text = buttonName button.TextColor3 = Color3.fromRGB(0, 0, 0) button.Font = Enum.Font.SourceSansBold button.TextSize = 14 button.BorderSizePixel = 0 button.AutoButtonColor = false local corner = Instance.new("UICorner") corner.CornerRadius = UDim.new(1, 0) corner.Parent = button button.Parent = btnGui local dragging, dragStart, startPosLocal = false, nil, nil button.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true dragStart = input.Position startPosLocal = button.Position end end) button.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = false if dragStart and (input.Position - dragStart).Magnitude < 5 then onToggle(not enabledState()) end end end) button.InputChanged:Connect(function(input) if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then local delta = input.Position - dragStart button.Position = UDim2.new(startPosLocal.X.Scale, startPosLocal.X.Offset + delta.X, startPosLocal.Y.Scale, startPosLocal.Y.Offset + delta.Y) end end) return btnGui, button end -- Create kill and teleport buttons (existing) killBtnGui, killButton = createRoundButton("杀戮", UDim2.new(0.8, 0, 0.8, 0), CircleKillSize, function() return KillAuraEnabled end, setKillAura) teleBtnGui, teleportButton = createRoundButton("瞬移", UDim2.new(0.1, 0, 0.1, 0), CircleTeleportSize, function() return AutoTeleportEnabled end, function(state) AutoTeleportEnabled = state if teleportToggleRef then teleportToggleRef:SetValue(state) end updateTeleportButtonAppearance() end) -- NEW: Create suicide button (placed at bottom center) suicideBtnGui, suicideButton = createRoundButton("自杀", UDim2.new(0.5, 0, 0.9, 0), CircleSuicideSize, function() return false end, -- no toggle state function(_) doSuicide() end) -- Override color and text suicideButton.BackgroundColor3 = Color3.fromRGB(255, 50, 50) suicideButton.TextColor3 = Color3.fromRGB(255, 255, 255) task.spawn(function() updateKillButtonAppearance() updateTeleportButtonAppearance() updateSuicideButtonAppearance() end) --// ========================================== --// Main Heartbeat --// ========================================== local function onHeartbeat() local char = LocalPlayer.Character local hum = char and char:FindFirstChildOfClass("Humanoid") local isAlive = char and hum and hum.Health > 0 if not isAlive then updateMovement() applyHitbox() return end local hrp = char:FindFirstChild("HumanoidRootPart") if hrp then local myPos = hrp.Position local now = tick() local enemies = {} local nearestEnemy = nil local nearestDist = math.huge local maxRange = math.max(KillAuraRange, BlockDistance, TeleportMaxDistance) for _, p in ipairs(Players:GetPlayers()) do if p ~= LocalPlayer then local tChar = p.Character if tChar and tChar.Parent then local tRoot = tChar:FindFirstChild("HumanoidRootPart") if tRoot then local dist = (myPos - tRoot.Position).Magnitude if dist <= maxRange then local tHum = tChar:FindFirstChildOfClass("Humanoid") local health = tHum and tHum.Health or 0 if IgnoreDeadEnemies and health <= 0 then continue end table.insert(enemies, { char = tChar, root = tRoot, dist = dist, health = health, player = p }) if dist < nearestDist then nearestDist = dist nearestEnemy = tChar end end end end end end -- 自动瞬移 if AutoTeleportEnabled then local targetRoot = nil if TeleportTargetMode == "距离" and nearestEnemy then targetRoot = nearestEnemy:FindFirstChild("HumanoidRootPart") elseif TeleportTargetMode == "指定" and SelectedTeleportPlayer and SelectedTeleportPlayer.Character then local root = SelectedTeleportPlayer.Character:FindFirstChild("HumanoidRootPart") if root and (myPos - root.Position).Magnitude <= TeleportMaxDistance then targetRoot = root end end if targetRoot then local canTeleport = (TeleportCooldown <= 0.1) or ((now - lastTeleportTime) >= TeleportCooldown) if canTeleport then if TeleportPosition == "环绕" then surroundAngle = (surroundAngle + SurroundSpeed * 0.1) % 360 teleportToTargetEx(targetRoot, "环绕", nil, nil, nil, SurroundDistance, surroundAngle) else teleportToTargetEx(targetRoot, TeleportPosition, TeleportDistance, TeleportDistance, TeleportBelowDistance) end lastTeleportTime = now end end end -- 杀戮光环 currentKillTarget = nil if KillAuraEnabled then local targets = {} for _, info in ipairs(enemies) do if info.dist <= KillAuraRange then table.insert(targets, info) end end if #targets > 0 then if PriorityMode == "距离最近" then table.sort(targets, function(a,b) return a.dist < b.dist end) elseif PriorityMode == "血量最低" then table.sort(targets, function(a,b) return a.health < b.health end) end currentKillTarget = targets[1].player local count = math.min(MaxTargets, #targets) local noCooldown = (KillAuraSpeed <= 0.01) local shouldNotify = KillAuraNotifyEnabled and (now - lastNotifyTime) >= KillAuraNotifyCooldown local notified = false local attacked = false for i = 1, count do local info = targets[i] if noCooldown or (now - lastAttackTime >= KillAuraSpeed) then attackTarget(info.char) attacked = true if AttackSilentAimEnabled and i == 1 then local root = info.char:FindFirstChild("HumanoidRootPart") if root then setCharacterFacing(root.Position) end end if shouldNotify and not notified then pcall(function() Library:Notify(string.format("攻击 %s (剩余血量: %d)", info.char.Name, math.floor(info.health)), 1.5) end) lastNotifyTime = now notified = true end end end if attacked then lastAttackTime = now end end end -- 破防瞬移 if AntiBlockEnabled and KillAuraEnabled and currentKillTarget then local targetChar = currentKillTarget.Character if targetChar and isEnemyBlocking(targetChar) then local tRoot = targetChar:FindFirstChild("HumanoidRootPart") if tRoot then local noCooldown = (AntiBlockCooldown <= 0.01) if noCooldown or (now - lastAntiBlockTime >= AntiBlockCooldown) then if AntiBlockPositionMode == "环绕" then antiBlockSurroundAngle = (antiBlockSurroundAngle + AntiBlockSurroundSpeed * 0.1) % 360 teleportToTargetEx(tRoot, "环绕", nil, nil, nil, AntiBlockSurroundDistance, antiBlockSurroundAngle) else teleportToTargetEx(tRoot, AntiBlockPositionMode, AntiBlockFrontDistance, AntiBlockBackDistance, AntiBlockBelowDistance) end lastAntiBlockTime = now end end end end -- 自动防御 if AutoBlockEnabled then local shouldBlock = false for _, info in ipairs(enemies) do if info.dist <= BlockDistance then shouldBlock = true; break end end if shouldBlock then blockActivate() if SilentAimEnabled and nearestEnemy then local root = nearestEnemy:FindFirstChild("HumanoidRootPart") if root then setCharacterFacing(root.Position) end end end end end updateMovement() applyHitbox() if QuickMoveEnabled then local char = LocalPlayer.Character if char then local hum = char:FindFirstChildOfClass("Humanoid") if hum and hum.MoveDirection.Magnitude > 0 and hum.Parent then pcall(function() char:TranslateBy(hum.MoveDirection * QuickMoveSpeed * 0.02) end) end end end AntiFlySelf() end local mainHeartbeatConnection = RunService.Heartbeat:Connect(onHeartbeat) --// ========================================== --// UI Construction --// ========================================== -- Combat Tab - Left local LeftGroup = Tabs.Combat:AddLeftGroupbox("杀戮光环", "crosshair") local killToggle = LeftGroup:AddToggle("KillAuraToggle", { Text = "启用杀戮光环 []", Default = false, Callback = setKillAura }) killToggleRef = killToggle LeftGroup:AddLabel("快捷键"):AddKeyPicker("KillAuraKeybind", { Default = "", NoUI = false, Text = "设置按键", Mode = "Toggle", Callback = function(key) if key then setKillAura(not KillAuraEnabled) killToggle:SetText("启用杀戮光环 [" .. key .. "]") end end }) LeftGroup:AddSlider("KillAuraRange", { Text = "攻击距离", Default = 30, Min = 5, Max = 50, Rounding = 0, Suffix = " 米", Callback = function(v) KillAuraRange = v end }) LeftGroup:AddSlider("KillAuraSpeed", { Text = "攻击速度 (≤0.01=无限制)", Default = 0.04, Min = 0.01, Max = 0.2, Rounding = 2, Suffix = " 秒", Callback = function(v) KillAuraSpeed = v end }) LeftGroup:AddDropdown("PriorityMode", { Text = "攻击策略", Values = {"距离最近", "血量最低"}, Default = "距离最近", Callback = function(v) PriorityMode = v end }) LeftGroup:AddSlider("MaxTargets", { Text = "同时攻击人数", Default = 1, Min = 1, Max = 5, Rounding = 0, Suffix = " 人", Callback = function(v) MaxTargets = v end }) LeftGroup:AddToggle("AttackSilentAimToggle", { Text = "攻击时静默朝向", Default = false, Callback = function(v) AttackSilentAimEnabled = v end }) LeftGroup:AddToggle("KillAuraNotifyToggle", { Text = "通知开关", Default = true, Callback = function(v) KillAuraNotifyEnabled = v end }) LeftGroup:AddSlider("KillAuraNotifyCooldown", { Text = "通知冷却", Default = 0.5, Min = 0.1, Max = 2, Rounding = 1, Suffix = " 秒", Callback = function(v) KillAuraNotifyCooldown = v end }) LeftGroup:AddToggle("IgnoreDeadEnemiesToggle", { Text = "死亡检测 (忽略尸体)", Default = true, Callback = function(v) IgnoreDeadEnemies = v end }) LeftGroup:AddDivider() LeftGroup:AddLabel("手机圆形开关") LeftGroup:AddToggle("ShowKillButtonToggle", { Text = "显示开关", Default = true, Callback = function(v) ShowKillButton = v; updateKillButtonAppearance() end }) LeftGroup:AddSlider("CircleKillSize", { Text = "开关大小", Default = 60, Min = 40, Max = 100, Rounding = 0, Suffix = " px", Callback = function(v) CircleKillSize = v; updateKillButtonAppearance() end }) -- 破防瞬移 LeftGroup:AddDivider() LeftGroup:AddLabel("破防瞬移") local antiBlockToggle = LeftGroup:AddToggle("AntiBlockToggle", { Text = "启用破防瞬移", Default = false, Tooltip = "仅在杀戮光环开启且攻击目标防御时触发", Callback = setAntiBlock }) antiBlockToggleRef = antiBlockToggle LeftGroup:AddSlider("AntiBlockCooldown", { Text = "瞬移冷却 (≤0.01=无限制)", Default = 0.5, Min = 0.01, Max = 2, Rounding = 2, Suffix = " 秒", Callback = function(v) AntiBlockCooldown = v end }) LeftGroup:AddDropdown("AntiBlockPositionMode", { Text = "瞬移位置", Values = {"环绕", "前面", "后面", "下方"}, Default = "后面", Callback = function(v) AntiBlockPositionMode = v end }) LeftGroup:AddSlider("AntiBlockFrontDistance", { Text = "前方距离", Default = 3, Min = 1, Max = 20, Rounding = 0, Suffix = " 米", Callback = function(v) AntiBlockFrontDistance = v end }) LeftGroup:AddSlider("AntiBlockBackDistance", { Text = "后方距离", Default = 3, Min = 1, Max = 20, Rounding = 0, Suffix = " 米", Callback = function(v) AntiBlockBackDistance = v end }) LeftGroup:AddSlider("AntiBlockBelowDistance", { Text = "下方距离", Default = 5, Min = 1, Max = 50, Rounding = 0, Suffix = " 米", Callback = function(v) AntiBlockBelowDistance = v end }) LeftGroup:AddSlider("AntiBlockSurroundDistance", { Text = "环绕距离", Default = 5, Min = 1, Max = 20, Rounding = 0, Suffix = " 米", Callback = function(v) AntiBlockSurroundDistance = v end }) LeftGroup:AddSlider("AntiBlockSurroundSpeed", { Text = "环绕速度", Default = 5, Min = 1, Max = 30, Rounding = 0, Suffix = " 度/秒", Callback = function(v) AntiBlockSurroundSpeed = v end }) -- 音效、粒子 LeftGroup:AddDivider() LeftGroup:AddLabel("命中音效") LeftGroup:AddToggle("HitSoundToggle", { Text = "启用音效", Default = false, Callback = function(v) HitSoundEnabled = v end }) LeftGroup:AddDropdown("HitSoundSelect", { Text = "选择音效", Values = {"Fatality","Neverlose","Gamesense","Rust","Ciallo","Osu","Minecraft","Bow"}, Default = "Fatality", Callback = function(v) selectedSoundId = soundIds[v] end }) LeftGroup:AddDivider() LeftGroup:AddLabel("粒子特效") LeftGroup:AddToggle("ParticleToggle", { Text = "启用粒子特效", Default = false, Callback = function(v) ParticleEnabled = v end }) LeftGroup:AddDropdown("ParticleColor", { Text = "选择颜色", Values = {"红色","蓝色","绿色","黄色","紫色","青色","白色","橙色"}, Default = "红色", Callback = function(v) selectedParticleColor = colorPresets[v] end }) LeftGroup:AddDropdown("ParticleShape", { Text = "形状选择", Values = {"圆形","云形","激光"}, Default = "圆形", Callback = function(v) particleShape = v end }) -- Combat Tab - Right local RightGroup = Tabs.Combat:AddRightGroupbox("自动防御", "shield") local blockToggle = RightGroup:AddToggle("AutoBlockToggle", { Text = "启用自动防御 []", Default = false, Callback = setAutoBlock }) blockToggleRef = blockToggle RightGroup:AddLabel("快捷键"):AddKeyPicker("AutoBlockKeybind", { Default = "", NoUI = false, Text = "设置按键", Mode = "Toggle", Callback = function(key) if key then setAutoBlock(not AutoBlockEnabled) blockToggle:SetText("启用自动防御 [" .. key .. "]") end end }) RightGroup:AddSlider("BlockDistance", { Text = "防御距离", Default = 30, Min = 5, Max = 100, Rounding = 0, Suffix = " 米", Callback = function(v) BlockDistance = v end }) RightGroup:AddToggle("SilentAimToggle", { Text = "防御时静默朝向", Default = false, Callback = function(v) SilentAimEnabled = v end }) local HitboxGroup = Tabs.Combat:AddRightGroupbox("范围攻击", "target") local HitboxToggle = HitboxGroup:AddToggle("HitboxToggle", { Text = "启用范围攻击", Default = false, Callback = function(v) HitboxConfig.Enabled = v end }) HitboxToggle:AddColorPicker("HitboxColorPicker", { Default = HitboxConfig.Color, Title = "颜色", Callback = function(v) HitboxConfig.Color = v end }) HitboxGroup:AddSlider("HitboxSize", { Text = "大小", Default = 15, Min = 1, Max = 50, Rounding = 0, Callback = function(v) HitboxConfig.Size = v end }) HitboxGroup:AddSlider("HitboxTransparency", { Text = "透明度", Default = 0.5, Min = 0, Max = 1, Rounding = 2, Callback = function(v) HitboxConfig.Transparency = v end }) local MoveGroup = Tabs.Combat:AddRightGroupbox("移动", "activity") MoveGroup:AddToggle("FlyToggle", { Text = "飞行", Default = false, Callback = function(v) MovementConfig.FlyEnabled = v end }) MoveGroup:AddSlider("FlySpeed", { Text = "飞行速度", Default = 50, Min = 10, Max = 200, Rounding = 0, Callback = function(v) MovementConfig.FlySpeed = v end }) MoveGroup:AddDivider() MoveGroup:AddToggle("QuickMoveToggle", { Text = "快速移动(绕过限速)", Default = false, Callback = function(v) QuickMoveEnabled = v end }) MoveGroup:AddSlider("QuickMoveSpeed", { Text = "移动速度", Default = 50, Min = 10, Max = 200, Rounding = 0, Callback = function(v) QuickMoveSpeed = v end }) MoveGroup:AddDivider() MoveGroup:AddLabel("行走速度修改") MoveGroup:AddToggle("WalkSpeedToggle", { Text = "启用行走速度修改", Default = false, Callback = function(v) SetWalkSpeedEnabled(v) end }) MoveGroup:AddSlider("WalkSpeedSlider", { Text = "行走速度", Default = 16, Min = 1, Max = 200, Rounding = 0, Callback = function(v) SetWalkSpeed(v) end }) -- 自动瞬移 local TeleportGroup = Tabs.Combat:AddRightGroupbox("自动瞬移", "crosshair") local teleportToggle = TeleportGroup:AddToggle("AutoTeleportToggle", { Text = "启用自动瞬移", Default = false, Callback = function(v) AutoTeleportEnabled = v updateTeleportButtonAppearance() end }) teleportToggleRef = teleportToggle TeleportGroup:AddDivider() TeleportGroup:AddLabel("瞬移模式") TeleportGroup:AddDropdown("TeleportModeSelect", { Text = "目标模式", Values = {"距离", "指定"}, Default = "距离", Callback = function(v) TeleportTargetMode = v end }) local function RefreshTeleportPlayerList() local list = {} for _, p in ipairs(Players:GetPlayers()) do if p ~= LocalPlayer then table.insert(list, p.Name) end end return list end local teleportPlayerDropdown = TeleportGroup:AddDropdown("TeleportPlayerSelect", { Text = "选择目标玩家", Values = RefreshTeleportPlayerList(), Default = "", Callback = function(v) SelectedTeleportPlayer = Players:FindFirstChild(v) end }) TeleportGroup:AddButton("刷新玩家列表", function() local newList = RefreshTeleportPlayerList() teleportPlayerDropdown:SetValues(newList) if #newList > 0 then teleportPlayerDropdown:SetValue(newList[1]) end end) TeleportGroup:AddDivider() TeleportGroup:AddDropdown("TeleportPosition", { Text = "瞬移位置", Values = {"前面", "后面", "下方", "环绕"}, Default = "前面", Callback = function(v) TeleportPosition = v end }) TeleportGroup:AddSlider("TeleportDistance", { Text = "前后距离", Default = 3, Min = 1, Max = 20, Rounding = 0, Suffix = " 米", Callback = function(v) TeleportDistance = v end }) TeleportGroup:AddSlider("TeleportBelowDistance", { Text = "下方距离", Default = 5, Min = 1, Max = 50, Rounding = 0, Suffix = " 米", Callback = function(v) TeleportBelowDistance = v end }) TeleportGroup:AddSlider("SurroundDistance", { Text = "环绕距离", Default = 5, Min = 1, Max = 20, Rounding = 0, Suffix = " 米", Callback = function(v) SurroundDistance = v end }) TeleportGroup:AddSlider("SurroundSpeed", { Text = "环绕速度", Default = 5, Min = 1, Max = 30, Rounding = 0, Suffix = " 度/秒", Callback = function(v) SurroundSpeed = v end }) TeleportGroup:AddSlider("TeleportMaxDistance", { Text = "最大瞬移距离", Default = 30, Min = 5, Max = 5000, Rounding = 0, Suffix = " 米", Callback = function(v) TeleportMaxDistance = v end }) TeleportGroup:AddSlider("TeleportCooldown", { Text = "瞬移冷却 (0.1为无冷却)", Default = 0.5, Min = 0.1, Max = 3, Rounding = 1, Suffix = " 秒", Callback = function(v) TeleportCooldown = v end }) TeleportGroup:AddDivider() TeleportGroup:AddLabel("手机圆形开关") TeleportGroup:AddToggle("ShowTeleportButtonToggle", { Text = "显示开关", Default = true, Callback = function(v) ShowTeleportButton = v; updateTeleportButtonAppearance() end }) TeleportGroup:AddSlider("CircleTeleportSize", { Text = "开关大小", Default = 60, Min = 40, Max = 100, Rounding = 0, Suffix = " px", Callback = function(v) CircleTeleportSize = v; updateTeleportButtonAppearance() end }) -- Visuals Tab local EspGroup = Tabs.Visuals:AddLeftGroupbox("ESP2 (GIT风格)", "eye") EspGroup:AddToggle("ESP2Toggle", { Text = "启用 ESP2", Default = false, Callback = SetESP2Enabled }) EspGroup:AddToggle("ESP2BoxToggle", { Text = "显示方框", Default = true, Callback = function(v) ESP2_Settings.ShowBox = v end }) EspGroup:AddToggle("ESP2NameToggle", { Text = "显示名字", Default = true, Callback = function(v) ESP2_Settings.ShowName = v end }) EspGroup:AddToggle("ESP2HealthToggle", { Text = "显示血量", Default = true, Callback = function(v) ESP2_Settings.ShowHealth = v end }) EspGroup:AddToggle("ESP2ChamsToggle", { Text = "上色 (Chams)", Default = true, Callback = function(v) ESP2_Settings.ShowChams = v end }) EspGroup:AddToggle("ESP2StatusToggle", { Text = "显示敌人状态", Default = true, Callback = function(v) ESP2_Settings.ShowStatus = v end }) EspGroup:AddToggle("ESP2TeamCheckToggle", { Text = "队伍检测", Default = true, Callback = function(v) ESP2_Settings.TeamCheck = v end }) EspGroup:AddSlider("ESP2MaxDistance", { Text = "最大距离", Default = 5000, Min = 50, Max = 10000, Rounding = 0, Suffix = " 米", Callback = function(v) ESP2_Settings.MaxDistance = v end }) EspGroup:AddDivider() EspGroup:AddLabel("颜色设置(固定/动态)") EspGroup:AddDropdown("ESP2BoxColorMode", { Text = "方框颜色模式", Values = {"固定", "循环色相", "瀑布", "波浪"}, Default = "固定", Callback = function(v) ESP2_Settings.BoxColorMode = v end }) EspGroup:AddDropdown("ESP2BoxColor", { Text = "方框颜色(固定时生效)", Values = {"红色","蓝色","绿色","黄色","紫色","青色","白色","橙色"}, Default = "白色", Callback = function(v) ESP2_Settings.BoxColor = colorPresets[v] end }) EspGroup:AddDropdown("ESP2NameColorMode", { Text = "名字颜色模式", Values = {"固定", "循环色相", "瀑布", "波浪"}, Default = "固定", Callback = function(v) ESP2_Settings.NameColorMode = v end }) EspGroup:AddDropdown("ESP2NameColor", { Text = "名字颜色(固定时生效)", Values = {"红色","蓝色","绿色","黄色","紫色","青色","白色","橙色"}, Default = "白色", Callback = function(v) ESP2_Settings.NameColor = colorPresets[v] end }) EspGroup:AddDropdown("ESP2HealthColorMode", { Text = "血量颜色模式", Values = {"固定", "循环色相", "瀑布", "波浪"}, Default = "固定", Callback = function(v) ESP2_Settings.HealthBarColorMode = v end }) EspGroup:AddDropdown("ESP2HealthColor", { Text = "血量颜色(固定时生效)", Values = {"红色","蓝色","绿色","黄色","紫色","青色","白色","橙色"}, Default = "绿色", Callback = function(v) ESP2_Settings.HealthBarColor = colorPresets[v] end }) EspGroup:AddDropdown("ESP2StatusColorMode", { Text = "状态颜色模式", Values = {"固定", "循环色相", "瀑布", "波浪"}, Default = "固定", Callback = function(v) ESP2_Settings.StatusColorMode = v end }) EspGroup:AddDropdown("ESP2StatusColor", { Text = "状态颜色(固定时生效)", Values = {"红色","蓝色","绿色","黄色","紫色","青色","白色","橙色"}, Default = "黄色", Callback = function(v) ESP2_Settings.StatusColor = colorPresets[v] end }) -- Fly Tab local FlyGroup = Tabs.Fly:AddLeftGroupbox("甩飞控制", "rocket") local function RefreshFlyPlayerList() local list = {} for _, p in ipairs(Players:GetPlayers()) do if p ~= LocalPlayer then table.insert(list, p.Name) end end return list end local flyPlayerDropdown = FlyGroup:AddDropdown("FlyTargetSelect", { Text = "选择目标玩家", Values = RefreshFlyPlayerList(), Default = "", Callback = function(v) Fly_SelectedPlayer = Players:FindFirstChild(v) end }) FlyGroup:AddButton("刷新玩家列表", function() local newList = RefreshFlyPlayerList() flyPlayerDropdown:SetValues(newList) if #newList > 0 then flyPlayerDropdown:SetValue(newList[1]) end end) FlyGroup:AddButton("甩飞一次", function() if not Fly_SelectedPlayer then Library:Notify("请先选择目标", 2); return end if not IsPlayerAlive(Fly_SelectedPlayer) then Library:Notify("目标已死亡或不在游戏中", 2); return end ThrowPlayer(Fly_SelectedPlayer) Library:Notify("已甩飞 " .. Fly_SelectedPlayer.Name, 1.5) end) FlyGroup:AddSlider("FlyFlungDuration", { Text = "甩飞持续时间 (秒)", Default = 2, Min = 1, Max = 5, Rounding = 1, Suffix = "s", Callback = function(v) Fly_FlungDuration = v end }) FlyGroup:AddButton("传送甩飞", function() TeleportFlung() end) FlyGroup:AddToggle("FlyLoopToggle", { Text = "循环甩飞", Default = false, Callback = function(v) if v then if not Fly_SelectedPlayer then Library:Notify("请先选择目标", 2); return end StartLoopFlung() else StopLoopFlung() end end }) FlyGroup:AddSlider("FlyLoopAmplitude", { Text = "甩飞力度倍数", Default = 1, Min = 1, Max = 10, Rounding = 1, Suffix = "x", Callback = function(v) Fly_LoopAmplitude = v end }) FlyGroup:AddToggle("FlyDeathCheck", { Text = "检测目标死亡(循环中自动停止)", Default = false, Callback = function(v) Fly_DeathCheck = v end }) FlyGroup:AddToggle("FlyAntiFlyToggle", { Text = "防甩飞(免疫被甩飞)", Default = false, Callback = function(v) Fly_AntiFlyEnabled = v end }) FlyGroup:AddDivider() FlyGroup:AddLabel("外部飞行脚本") FlyGroup:AddButton("加载外部飞行", function() local success, err = pcall(function() loadstring(game:HttpGet("https://pastebin.com/raw/UVAj0uWu"))() end) if not success then Library:Notify("飞行脚本加载失败: " .. tostring(err), 3) else Library:Notify("外部飞行已加载", 2) end end) -- ========================================== -- NEW: World Tab -- ========================================== local WorldGroup = Tabs.World:AddLeftGroupbox("全局设置", "globe") -- FPS Slider WorldGroup:AddSlider("FPSLimit", { Text = "FPS 限制 (1~10000)", Default = 300, Min = 1, Max = 10000, Rounding = 0, Suffix = " FPS", Callback = function(v) pcall(function() setfpscap(v) -- Works in most executors end) end }) WorldGroup:AddDivider() WorldGroup:AddLabel("自杀圆形按钮") -- Show suicide button toggle WorldGroup:AddToggle("ShowSuicideButtonToggle", { Text = "显示自杀按钮", Default = true, Callback = function(v) ShowSuicideButton = v updateSuicideButtonAppearance() end }) -- Suicide button size slider WorldGroup:AddSlider("CircleSuicideSize", { Text = "自杀按钮大小", Default = 60, Min = 40, Max = 100, Rounding = 0, Suffix = " px", Callback = function(v) CircleSuicideSize = v updateSuicideButtonAppearance() end }) -- Also add a conventional button for suicide (optional) WorldGroup:AddButton("立即自杀", function() doSuicide() end) -- ========================================== -- UI Settings Tab (unchanged) -- ========================================== local MenuGroup = Tabs["UI Settings"]:AddLeftGroupbox("菜单", "wrench") MenuGroup:AddToggle("KeybindMenuOpen", { Default = false, Text = "打开快捷键菜单", Callback = function(v) Library.KeybindFrame.Visible = v end }) MenuGroup:AddToggle("ShowCustomCursor", { Text = "自定义光标", Default = true, Callback = function(v) Library.ShowCustomCursor = v end }) MenuGroup:AddDropdown("NotificationSide", { Values = {"左侧","右侧"}, Default = "右侧", Callback = function(v) Library:SetNotifySide(v) end }) MenuGroup:AddDropdown("DPIDropdown", { Values = {"50%","75%","100%","125%","150%","175%","200%"}, Default = "100%", Callback = function(v) v = v:gsub("%%","") Library:SetDPIScale(tonumber(v)) end }) MenuGroup:AddDivider() MenuGroup:AddLabel("菜单快捷键"):AddKeyPicker("MenuKeybind", { Default = "RightShift", NoUI = false, Text = "菜单开关" }) MenuGroup:AddButton("卸载", function() Library:Unload() end) Library.ToggleKeybind = Options.MenuKeybind --// Theme and Save ThemeManager:SetLibrary(Library) SaveManager:SetLibrary(Library) SaveManager:IgnoreThemeSettings() SaveManager:SetIgnoreIndexes({"MenuKeybind"}) ThemeManager:SetFolder("ProjectVitruvius") SaveManager:SetFolder("ProjectVitruvius") SaveManager:SetSubFolder("Config") SaveManager:BuildConfigSection(Tabs["UI Settings"]) ThemeManager:ApplyToTab(Tabs["UI Settings"]) SaveManager:LoadAutoloadConfig() --// Unload Library:OnUnload(function() mainHeartbeatConnection:Disconnect() SetESP2Enabled(false) if killBtnGui then killBtnGui:Destroy() end if teleBtnGui then teleBtnGui:Destroy() end if suicideBtnGui then suicideBtnGui:Destroy() end -- NEW if Fly_LoopTask then coroutine.close(Fly_LoopTask) end print("[Project Vitruvius v3.5] Unloaded") end)