local base = 'https://raw.githubusercontent.com/17kShotsss/UI-LIBRARY/main/' local Library = loadstring(game:HttpGet(base .. 'Library.lua'))() local ThemeManager = loadstring(game:HttpGet(base .. 'addons/ThemeManager.lua'))() local SaveManager = loadstring(game:HttpGet(base .. 'addons/SaveManager.lua'))() local Players = game:GetService("Players") local RunService = game:GetService("RunService") local Debris = game:GetService("Debris") local UserInputService = game:GetService("UserInputService") local LocalPlayer = Players.LocalPlayer local Camera = workspace.CurrentCamera local NetworkClient = game:GetService("NetworkClient") -- for SetOutgoingKBPSLimit local RunService = game:GetService("RunService") -------------------------------------------------- -- WINDOW -------------------------------------------------- local Window = Library:CreateWindow({ Title = 'THE TOWER', Center = true, AutoShow = true, }) local Tabs = { Runner = Window:AddTab('RUNNER'), Sniper = Window:AddTab('SNIPER'), Visuals = Window:AddTab('VISUALS'), Misc = Window:AddTab('MISC'), ['UI Settings'] = Window:AddTab('UI Settings'), } local RunnerTab = Tabs.Runner -------------------------------------------------- -- RUNNER TAB – FIXED NIL REFRESH CRASHES -------------------------------------------------- local RunnerTab = Tabs.Runner -- ── Flares ──────────────────────────────────────── local flareSection = RunnerTab:AddLeftGroupbox("Flares") local flareOptions, flareParts = {}, {} local selectedFlare, flareHighlight, flareDropdown = nil, nil, nil local function scanFlares() flareOptions = {} flareParts = {} for _, obj in pairs(workspace:GetDescendants()) do if obj:IsA("BasePart") and obj.Name == "Flare" then table.insert(flareOptions, obj:GetFullName()) table.insert(flareParts, obj) end end if #flareOptions == 0 then flareOptions = {"No flares found"} end end local function refreshFlareList() if not flareDropdown then return end pcall(function() flareDropdown:Refresh(flareOptions, true) end) end scanFlares() flareDropdown = flareSection:AddDropdown("FlareList", { Values = flareOptions, Default = 1, Multi = false, Text = "Flare List" }):OnChanged(function(choice) selectedFlare = nil if flareHighlight then flareHighlight:Destroy() flareHighlight = nil end if choice == "No flares found" then return end for i, path in ipairs(flareOptions) do if path == choice then selectedFlare = flareParts[i] if selectedFlare and selectedFlare.Parent then flareHighlight = Instance.new("Highlight") flareHighlight.Parent = selectedFlare flareHighlight.FillColor = Color3.fromRGB(0,255,0) flareHighlight.OutlineColor = Color3.fromRGB(255,255,255) flareHighlight.FillTransparency = 0.4 end break end end end) flareSection:AddButton("TP TO FLARE", function() if LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") and selectedFlare then LocalPlayer.Character.HumanoidRootPart.CFrame = selectedFlare.CFrame + Vector3.new(0,5,0) end end) flareSection:AddButton("RESCAN FLARES", function() scanFlares() refreshFlareList() end) task.delay(0.5, refreshFlareList) -- safe first refresh -- ── Teleports ────────────────────────────────────── local runnerSection = RunnerTab:AddRightGroupbox("Teleports") local function createTeleport(title, targetNames, innerTarget, color) local options, parts = {}, {} local selected, highlight, dropdown = nil, nil, nil local function scanTargets() options = {} parts = {} for _, obj in pairs(workspace:GetDescendants()) do for _, name in ipairs(targetNames) do if obj:IsA("Model") and obj.Name == name then table.insert(options, obj:GetFullName()) table.insert(parts, obj) end end end if #options == 0 then options = {"None found"} end end local function refreshList() if not dropdown then return end pcall(function() dropdown:Refresh(options, true) end) end scanTargets() dropdown = runnerSection:AddDropdown(title.."List", { Values = options, Default = 1, Multi = false, Text = title.." List" }):OnChanged(function(choice) selected = nil if highlight then highlight:Destroy() highlight = nil end if choice == "None found" then return end for i, path in ipairs(options) do if path == choice then selected = parts[i] if selected and selected.Parent then highlight = Instance.new("Highlight") highlight.Parent = selected highlight.FillColor = color highlight.OutlineColor = Color3.fromRGB(255,255,255) highlight.FillTransparency = 0.5 highlight.OutlineTransparency = 0 end break end end end) runnerSection:AddButton("TP TO "..title, function() if not LocalPlayer.Character or not LocalPlayer.Character:FindFirstChild("HumanoidRootPart") or not selected then return end local hrp = LocalPlayer.Character.HumanoidRootPart if innerTarget then local inner = selected:FindFirstChild(innerTarget, true) if inner and inner:IsA("BasePart") then hrp.CFrame = inner.CFrame + Vector3.new(0,5,0) return end end local cf = selected:GetBoundingBox() hrp.CFrame = cf + Vector3.new(0,5,0) end) runnerSection:AddButton("RESCAN "..title, function() scanTargets() refreshList() end) -- Auto rescan task.spawn(function() while true do task.wait(10) scanTargets() refreshList() end end) -- Safe initial refresh task.delay(0.5, refreshList) end -- Create all teleports createTeleport("Keys", {"SafeKey", "KeyUnlockable"}, "Plane_Plane", Color3.fromRGB(0,180,255)) createTeleport("Safes", {"SafeUnlockable"}, "Cube", Color3.fromRGB(255,100,100)) createTeleport("Advanced Safes", {"AdvancedSafeUnlockable"}, "Door", Color3.fromRGB(255,50,200)) createTeleport("Advanced Safe Key", {"AdvancedSafeKey"}, "Plane", Color3.fromRGB(200,100,255)) createTeleport("AirdropKey", {"AirdropKey"}, "Plane.001_Plane.001", Color3.fromRGB(0,255,255)) createTeleport("Airdrop", {"AirdropUnlockable"}, nil, Color3.fromRGB(255,215,0)) createTeleport("Parachute", {"Parachute"}, "Plane", Color3.fromRGB(255,215,0)) -- All AchievementSpawners inside workspace.Game (any part/model inside it) local function createAllAchievementSpawnersTP() local options, parts = {}, {} local selected, highlight, dropdown = nil, nil, nil local function scan() options = {} parts = {} local gameFolder = workspace:FindFirstChild("Game") if not gameFolder then options = {"None found"} return end for _, obj in ipairs(gameFolder:GetDescendants()) do if obj.Name == "AchievementSpawner" then -- Clean name: Spawners.AchievementSpawner or AchievementSpawner local shortName = obj:GetFullName():gsub("workspace%.Game%.", "") if shortName == "" then shortName = "AchievementSpawner (root)" end -- Optional: show if it has children (the "shit inside") local childCount = #obj:GetChildren() if childCount > 0 then shortName = shortName .. " (" .. childCount .. " items inside)" end table.insert(options, shortName) table.insert(parts, obj) end end if #options == 0 then options = {"None found"} end end local function refresh() if dropdown then pcall(function() dropdown:Refresh(options, true) end) end end scan() dropdown = runnerSection:AddDropdown("AllAchievementSpawners", { Values = options, Default = 1, Multi = false, Text = "AchievementSpawners List" }):OnChanged(function(choice) selected = nil if highlight then highlight:Destroy() highlight = nil end if choice:find("not found") then return end for i, name in ipairs(options) do if name == choice then selected = parts[i] if selected and selected.Parent then highlight = Instance.new("Highlight") highlight.Parent = selected highlight.FillColor = Color3.fromRGB(255, 215, 0) -- gold highlight.OutlineColor = Color3.fromRGB(255, 255, 255) highlight.FillTransparency = 0.4 highlight.OutlineTransparency = 0 end break end end end) runnerSection:AddButton("TP TO ACHIEVEMEBTSPAWNER", function() if not LocalPlayer.Character or not LocalPlayer.Character:FindFirstChild("HumanoidRootPart") or not selected then Library:Notify("Select an AchievementSpawner first", 3) return end local hrp = LocalPlayer.Character.HumanoidRootPart local targetCFrame if selected:IsA("BasePart") then targetCFrame = selected.CFrame elseif selected:IsA("Model") then targetCFrame = selected:GetPivot() else -- Fallback for folders/scripts/values local primary = selected:FindFirstChildWhichIsA("BasePart", true) targetCFrame = primary and primary.CFrame or CFrame.new(0, 100, 0) end hrp.CFrame = targetCFrame + Vector3.new(0, 5, 0) Library:Notify("Teleported to " .. choice, 3) end) runnerSection:AddButton("Rescan AchievementSpawners", function() scan() refresh() end) -- Auto rescan every 8 seconds task.spawn(function() while true do task.wait(8) scan() refresh() end end) -- Initial refresh task.delay(0.5, refresh) end -- Call it once createAllAchievementSpawnersTP() -------------------------------------------------- -- VISUALS TAB -------------------------------------------------- local VisualsTab = Tabs.Visuals -- ── HEALTH CHAMS (from your older script, adapted) ─────────────────────────────── local HealthChamsBox = VisualsTab:AddRightGroupbox("Health Chams") local HealthChamsEnabled = false local HealthChamsCache = {} -- part → highlight local function ApplyHealthChams() if not HealthChamsEnabled then return end for _, plr in ipairs(Players:GetPlayers()) do if plr == LocalPlayer or not plr.Character then continue end local char = plr.Character local hum = char:FindFirstChildWhichIsA("Humanoid") if not hum or hum.Health <= 0 then continue end local healthPct = math.clamp(hum.Health / hum.MaxHealth, 0, 1) local fillColor if healthPct >= 0.8 then fillColor = Color3.fromRGB(0, 255, 0) -- green elseif healthPct >= 0.4 then fillColor = Color3.fromRGB(255, 255, 0) -- yellow else fillColor = Color3.fromRGB(255, 0, 0) -- red end for _, part in ipairs(char:GetChildren()) do if not part:IsA("BasePart") then continue end local hl = HealthChamsCache[part] if not hl or not hl.Parent then hl = Instance.new("Highlight") hl.Parent = part hl.OutlineTransparency = 0 hl.OutlineColor = Color3.fromRGB(220, 220, 255) hl.FillTransparency = 0.45 hl.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop HealthChamsCache[part] = hl end hl.FillColor = fillColor end end end local function ClearHealthChams() for _, hl in pairs(HealthChamsCache) do if hl then hl:Destroy() end end table.clear(HealthChamsCache) end HealthChamsBox:AddToggle("HealthChams", {Text = "Health Chams"}):OnChanged(function(Value) HealthChamsEnabled = Value if Value then ApplyHealthChams() else ClearHealthChams() end end) -- Update loop (only when enabled) RunService.Heartbeat:Connect(function() if HealthChamsEnabled then ApplyHealthChams() end end) -- Clean up when players/characters leave Players.PlayerRemoving:Connect(function(plr) for part, hl in pairs(HealthChamsCache) do if part.Parent and part.Parent.Parent == plr.Character then if hl then hl:Destroy() end HealthChamsCache[part] = nil end end end) -- ── MINE ESP ───────────────────────────────────── local MineESPBox = VisualsTab:AddLeftGroupbox("Mine ESP") local MineESP_Enabled = false local MineHighlights = {} local MinesFolder = workspace:WaitForChild("Game", 10) and workspace.Game:WaitForChild("Landmines", 5) and workspace.Game.Landmines:WaitForChild("Mines", 5) local function CreateMineESP(mine) if not mine or not mine.Parent then return end local part = mine:IsA("BasePart") and mine or mine:FindFirstChildWhichIsA("BasePart") if not part then return end -- Highlight local hl = Instance.new("Highlight") hl.Name = "MineESP" hl.Adornee = mine hl.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop hl.FillColor = Color3.fromRGB(255, 140, 0) -- strong orange hl.FillTransparency = 0.35 hl.OutlineColor = Color3.fromRGB(255, 220, 80) -- bright yellow edge hl.OutlineTransparency = 0 hl.Parent = part MineHighlights[mine] = hl -- Name tag local bb = Instance.new("BillboardGui") bb.Name = "MineTag" bb.Adornee = part bb.Size = UDim2.new(0, 80, 0, 24) bb.StudsOffset = Vector3.new(0, 2.8, 0) bb.AlwaysOnTop = true bb.Parent = part local label = Instance.new("TextLabel") label.Size = UDim2.new(1,0,1,0) label.BackgroundTransparency = 1 label.Text = "MINE" label.TextColor3 = Color3.fromRGB(255, 60, 60) label.TextStrokeTransparency = 0.3 label.TextStrokeColor3 = Color3.new(0,0,0) label.Font = Enum.Font.SourceSansBold label.TextSize = 15 label.Parent = bb end local function UpdateMineESP() if not MineESP_Enabled then for _, hl in pairs(MineHighlights) do if hl then hl:Destroy() end end table.clear(MineHighlights) return end if not MinesFolder then return end for _, mine in ipairs(MinesFolder:GetChildren()) do if not MineHighlights[mine] then task.spawn(CreateMineESP, mine) end end end MineESPBox:AddToggle("MineESP", {Text = "Mine ESP"}):OnChanged(function(v) MineESP_Enabled = v if v then UpdateMineESP() else for _, hl in pairs(MineHighlights) do if hl then hl:Destroy() end end table.clear(MineHighlights) end end) -- Auto-update when new mines spawn / old ones removed if MinesFolder then MinesFolder.ChildAdded:Connect(function(child) task.wait(0.15) if MineESP_Enabled then CreateMineESP(child) end end) MinesFolder.ChildRemoved:Connect(function(child) if MineHighlights[child] then MineHighlights[child]:Destroy() MineHighlights[child] = nil end end) end -- Initial scan task.spawn(function() task.wait(1.5) if MineESP_Enabled then UpdateMineESP() end end) local BulletESPBox = VisualsTab:AddLeftGroupbox("Bullet ESP") local BulletTracerEnabled = false local BulletESP_Enabled = false local ShowTrailDots = false local BulletHighlights = {} local BulletOriginalSize = {} local TracerDotSize = 0.3 local TracerLifeTime = 2 local BulletScale = 3 BulletESPBox:AddToggle("BulletESP", { Text = "Bullet ESP (Highlight)" }):OnChanged(function(v) BulletESP_Enabled = v end) local BulletESPBox = VisualsTab:AddLeftGroupbox("Bullet Trail ESP") local BulletTrailEnabled = false local TrailDotSize = 0.9 local TrailSpacing = 0.1 local TrailLifeTime = 1.2 BulletESPBox:AddToggle("BulletTrail", { Text = "Bullet Trail" }):OnChanged(function(v) BulletTrailEnabled = v end) local function createTrailDot(pos) local dot = Instance.new("Part") dot.Size = Vector3.new(TrailDotSize, TrailDotSize, TrailDotSize) dot.Shape = Enum.PartType.Ball dot.Material = Enum.Material.Neon dot.Color = Color3.new(1, 1, 1) dot.Transparency = 0.15 dot.Anchored = true dot.CanCollide = false dot.CanTouch = false dot.CanQuery = false dot.CFrame = CFrame.new(pos) dot.Parent = workspace task.spawn(function() local t = 0 while t < TrailLifeTime do t += task.wait() dot.Transparency = 0.15 + (t / TrailLifeTime) * 0.85 end dot:Destroy() end) end local function attachTrail(bullet) if not BulletTrailEnabled then return end if not bullet:IsA("BasePart") then return end local lastPos = bullet.Position local distAcc = 0 local conn conn = RunService.Heartbeat:Connect(function() if not bullet or not bullet.Parent then conn:Disconnect() return end local delta = bullet.Position - lastPos distAcc += delta.Magnitude if distAcc >= TrailSpacing then createTrailDot(bullet.Position) distAcc = 0 end lastPos = bullet.Position end) end workspace.ChildAdded:Connect(function(child) if child.Name == "Bullet" and child:IsA("BasePart") then task.wait(0.01) attachTrail(child) end end) for _, obj in ipairs(workspace:GetChildren()) do if obj.Name == "Bullet" and obj:IsA("BasePart") then attachTrail(obj) end end -------------------------------------------------- -- SNIPER TAB -------------------------------------------------- -------------------------------------------------- local SniperTab = Tabs.Sniper -------------------------------------------------- -- MISC TAB -------------------------------------------------- local MiscTab = Tabs.Misc -- ===== PLAYER TELEPORT (USERNAME | HP) ===== local PlayerTPBox = MiscTab:AddLeftGroupbox("Player Teleport") -- State local selectedPlayerName = nil local playerDropdown = nil -- Refresh player list local function refreshPlayerList() if not playerDropdown then return end local list = {} for _, plr in ipairs(Players:GetPlayers()) do if plr ~= LocalPlayer then local hpText = "HP ?" if plr.Character then local hum = plr.Character:FindFirstChildWhichIsA("Humanoid") if hum then hpText = "HP " .. math.floor(hum.Health) end end table.insert(list, string.format("%s | %s", plr.Name, hpText)) end end table.sort(list) if #list == 0 then list = { "No other players" } end pcall(function() playerDropdown:Refresh(list, true) end) end -- Dropdown playerDropdown = PlayerTPBox:AddDropdown("SelectPlayer", { Values = { "Loading..." }, Default = 1, Multi = false, Text = "Select Player" }):OnChanged(function(Value) local selectedText -- Linoria-style dropdown returns a table if typeof(Value) == "table" then for k in pairs(Value) do selectedText = k break end else selectedText = Value end if not selectedText or selectedText == "Loading..." or selectedText:match("No other players") then selectedPlayerName = nil return end -- Extract username from "Username | HP 25" selectedPlayerName = selectedText:match("^(.-)%s|") end) -- Teleport button PlayerTPBox:AddButton("Teleport To Player", function() if not selectedPlayerName then Library:Notify("Select a player first", 3) return end local targetPlr = Players:FindFirstChild(selectedPlayerName) if not targetPlr or not targetPlr.Character then Library:Notify("Player not available", 3) refreshPlayerList() return end local targetChar = targetPlr.Character local targetPart = targetChar:FindFirstChild("HumanoidRootPart") or targetChar:FindFirstChild("Head") or targetChar:FindFirstChildWhichIsA("BasePart") if not targetPart then Library:Notify("No teleport target", 3) return end local myChar = LocalPlayer.Character if not myChar then return end local myRoot = myChar:FindFirstChild("HumanoidRootPart") if not myRoot then return end myRoot.CFrame = targetPart.CFrame * CFrame.new(0, 3.5, 0) Library:Notify("Teleported to " .. selectedPlayerName, 3) end) -- Auto refresh hooks Players.PlayerAdded:Connect(refreshPlayerList) Players.PlayerRemoving:Connect(refreshPlayerList) LocalPlayer.CharacterAdded:Connect(refreshPlayerList) -- Initial + periodic refresh task.delay(1, refreshPlayerList) task.spawn(function() while true do task.wait(2) refreshPlayerList() end end) -- ===== MOVEMENT: SPIN BOT & FLIGHT ===== local MiscMovementBox = MiscTab:AddRightGroupbox("Movement") local SpinEnabled, SpinSpeed = false, 180 local FlyEnabled, FlySpeed = false, 50 local FlyBV -- --- SPIN BOT --- -------------------------------------------------- -- ANTI-AIM (Yaw Desync / Fake Rotation) -------------------------------------------------- local AntiAimBox = MiscTab:AddRightGroupbox("Anti-Aim (Desync)") local AntiAimEnabled = false local AA_Settings = { YawBase = "View", -- "View", "Random", "Spin", "Targets" YawOffset = 0, -- degrees YawModifier = "None", -- "None", "Jitter", "Offset Jitter" ModifierOffset = 45, -- degrees for jitter/offset jitter SpinSpeed = 10 -- multiplier for spin mode } AntiAimBox:AddToggle("AntiAim", {Text = "Enable Anti-Aim (Yaw Desync)"}):OnChanged(function(v) AntiAimEnabled = v if not v and LocalPlayer.Character then local hum = LocalPlayer.Character:FindFirstChildOfClass("Humanoid") if hum then hum.AutoRotate = true end -- restore normal rotation end end) AntiAimBox:AddDropdown("YawBase", { Values = {"View", "Random", "Spin"}, Default = 1, Text = "Yaw Base" }):OnChanged(function(v) AA_Settings.YawBase = v end) AntiAimBox:AddSlider("YawOffset", { Text = "Yaw Offset (degrees)", Min = -180, Max = 180, Default = 0, Rounding = 0 }):OnChanged(function(v) AA_Settings.YawOffset = v end) AntiAimBox:AddDropdown("YawModifier", { Values = {"None", "Jitter", "Offset Jitter"}, Default = 1, Text = "Yaw Modifier" }):OnChanged(function(v) AA_Settings.YawModifier = v end) AntiAimBox:AddSlider("ModifierOffset", { Text = "Modifier Offset (degrees)", Min = 0, Max = 180, Default = 45, Rounding = 0 }):OnChanged(function(v) AA_Settings.ModifierOffset = v end) AntiAimBox:AddSlider("SpinSpeed", { Text = "Spin Speed (when Spin mode)", Min = 1, Max = 50, Default = 10, Rounding = 0 }):OnChanged(function(v) AA_Settings.SpinSpeed = v end) RunService.RenderStepped:Connect(function(dt) local char = LocalPlayer.Character if not char then return end local hrp = char:FindFirstChild("HumanoidRootPart") local hum = char:FindFirstChildOfClass("Humanoid") if not hrp or not hum then return end -- Your existing SpinBot if SpinEnabled then hrp.CFrame = hrp.CFrame * CFrame.Angles(0, math.rad(SpinSpeed * dt), 0) end -- Your existing Flight if FlyEnabled and FlyBV then local move = Vector3.zero if UserInputService:IsKeyDown(Enum.KeyCode.W) then move += Camera.CFrame.LookVector end if UserInputService:IsKeyDown(Enum.KeyCode.S) then move -= Camera.CFrame.LookVector end if UserInputService:IsKeyDown(Enum.KeyCode.A) then move -= Camera.CFrame.RightVector end if UserInputService:IsKeyDown(Enum.KeyCode.D) then move += Camera.CFrame.RightVector end if UserInputService:IsKeyDown(Enum.KeyCode.Space) then move += Vector3.new(0,1,0) end if UserInputService:IsKeyDown(Enum.KeyCode.LeftControl) then move -= Vector3.new(0,1,0) end FlyBV.Velocity = (move.Magnitude > 0) and move.Unit * FlySpeed or Vector3.zero end -- ── ANTI-AIM (only when enabled and character loaded) ─────────────────────────── if AntiAimEnabled then hum.AutoRotate = false -- disable normal humanoid rotation local Angle = -math.atan2(Camera.CFrame.LookVector.Z, Camera.CFrame.LookVector.X) + math.rad(-90) if AA_Settings.YawBase == "Random" then Angle = -math.atan2(Camera.CFrame.LookVector.Z, Camera.CFrame.LookVector.X) + math.rad(math.random(0, 360)) elseif AA_Settings.YawBase == "Spin" then Angle = -math.atan2(Camera.CFrame.LookVector.Z, Camera.CFrame.LookVector.X) + (tick() * AA_Settings.SpinSpeed) % 360 end local Offset = math.rad(AA_Settings.YawOffset) local Jitter = tick() % 0.2 < 0.1 -- simple ~5-10 Hz jitter toggle if Jitter then if AA_Settings.YawModifier == "Jitter" then Offset = math.rad(AA_Settings.ModifierOffset) elseif AA_Settings.YawModifier == "Offset Jitter" then Offset = Offset + math.rad(AA_Settings.ModifierOffset) end end local NewAngle = CFrame.new(hrp.Position) * CFrame.Angles(0, Angle + Offset, 0) local function ToYRotation(cf) local _, y, _ = cf:ToOrientation() return CFrame.new(cf.Position) * CFrame.Angles(0, y, 0) end -- Targets mode: look at closest player by mouse proximity -- Apply fake yaw (only Y rotation) hrp.CFrame = ToYRotation(NewAngle) else -- Restore normal behavior when disabled if hum then hum.AutoRotate = true end end end) -- --- FLIGHT --- MiscMovementBox:AddToggle("Fly", {Text = "Flight"}):OnChanged(function() FlyEnabled = Toggles.Fly.Value local char = LocalPlayer.Character if not char then return end local hrp = char:FindFirstChild("HumanoidRootPart") if FlyEnabled and hrp then FlyBV = Instance.new("BodyVelocity") FlyBV.MaxForce = Vector3.new(1e9,1e9,1e9) FlyBV.Velocity = Vector3.zero FlyBV.Parent = hrp else if FlyBV then FlyBV:Destroy() FlyBV=nil end end end) MiscMovementBox:AddSlider("FlySpeed", {Text = "Fly Speed (W/A/S/D + Space/Ctrl)", Min = 20, Max = 200, Default = 50, Rounding = 0}):OnChanged(function() FlySpeed = Options.FlySpeed.Value end) -------------------------------------------------- -- RUNTIME LOOP -------------------------------------------------- RunService.RenderStepped:Connect(function(dt) local char = LocalPlayer.Character local hrp = char and char:FindFirstChild("HumanoidRootPart") if not hrp then return end -- Spin Bot if SpinEnabled then hrp.CFrame = hrp.CFrame * CFrame.Angles(0, math.rad(SpinSpeed * dt), 0) end -- Flight if FlyEnabled and FlyBV then local move = Vector3.zero if UserInputService:IsKeyDown(Enum.KeyCode.W) then move += Camera.CFrame.LookVector end if UserInputService:IsKeyDown(Enum.KeyCode.S) then move -= Camera.CFrame.LookVector end if UserInputService:IsKeyDown(Enum.KeyCode.A) then move -= Camera.CFrame.RightVector end if UserInputService:IsKeyDown(Enum.KeyCode.D) then move += Camera.CFrame.RightVector end if UserInputService:IsKeyDown(Enum.KeyCode.Space) then move += Vector3.new(0,1,0) end if UserInputService:IsKeyDown(Enum.KeyCode.LeftControl) then move -= Vector3.new(0,1,0) end FlyBV.Velocity = (move.Magnitude > 0) and move.Unit * FlySpeed or Vector3.zero end end) -------------------------------------------------- -- UI SETTINGS TAB -------------------------------------------------- local MenuGroup = Tabs['UI Settings']:AddLeftGroupbox("Menu") MenuGroup:AddButton("Unload", function() Library:Unload() end) MenuGroup:AddLabel("Menu Key"):AddKeyPicker("MenuKey",{Default="End",NoUI=true}) Library.ToggleKeybind = Options.MenuKey ThemeManager:SetLibrary(Library) SaveManager:SetLibrary(Library) SaveManager:IgnoreThemeSettings() SaveManager:SetIgnoreIndexes({"MenuKey"}) ThemeManager:SetFolder("TheTower") SaveManager:SetFolder("TheTower/configs") SaveManager:BuildConfigSection(Tabs['UI Settings']) ThemeManager:ApplyToTab(Tabs['UI Settings']) -------------------------------------------------- -- RUNTIME LOOP -------------------------------------------------- -- Spin Bot if SpinEnabled then hrp.CFrame = hrp.CFrame * CFrame.Angles(0, math.rad(SpinSpeed * dt), 0) end -- Flight if FlyEnabled and FlyBV then local move = Vector3.zero if UserInputService:IsKeyDown(Enum.KeyCode.W) then move += Camera.CFrame.LookVector end if UserInputService:IsKeyDown(Enum.KeyCode.S) then move -= Camera.CFrame.LookVector end if UserInputService:IsKeyDown(Enum.KeyCode.A) then move -= Camera.CFrame.RightVector end if UserInputService:IsKeyDown(Enum.KeyCode.D) then move += Camera.CFrame.RightVector end if UserInputService:IsKeyDown(Enum.KeyCode.Space) then move += Vector3.new(0,1,0) end if UserInputService:IsKeyDown(Enum.KeyCode.LeftControl) then move -= Vector3.new(0,1,0) end FlyBV.Velocity = (move.Magnitude > 0) and move.Unit * FlySpeed or Vector3.zero end