-- Player Tools (LocalScript) - Clientside only -- Placera som en LocalScript i StarterPlayer > StarterPlayerScripts (eller kör via en executor) -- Sektioner i bokstavsordning: CFrame Speed, Click Teleport, ESP, Fly, Freecam, -- Head Scale, Infinite Jump, Noclip, Settings, Shiftlock, Spectate, WalkSpeed. UI:t har en -- vänstersidebar med kategorier: Movement, Visual, Players (samt en separat Settings-vy via -- kugghjulet), plus en Hub-knapp i titelraden som stänger av/blockerar allt. local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local RunService = game:GetService("RunService") local TweenService = game:GetService("TweenService") local player = Players.LocalPlayer local playerGui = player:WaitForChild("PlayerGui") local camera = workspace.CurrentCamera -- ===== Delat tillstånd (minimal mängd, bara det som korsrefereras mellan sektioner) ===== local hubEnabled = true local noclipActive = false local shiftlockActive = false local walkSpeed = 16 local accentColor = Color3.fromRGB(0, 170, 255) local freecamHintLabel = nil local stopFly local stopNoclip local stopShiftlock local stopSpectate -- Färgnyanser som räknas fram från accentfärgen, så HELA UI:t kan färgas om. local function shadeFromAccent(value) local h, s = accentColor:ToHSV() return Color3.fromHSV(h, math.clamp(s * 0.45, 0, 0.55), value) end local function getPanelColor() return shadeFromAccent(0.11) end local function getSidebarColor() return shadeFromAccent(0.075) end local function getTitleColor() return shadeFromAccent(0.16) end local function getButtonColor() return shadeFromAccent(0.21) end local function getListColor() return shadeFromAccent(0.08) end -- Raycastar men hoppar över delar som inte faktiskt kolliderar (CanCollide = false), -- så vi bara stoppas av sånt du redan skulle stoppas av när du går normalt. local function raycastIgnoringNonCollide(origin, direction, filterInstances) local remainingDistance = direction.Magnitude if remainingDistance <= 0 then return nil end local dir = direction.Unit local currentOrigin = origin for _ = 1, 6 do local params = RaycastParams.new() params.FilterType = Enum.RaycastFilterType.Exclude params.FilterDescendantsInstances = filterInstances params.RespectCanCollide = true local result = workspace:Raycast(currentOrigin, dir * remainingDistance, params) if not result then return nil end if result.Instance.CanCollide then return result end local stepped = (result.Position - currentOrigin).Magnitude + 0.05 currentOrigin = currentOrigin + dir * stepped remainingDistance = remainingDistance - stepped if remainingDistance <= 0 then return nil end end return nil end -- ================= CFRAME SPEED ================= -- Rör dig genom att direkt sätta CFrame varje frame (som Fly/Noclip), istället för att -- höja WalkSpeed. Det betyder ingen inbyggd Roblox-acceleration/inbromsning - du är på -- topfart direkt och stannar tvärt när du släpper tangenterna, ingen glidning alls. local cframeSpeedActive = false local cframeSpeedButton local cframeSpeed = 50 local cframeSpeedConnection = nil local cframeSpeedPosition = nil local stopCFrameSpeed local function updateCFrameSpeed(deltaTime) local character = player.Character local humanoid = character and character:FindFirstChildOfClass("Humanoid") local humanoidRootPart = character and character:FindFirstChild("HumanoidRootPart") if not humanoid or not humanoidRootPart then return end -- Om du sitter i ett säte är HumanoidRootPart svetsad till sätet - att då tvinga -- CFrame varje frame fightar våldsamt mot den svetsen (det var det som fick dig -- att skjutas uppåt och gjorde det svårt att stänga av). Stäng av automatiskt. if humanoid.SeatPart or humanoid:GetState() == Enum.HumanoidStateType.Seated then stopCFrameSpeed() return end if not cframeSpeedPosition then cframeSpeedPosition = humanoidRootPart.Position end local camCFrame = camera.CFrame local flatLook = Vector3.new(camCFrame.LookVector.X, 0, camCFrame.LookVector.Z) local flatRight = Vector3.new(camCFrame.RightVector.X, 0, camCFrame.RightVector.Z) if flatLook.Magnitude > 0.001 then flatLook = flatLook.Unit end if flatRight.Magnitude > 0.001 then flatRight = flatRight.Unit end local moveVector = Vector3.new(0, 0, 0) if UserInputService:IsKeyDown(Enum.KeyCode.W) then moveVector = moveVector + flatLook end if UserInputService:IsKeyDown(Enum.KeyCode.S) then moveVector = moveVector - flatLook end if UserInputService:IsKeyDown(Enum.KeyCode.A) then moveVector = moveVector - flatRight end if UserInputService:IsKeyDown(Enum.KeyCode.D) then moveVector = moveVector + flatRight end -- Ingen rörelse den här framen = ingen förflyttning alls, inget momentum att fasa ut if moveVector.Magnitude == 0 then return end moveVector = moveVector.Unit * cframeSpeed local horizontalDelta = moveVector * deltaTime local distance = horizontalDelta.Magnitude if distance > 0.0001 then local direction = horizontalDelta.Unit local hit = raycastIgnoringNonCollide(cframeSpeedPosition, direction * (distance + 2), { character }) if hit then local safeDistance = math.max((hit.Position - cframeSpeedPosition).Magnitude - 2, 0) horizontalDelta = direction * math.min(safeDistance, distance) end end local newHorizontalPos = cframeSpeedPosition + horizontalDelta -- Håll dig ovanpå marken (glider över trappor/kanter) via en nedåtriktad raycast. -- Avståndet räknas ut från KARAKTÄRENS faktiska HipHeight, inte en gissad konstant -- (det var därför benen sjönk genom marken - en fast siffra passade inte alla avatarer). local groundOffset = humanoid.HipHeight + humanoidRootPart.Size.Y / 2 local groundHit = raycastIgnoringNonCollide(newHorizontalPos + Vector3.new(0, 5, 0), Vector3.new(0, -25, 0), { character }) local targetY if groundHit then targetY = groundHit.Position.Y + groundOffset else targetY = cframeSpeedPosition.Y - 40 * deltaTime end cframeSpeedPosition = Vector3.new(newHorizontalPos.X, targetY, newHorizontalPos.Z) local facing = Vector3.new(moveVector.X, 0, moveVector.Z) if facing.Magnitude < 0.001 then facing = Vector3.new(humanoidRootPart.CFrame.LookVector.X, 0, humanoidRootPart.CFrame.LookVector.Z) end humanoidRootPart.CFrame = CFrame.new(cframeSpeedPosition, cframeSpeedPosition + facing) humanoidRootPart.AssemblyLinearVelocity = Vector3.new(0, 0, 0) end function stopCFrameSpeed() if not cframeSpeedActive then return end cframeSpeedActive = false if cframeSpeedConnection then cframeSpeedConnection:Disconnect() cframeSpeedConnection = nil end cframeSpeedPosition = nil local character = player.Character local humanoid = character and character:FindFirstChildOfClass("Humanoid") if humanoid then humanoid.AutoRotate = true humanoid.WalkSpeed = walkSpeed end if cframeSpeedButton then cframeSpeedButton.Text = "CFrame Speed: OFF" cframeSpeedButton.BackgroundColor3 = getButtonColor() end end local function startCFrameSpeed() local character = player.Character local humanoid = character and character:FindFirstChildOfClass("Humanoid") if not character or not humanoid then return end if humanoid.SeatPart or humanoid:GetState() == Enum.HumanoidStateType.Seated then return end stopFly() stopShiftlock() cframeSpeedActive = true -- Ingen PlatformStand - den låter karaktären sluta hålla sin vanliga stå-pose, vilket -- fick benen att hamna fel jämfört med vad HipHeight-formeln förutsätter. WalkSpeed=0 -- räcker för att förhindra att spelets egna WASD-styrning fightar mot vår rörelse. humanoid.AutoRotate = false humanoid.WalkSpeed = 0 cframeSpeedConnection = RunService.Heartbeat:Connect(updateCFrameSpeed) if cframeSpeedButton then cframeSpeedButton.Text = "CFrame Speed: ON" cframeSpeedButton.BackgroundColor3 = accentColor end end local function toggleCFrameSpeed() if not hubEnabled then return end if cframeSpeedActive then stopCFrameSpeed() else startCFrameSpeed() end end -- ================= CLICK TELEPORT ================= local clickTeleportActive = false local clickTeleportButton local function onClickTeleportInput(input, gameProcessed) if gameProcessed then return end if not clickTeleportActive then return end if input.UserInputType ~= Enum.UserInputType.MouseButton1 then return end local character = player.Character local humanoidRootPart = character and character:FindFirstChild("HumanoidRootPart") if not humanoidRootPart then return end local mouseLocation = UserInputService:GetMouseLocation() local viewportRay = camera:ViewportPointToRay(mouseLocation.X, mouseLocation.Y) local params = RaycastParams.new() params.FilterType = Enum.RaycastFilterType.Exclude params.FilterDescendantsInstances = { character } local result = workspace:Raycast(viewportRay.Origin, viewportRay.Direction * 3000, params) if result then local currentRotation = humanoidRootPart.CFrame - humanoidRootPart.CFrame.Position humanoidRootPart.CFrame = CFrame.new(result.Position + Vector3.new(0, 3, 0)) * currentRotation humanoidRootPart.AssemblyLinearVelocity = Vector3.new(0, 0, 0) end end UserInputService.InputBegan:Connect(onClickTeleportInput) local function toggleClickTeleport() if not hubEnabled then return end clickTeleportActive = not clickTeleportActive if clickTeleportButton then clickTeleportButton.Text = clickTeleportActive and "Click Teleport: ON" or "Click Teleport: OFF" clickTeleportButton.BackgroundColor3 = clickTeleportActive and accentColor or getButtonColor() end end -- ================= ESP ================= local espActive = false local espButton local espHighlights = setmetatable({}, { __mode = "k" }) local espBillboards = setmetatable({}, { __mode = "k" }) local espConnections = setmetatable({}, { __mode = "k" }) local function getESPColor(plr) if plr and plr.Team then return plr.Team.TeamColor.Color end return Color3.fromRGB(255, 60, 60) end local function getPlayerRoleText(plr) local leaderstats = plr and plr:FindFirstChild("leaderstats") if leaderstats then local role = leaderstats:FindFirstChild("Role") if role then return tostring(role.Value) end end return nil end local function addESPHighlight(character) if character == player.Character then return end if espHighlights[character] then return end local plr = Players:GetPlayerFromCharacter(character) local color = getESPColor(plr) local highlight = Instance.new("Highlight") highlight.Name = "ESPHighlight" highlight.FillColor = color highlight.OutlineColor = color highlight.FillTransparency = 0.5 highlight.OutlineTransparency = 0 highlight.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop highlight.Parent = character espHighlights[character] = highlight local connections = {} espConnections[character] = connections local head = character:FindFirstChild("Head") if head and plr then local billboard = Instance.new("BillboardGui") billboard.Name = "ESPInfo" billboard.Size = UDim2.new(0, 170, 0, 50) billboard.StudsOffset = Vector3.new(0, 1.3, 0) billboard.AlwaysOnTop = true billboard.Parent = head espBillboards[character] = billboard local nameLabel = Instance.new("TextLabel") nameLabel.Size = UDim2.new(1, 0, 0, 18) nameLabel.BackgroundTransparency = 1 nameLabel.Font = Enum.Font.GothamBold nameLabel.TextSize = 14 nameLabel.TextColor3 = color nameLabel.TextStrokeTransparency = 0.3 nameLabel.Text = plr.Name nameLabel.Parent = billboard local roleLabel = Instance.new("TextLabel") roleLabel.Size = UDim2.new(1, 0, 0, 14) roleLabel.Position = UDim2.new(0, 0, 0, 18) roleLabel.BackgroundTransparency = 1 roleLabel.Font = Enum.Font.Gotham roleLabel.TextSize = 12 roleLabel.TextColor3 = Color3.fromRGB(220, 220, 225) roleLabel.TextStrokeTransparency = 0.3 roleLabel.Text = getPlayerRoleText(plr) or "" roleLabel.Parent = billboard local healthLabel = Instance.new("TextLabel") healthLabel.Size = UDim2.new(1, 0, 0, 14) healthLabel.Position = UDim2.new(0, 0, 0, 34) healthLabel.BackgroundTransparency = 1 healthLabel.Font = Enum.Font.Gotham healthLabel.TextSize = 12 healthLabel.TextColor3 = Color3.fromRGB(120, 255, 120) healthLabel.TextStrokeTransparency = 0.3 healthLabel.Parent = billboard local humanoid = character:FindFirstChildOfClass("Humanoid") local function updateHealth() if humanoid and humanoid.MaxHealth > 0 then local pct = math.clamp(humanoid.Health / humanoid.MaxHealth, 0, 1) healthLabel.Text = string.format("%d/%d HP", math.floor(humanoid.Health), math.floor(humanoid.MaxHealth)) healthLabel.TextColor3 = Color3.fromRGB(math.floor(255 * (1 - pct)), math.floor(255 * pct), 60) end end if humanoid then updateHealth() table.insert(connections, humanoid.HealthChanged:Connect(updateHealth)) end local function updateTeamColor() local newColor = getESPColor(plr) highlight.FillColor = newColor highlight.OutlineColor = newColor nameLabel.TextColor3 = newColor end table.insert(connections, plr:GetPropertyChangedSignal("Team"):Connect(updateTeamColor)) local leaderstats = plr:FindFirstChild("leaderstats") if leaderstats then local role = leaderstats:FindFirstChild("Role") if role then table.insert(connections, role:GetPropertyChangedSignal("Value"):Connect(function() roleLabel.Text = tostring(role.Value) end)) end end end end local function removeESPHighlight(character) local highlight = espHighlights[character] if highlight then highlight:Destroy() espHighlights[character] = nil end local billboard = espBillboards[character] if billboard then billboard:Destroy() espBillboards[character] = nil end local connections = espConnections[character] if connections then for _, conn in connections do conn:Disconnect() end espConnections[character] = nil end end local function onCharacterAddedESP(character) if espActive then addESPHighlight(character) end end local function onPlayerAddedESP(plr) plr.CharacterAdded:Connect(onCharacterAddedESP) if plr.Character and espActive then addESPHighlight(plr.Character) end end for _, plr in Players:GetPlayers() do onPlayerAddedESP(plr) end Players.PlayerAdded:Connect(onPlayerAddedESP) local function toggleESP() if not hubEnabled then return end espActive = not espActive if espActive then for _, plr in Players:GetPlayers() do if plr.Character then addESPHighlight(plr.Character) end end if espButton then espButton.Text = "ESP: ON" espButton.BackgroundColor3 = accentColor end else for character in espHighlights do removeESPHighlight(character) end if espButton then espButton.Text = "ESP: OFF" espButton.BackgroundColor3 = getButtonColor() end end end -- ================= FLY ================= local flying = false local flySpeed = 50 local flyConnection = nil local flyOriginalPhysicalProps = nil local flyPosition = nil local flyButton local function enableCameraFollow() local character = player.Character local humanoid = character and character:FindFirstChildOfClass("Humanoid") if humanoid then humanoid.AutoRotate = false end end local function disableCameraFollow() UserInputService.MouseBehavior = Enum.MouseBehavior.Default local character = player.Character local humanoid = character and character:FindFirstChildOfClass("Humanoid") if humanoid then humanoid.AutoRotate = true end end local function updateFlight(deltaTime) local character = player.Character local humanoid = character and character:FindFirstChildOfClass("Humanoid") local humanoidRootPart = character and character:FindFirstChild("HumanoidRootPart") if not humanoid or not humanoidRootPart then return end -- Samma skydd som CFrame Speed: om du sitter i ett säte är HumanoidRootPart -- svetsad till det, och att tvinga CFrame varje frame fightar våldsamt mot svetsen. if humanoid.SeatPart or humanoid:GetState() == Enum.HumanoidStateType.Seated then stopFly() return end if not flyPosition then flyPosition = humanoidRootPart.Position end local moveVector = Vector3.new(0, 0, 0) local camCFrame = camera.CFrame if UserInputService:IsKeyDown(Enum.KeyCode.W) then moveVector = moveVector + camCFrame.LookVector end if UserInputService:IsKeyDown(Enum.KeyCode.S) then moveVector = moveVector - camCFrame.LookVector end if UserInputService:IsKeyDown(Enum.KeyCode.A) then moveVector = moveVector - camCFrame.RightVector end if UserInputService:IsKeyDown(Enum.KeyCode.D) then moveVector = moveVector + camCFrame.RightVector end if UserInputService:IsKeyDown(Enum.KeyCode.Space) then moveVector = moveVector + Vector3.new(0, 1, 0) end if UserInputService:IsKeyDown(Enum.KeyCode.LeftControl) then moveVector = moveVector - Vector3.new(0, 1, 0) end if moveVector.Magnitude > 0 then moveVector = moveVector.Unit * flySpeed end local delta = moveVector * deltaTime local distance = delta.Magnitude if distance > 0.0001 then local direction = delta.Unit local hit = raycastIgnoringNonCollide(flyPosition, direction * (distance + 1.5), { character }) if hit then local safeDistance = math.max((hit.Position - flyPosition).Magnitude - 1.5, 0) delta = direction * math.min(safeDistance, distance) end end flyPosition = flyPosition + delta -- Minsta avstånd till marken, oavsett hur brant du lutar kroppen (t.ex. när du -- tittar rakt ner) - annars kunde torson doppa ner i/genom marken när man flyger -- lågt, eftersom bara rörelseriktningen kollisionskontrollerades innan, inte hur -- nära marken roten faktiskt är rakt under dig. local groundBelow = raycastIgnoringNonCollide(flyPosition, Vector3.new(0, -10, 0), { character }) if groundBelow then local minClearance = 3.5 local clearance = flyPosition.Y - groundBelow.Position.Y if clearance < minClearance then flyPosition = Vector3.new(flyPosition.X, groundBelow.Position.Y + minClearance, flyPosition.Z) end end local lookVector = camCFrame.LookVector humanoidRootPart.CFrame = CFrame.new(flyPosition, flyPosition + lookVector) humanoidRootPart.AssemblyLinearVelocity = Vector3.new(0, 0, 0) end function stopFly() flying = false flyPosition = nil if flyConnection then flyConnection:Disconnect() flyConnection = nil end local character = player.Character local humanoidRootPart = character and character:FindFirstChild("HumanoidRootPart") if humanoidRootPart and flyOriginalPhysicalProps ~= nil then humanoidRootPart.CustomPhysicalProperties = flyOriginalPhysicalProps flyOriginalPhysicalProps = nil end local humanoid = character and character:FindFirstChildOfClass("Humanoid") if humanoid then humanoid.PlatformStand = false end disableCameraFollow() if flyButton then flyButton.Text = "Fly: OFF" flyButton.BackgroundColor3 = getButtonColor() end end local function startFly() local character = player.Character local humanoid = character and character:FindFirstChildOfClass("Humanoid") local humanoidRootPart = character and character:FindFirstChild("HumanoidRootPart") if not humanoid or not humanoidRootPart then return end if humanoid.SeatPart or humanoid:GetState() == Enum.HumanoidStateType.Seated then return end if noclipActive then stopNoclip() end if shiftlockActive then stopShiftlock() end if cframeSpeedActive then stopCFrameSpeed() end flying = true flyOriginalPhysicalProps = humanoidRootPart.CustomPhysicalProperties humanoidRootPart.CustomPhysicalProperties = PhysicalProperties.new(1, 0.3, 0) humanoid.PlatformStand = true enableCameraFollow() flyConnection = RunService.RenderStepped:Connect(updateFlight) if flyButton then flyButton.Text = "Fly: ON" flyButton.BackgroundColor3 = accentColor end end local function toggleFly() if not hubEnabled then return end if flying then stopFly() else startFly() end end -- ================= FREECAM ================= local freecamActive = false local freecamConnection = nil local freecamButton local freecamYaw = 0 local freecamPitch = 0 local freecamSpeed = 60 local function updateFreecam(deltaTime) local rotation = CFrame.Angles(0, freecamYaw, 0) * CFrame.Angles(freecamPitch, 0, 0) local moveVector = Vector3.new(0, 0, 0) if UserInputService:IsKeyDown(Enum.KeyCode.W) then moveVector = moveVector + rotation.LookVector end if UserInputService:IsKeyDown(Enum.KeyCode.S) then moveVector = moveVector - rotation.LookVector end if UserInputService:IsKeyDown(Enum.KeyCode.A) then moveVector = moveVector - rotation.RightVector end if UserInputService:IsKeyDown(Enum.KeyCode.D) then moveVector = moveVector + rotation.RightVector end if UserInputService:IsKeyDown(Enum.KeyCode.Space) then moveVector = moveVector + Vector3.new(0, 1, 0) end if UserInputService:IsKeyDown(Enum.KeyCode.LeftControl) then moveVector = moveVector - Vector3.new(0, 1, 0) end if moveVector.Magnitude > 0 then moveVector = moveVector.Unit * freecamSpeed end camera.CFrame = CFrame.new(camera.CFrame.Position + moveVector * deltaTime) * rotation end UserInputService.InputChanged:Connect(function(input) if freecamActive and input.UserInputType == Enum.UserInputType.MouseMovement then freecamYaw = freecamYaw - input.Delta.X * 0.003 freecamPitch = math.clamp(freecamPitch - input.Delta.Y * 0.003, -math.rad(89), math.rad(89)) end end) local function stopFreecam() freecamActive = false if freecamConnection then freecamConnection:Disconnect() freecamConnection = nil end UserInputService.MouseBehavior = Enum.MouseBehavior.Default camera.CameraType = Enum.CameraType.Custom local character = player.Character local humanoid = character and character:FindFirstChildOfClass("Humanoid") if humanoid then camera.CameraSubject = humanoid end local humanoidRootPart = character and character:FindFirstChild("HumanoidRootPart") if humanoidRootPart then humanoidRootPart.Anchored = false end if freecamButton then freecamButton.Text = "Freecam: OFF" freecamButton.BackgroundColor3 = getButtonColor() end end local function startFreecam() stopSpectate() if shiftlockActive then stopShiftlock() end local look = camera.CFrame.LookVector freecamYaw = math.atan2(-look.X, -look.Z) freecamPitch = math.asin(math.clamp(look.Y, -1, 1)) freecamActive = true camera.CameraType = Enum.CameraType.Scriptable UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter freecamConnection = RunService.RenderStepped:Connect(updateFreecam) local character = player.Character local humanoidRootPart = character and character:FindFirstChild("HumanoidRootPart") if humanoidRootPart then humanoidRootPart.Anchored = true end if freecamButton then freecamButton.Text = "Freecam: ON" freecamButton.BackgroundColor3 = accentColor end end local function toggleFreecam() if not hubEnabled then return end if freecamActive then stopFreecam() else startFreecam() end end -- ================= HEAD SCALE ================= local MIN_SCALE = 1 local MAX_SCALE = 8 local INITIAL_SCALE = 1 local currentScale = INITIAL_SCALE local originalHeadSizes = setmetatable({}, { __mode = "k" }) local originalMeshScales = setmetatable({}, { __mode = "k" }) local originalHeadJointC1 = setmetatable({}, { __mode = "k" }) local function findHeadJoint(character, head) for _, descendant in character:GetDescendants() do if descendant:IsA("Motor6D") and descendant.Part1 == head then return descendant end end return nil end local function setHeadScale(character, scale) local head = character:FindFirstChild("Head") if not head or not head:IsA("BasePart") then return end if not originalHeadSizes[character] then originalHeadSizes[character] = head.Size end head.Size = originalHeadSizes[character] * scale local mesh = head:FindFirstChildOfClass("SpecialMesh") if mesh then if not originalMeshScales[character] then originalMeshScales[character] = mesh.Scale end local baseMeshScale = originalMeshScales[character] mesh.Scale = Vector3.new(baseMeshScale.X * scale, baseMeshScale.Y * scale, baseMeshScale.Z * scale) end local joint = findHeadJoint(character, head) if joint then if not originalHeadJointC1[character] then originalHeadJointC1[character] = joint.C1 end local baseC1 = originalHeadJointC1[character] local rotationOnly = baseC1 - baseC1.Position joint.C1 = CFrame.new(baseC1.Position * scale) * rotationOnly end end local function applyHeadScaleToAll(scale) currentScale = scale for _, plr in Players:GetPlayers() do if plr.Character then setHeadScale(plr.Character, scale) end end end local function onCharacterAddedHead(character) character:WaitForChild("Head", 5) setHeadScale(character, currentScale) end local function onPlayerAddedHead(plr) plr.CharacterAdded:Connect(onCharacterAddedHead) if plr.Character then onCharacterAddedHead(plr.Character) end end for _, plr in Players:GetPlayers() do onPlayerAddedHead(plr) end Players.PlayerAdded:Connect(onPlayerAddedHead) -- ================= INFINITE JUMP ================= local infJumpActive = false local infJumpButton local function onJumpRequest() if not infJumpActive then return end local character = player.Character local humanoid = character and character:FindFirstChildOfClass("Humanoid") if humanoid then humanoid:ChangeState(Enum.HumanoidStateType.Jumping) end end UserInputService.JumpRequest:Connect(onJumpRequest) local function toggleInfJump() if not hubEnabled then return end infJumpActive = not infJumpActive if infJumpButton then infJumpButton.Text = infJumpActive and "Infinite Jump: ON" or "Infinite Jump: OFF" infJumpButton.BackgroundColor3 = infJumpActive and accentColor or getButtonColor() end end -- ================= NOCLIP ================= -- Bara kollisionen stängs av - vanlig gång, gravitation och hopp fortsätter fungera precis -- som vanligt, du "flyger" inte, du går/faller rakt igenom saker. local noclipConnection = nil local noclipButton local noclipOriginalCanCollide = setmetatable({}, { __mode = "k" }) local function setNoclipCollisions(character, enabled) for _, part in character:GetDescendants() do if part:IsA("BasePart") then if enabled then local original = noclipOriginalCanCollide[part] if original ~= nil then part.CanCollide = original end else if noclipOriginalCanCollide[part] == nil then noclipOriginalCanCollide[part] = part.CanCollide end part.CanCollide = false end end end end local function updateNoclip() local character = player.Character if not character then return end for _, part in character:GetDescendants() do if part:IsA("BasePart") and part.CanCollide then part.CanCollide = false end end end function stopNoclip() noclipActive = false if noclipConnection then noclipConnection:Disconnect() noclipConnection = nil end local character = player.Character if character then setNoclipCollisions(character, true) end if noclipButton then noclipButton.Text = "Noclip: OFF" noclipButton.BackgroundColor3 = getButtonColor() end end local function startNoclip() local character = player.Character if not character then return end if flying then stopFly() end noclipActive = true setNoclipCollisions(character, false) noclipConnection = RunService.Heartbeat:Connect(updateNoclip) if noclipButton then noclipButton.Text = "Noclip: ON" noclipButton.BackgroundColor3 = accentColor end end local function toggleNoclip() if not hubEnabled then return end if noclipActive then stopNoclip() else startNoclip() end end -- ================= SETTINGS ================= local keybinds = { CFrameSpeed = Enum.KeyCode.R, ClickTeleport = Enum.KeyCode.T, Fly = Enum.KeyCode.F, Noclip = Enum.KeyCode.C, Freecam = Enum.KeyCode.V, Shiftlock = Enum.KeyCode.LeftShift, } local presetColors = { Color3.fromRGB(0, 170, 255), Color3.fromRGB(255, 70, 70), Color3.fromRGB(70, 220, 130), Color3.fromRGB(190, 100, 255), Color3.fromRGB(255, 170, 40), Color3.fromRGB(255, 255, 255), } local themedElements = {} -- lista av { instance = ..., role = "accent"|"panel"|"sidebar"|"title"|"button"|"list" } local rebindingAction = nil local keybindButtons = {} local function registerThemed(instance, role) table.insert(themedElements, { instance = instance, role = role }) return instance end local function applyTheme() local panelColor = getPanelColor() local sidebarColor = getSidebarColor() local titleColor = getTitleColor() local buttonColor = getButtonColor() local listColor = getListColor() for _, entry in themedElements do local inst = entry.instance if inst and inst.Parent then if entry.role == "accent" then inst.BackgroundColor3 = accentColor elseif entry.role == "panel" then inst.BackgroundColor3 = panelColor elseif entry.role == "sidebar" then inst.BackgroundColor3 = sidebarColor elseif entry.role == "title" then inst.BackgroundColor3 = titleColor elseif entry.role == "button" then inst.BackgroundColor3 = buttonColor elseif entry.role == "list" then inst.BackgroundColor3 = listColor end end end end -- Togglingsknapparna byter färg mellan AV och PÅ, så de hanteras separat från temaloopen -- ovan för att inte skriva över ett aktivt läges färg. local function refreshToggleButtonColors() local buttonColor = getButtonColor() if cframeSpeedButton then cframeSpeedButton.BackgroundColor3 = cframeSpeedActive and accentColor or buttonColor end if clickTeleportButton then clickTeleportButton.BackgroundColor3 = clickTeleportActive and accentColor or buttonColor end if espButton then espButton.BackgroundColor3 = espActive and accentColor or buttonColor end if flyButton then flyButton.BackgroundColor3 = flying and accentColor or buttonColor end if freecamButton then freecamButton.BackgroundColor3 = freecamActive and accentColor or buttonColor end if infJumpButton then infJumpButton.BackgroundColor3 = infJumpActive and accentColor or buttonColor end if noclipButton then noclipButton.BackgroundColor3 = noclipActive and accentColor or buttonColor end end local function setAccentColor(newColor) accentColor = newColor applyTheme() refreshToggleButtonColors() end local function beginRebind(action, button) rebindingAction = action button.Text = "..." end UserInputService.InputBegan:Connect(function(input) if rebindingAction and input.UserInputType == Enum.UserInputType.Keyboard then if input.KeyCode == Enum.KeyCode.Escape then -- Escape gör tangenten obunden (ingen tangent alls) istället för att binda till Escape keybinds[rebindingAction] = nil local button = keybindButtons[rebindingAction] if button then button.Text = "Unbound" end if rebindingAction == "Freecam" and freecamHintLabel then freecamHintLabel.Text = "Mouse locks in freecam - no key bound, click the button to exit" end rebindingAction = nil return end keybinds[rebindingAction] = input.KeyCode local button = keybindButtons[rebindingAction] if button then button.Text = input.KeyCode.Name end if rebindingAction == "Freecam" and freecamHintLabel then freecamHintLabel.Text = "Mouse locks in freecam - press " .. input.KeyCode.Name .. " to exit" end rebindingAction = nil end end) UserInputService.InputBegan:Connect(function(input, gameProcessed) if gameProcessed then return end if rebindingAction then return end if input.KeyCode == keybinds.CFrameSpeed then toggleCFrameSpeed() elseif input.KeyCode == keybinds.ClickTeleport then toggleClickTeleport() elseif input.KeyCode == keybinds.Fly then toggleFly() elseif input.KeyCode == keybinds.Noclip then toggleNoclip() elseif input.KeyCode == keybinds.Freecam then toggleFreecam() end end) -- ================= SHIFTLOCK ================= local shiftlockConnection = nil local shiftlockButton local function updateShiftlock() local character = player.Character local humanoidRootPart = character and character:FindFirstChild("HumanoidRootPart") if not humanoidRootPart then return end local lookVector = camera.CFrame.LookVector local flatLook = Vector3.new(lookVector.X, 0, lookVector.Z) if flatLook.Magnitude > 0.001 then flatLook = flatLook.Unit humanoidRootPart.CFrame = CFrame.new(humanoidRootPart.Position, humanoidRootPart.Position + flatLook) end end function stopShiftlock() shiftlockActive = false if shiftlockConnection then shiftlockConnection:Disconnect() shiftlockConnection = nil end UserInputService.MouseBehavior = Enum.MouseBehavior.Default local character = player.Character local humanoid = character and character:FindFirstChildOfClass("Humanoid") if humanoid then humanoid.AutoRotate = true end if shiftlockButton then shiftlockButton.Text = "Shiftlock: OFF" shiftlockButton.BackgroundColor3 = getButtonColor() end end local function startShiftlock() local character = player.Character local humanoid = character and character:FindFirstChildOfClass("Humanoid") if not humanoid then return end if flying then stopFly() end if freecamActive then stopFreecam() end if cframeSpeedActive then stopCFrameSpeed() end shiftlockActive = true humanoid.AutoRotate = false UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter shiftlockConnection = RunService.RenderStepped:Connect(updateShiftlock) if shiftlockButton then shiftlockButton.Text = "Shiftlock: ON" shiftlockButton.BackgroundColor3 = accentColor end end local function toggleShiftlock() if not hubEnabled then return end if shiftlockActive then stopShiftlock() else startShiftlock() end end -- Egen hanterare, utan gameProcessed-kollen: Shift "tas" ofta redan av spelets egna -- standardkontroller (t.ex. inbyggd shiftlock eller sprint), vilket annars hindrade vår -- knapptryckning från att någonsin nå fram. Accepterar båda Shift-tangenterna om -- standardbindningen (vänster Shift) fortfarande gäller. UserInputService.InputBegan:Connect(function(input) if rebindingAction then return end if input.KeyCode == keybinds.Shiftlock then toggleShiftlock() elseif keybinds.Shiftlock == Enum.KeyCode.LeftShift and input.KeyCode == Enum.KeyCode.RightShift then toggleShiftlock() end end) -- ================= SPECTATE ================= local spectateTarget = nil function stopSpectate() spectateTarget = nil if freecamActive then return end local character = player.Character local humanoid = character and character:FindFirstChildOfClass("Humanoid") camera.CameraSubject = humanoid camera.CameraType = Enum.CameraType.Custom end local function startSpectate(targetPlayer) if targetPlayer == player then return end local character = targetPlayer.Character local humanoid = character and character:FindFirstChildOfClass("Humanoid") if not humanoid then return end if freecamActive then stopFreecam() end spectateTarget = targetPlayer camera.CameraSubject = humanoid camera.CameraType = Enum.CameraType.Custom end -- ================= WALKSPEED ================= local function applyWalkSpeedToLocalCharacter() local character = player.Character local humanoid = character and character:FindFirstChildOfClass("Humanoid") if humanoid then humanoid.WalkSpeed = walkSpeed -- UseJumpPower=true gör att JumpPower (en fast starthastighet) styr hoppet, -- och den FAKTISKA höjden beror då på gravitationen som vanlig fysik. -- Annars räknar Roblox automatiskt om kraften så du alltid når samma höjd -- oavsett gravitation, vilket var därför gravitationsreglaget inte kändes -- av när du hoppade. humanoid.UseJumpPower = true end end local function setWalkSpeed(value) walkSpeed = value applyWalkSpeedToLocalCharacter() end applyWalkSpeedToLocalCharacter() -- Håller WalkSpeed vid det inställda värdet varje frame, ifall något annat (spelets -- egna skript, respawn-timing, m.m.) skriver över det - annars kunde det kännas som -- att reglaget bara funkade medan man höll i det. RunService.Heartbeat:Connect(function() local character = player.Character local humanoid = character and character:FindFirstChildOfClass("Humanoid") if humanoid and humanoid.WalkSpeed ~= walkSpeed and not (flying or noclipActive or cframeSpeedActive) then humanoid.WalkSpeed = walkSpeed end end) player.CharacterAdded:Connect(function(character) stopFly() stopNoclip() stopFreecam() stopShiftlock() stopCFrameSpeed() character:WaitForChild("Humanoid", 5) applyWalkSpeedToLocalCharacter() end) -- ================= HUB ENABLE / DISABLE ================= -- Stänger av allt just nu aktivt OCH blockerar alla toggle-funktioner (via hubEnabled- -- kollen i varje togglefunktion ovan) tills huben slås på igen. Inget går att aktivera -- via vare sig knappar eller snabbkommandon medan den är avstängd. local hubToggleButton local function disableHub() hubEnabled = false stopFly() stopNoclip() stopFreecam() stopShiftlock() stopCFrameSpeed() stopSpectate() if espActive then espActive = false for character in espHighlights do removeESPHighlight(character) end if espButton then espButton.Text = "ESP: OFF" espButton.BackgroundColor3 = getButtonColor() end end if infJumpActive then infJumpActive = false if infJumpButton then infJumpButton.Text = "Infinite Jump: OFF" infJumpButton.BackgroundColor3 = getButtonColor() end end if clickTeleportActive then clickTeleportActive = false if clickTeleportButton then clickTeleportButton.Text = "Click Teleport: OFF" clickTeleportButton.BackgroundColor3 = getButtonColor() end end if hubToggleButton then hubToggleButton.Text = "Hub: OFF" hubToggleButton.BackgroundColor3 = Color3.fromRGB(200, 70, 70) end end local function enableHub() hubEnabled = true if hubToggleButton then hubToggleButton.Text = "Hub: ON" hubToggleButton.BackgroundColor3 = Color3.fromRGB(80, 200, 120) end end local function toggleHub() if hubEnabled then disableHub() else enableHub() end end -- ================= UI ================= local screenGui = Instance.new("ScreenGui") screenGui.Name = "PlayerToolsUI" screenGui.ResetOnSpawn = false screenGui.Parent = playerGui local EXPANDED_HEIGHT = 540 local FRAME_WIDTH = 480 local TITLEBAR_HEIGHT = 44 local SIDEBAR_WIDTH = 132 local frame = Instance.new("Frame") frame.Size = UDim2.new(0, FRAME_WIDTH, 0, EXPANDED_HEIGHT) frame.Position = UDim2.new(0.5, -FRAME_WIDTH / 2, 0.05, 0) frame.BackgroundColor3 = getPanelColor() frame.BorderSizePixel = 0 frame.ClipsDescendants = true frame.Parent = screenGui registerThemed(frame, "panel") local uiScale = Instance.new("UIScale") uiScale.Scale = 1 uiScale.Parent = frame local frameCorner = Instance.new("UICorner") frameCorner.CornerRadius = UDim.new(0, 16) frameCorner.Parent = frame -- ===== Storleksändra genom att dra i nedre högra hörnet, som ett vanligt fönster ===== local resizeHandle = Instance.new("Frame") resizeHandle.Size = UDim2.new(0, 20, 0, 20) resizeHandle.AnchorPoint = Vector2.new(1, 1) resizeHandle.Position = UDim2.new(1, -2, 1, -2) resizeHandle.BackgroundTransparency = 1 resizeHandle.Active = true resizeHandle.ZIndex = 10 resizeHandle.Parent = frame -- Ritar ett litet diagonalt "grip"-mönster av prickar, som ett vanligt resize-handtag local resizeDotPositions = { { 14, 4 }, { 14, 9 }, { 9, 14 }, { 14, 14 }, { 4, 14 }, { 9, 9 }, } for _, dotPos in resizeDotPositions do local dot = Instance.new("Frame") dot.Size = UDim2.new(0, 3, 0, 3) dot.Position = UDim2.new(0, dotPos[1], 0, dotPos[2]) dot.BackgroundColor3 = Color3.fromRGB(190, 190, 196) dot.BackgroundTransparency = 0.2 dot.BorderSizePixel = 0 dot.Parent = resizeHandle local dotCorner = Instance.new("UICorner") dotCorner.CornerRadius = UDim.new(1, 0) dotCorner.Parent = dot end local resizing = false resizeHandle.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then resizing = true end end) UserInputService.InputChanged:Connect(function(input) if resizing and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then local topLeft = frame.AbsolutePosition local desiredWidth = input.Position.X - topLeft.X uiScale.Scale = math.clamp(desiredWidth / FRAME_WIDTH, 0.6, 1.6) end end) UserInputService.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then resizing = false end end) -- ===== Titelrad (dragbar) ===== local titleBar = Instance.new("Frame") titleBar.Active = true titleBar.Size = UDim2.new(1, 0, 0, TITLEBAR_HEIGHT) titleBar.BackgroundColor3 = getTitleColor() titleBar.BorderSizePixel = 0 titleBar.Parent = frame registerThemed(titleBar, "title") local titleBarCorner = Instance.new("UICorner") titleBarCorner.CornerRadius = UDim.new(0, 16) titleBarCorner.Parent = titleBar local titleBarMask = Instance.new("Frame") titleBarMask.Size = UDim2.new(1, 0, 0, 16) titleBarMask.Position = UDim2.new(0, 0, 1, -16) titleBarMask.BackgroundColor3 = getTitleColor() titleBarMask.BorderSizePixel = 0 titleBarMask.ZIndex = 0 titleBarMask.Parent = titleBar registerThemed(titleBarMask, "title") local title = Instance.new("TextLabel") title.Text = "Player Tools" title.Font = Enum.Font.GothamBold title.TextSize = 18 title.TextColor3 = Color3.fromRGB(255, 255, 255) title.BackgroundTransparency = 1 title.Size = UDim2.new(1, -266, 1, 0) title.Position = UDim2.new(0, 16, 0, 0) title.TextXAlignment = Enum.TextXAlignment.Left title.Parent = titleBar local function createTitleBarButton(xOffsetFromRight, text) local button = Instance.new("TextButton") button.Text = text button.Font = Enum.Font.GothamBold button.TextSize = 15 button.TextColor3 = Color3.fromRGB(255, 255, 255) button.BackgroundColor3 = getButtonColor() button.Size = UDim2.new(0, 28, 0, 28) button.Position = UDim2.new(1, xOffsetFromRight, 0.5, -14) button.Parent = titleBar local buttonCorner = Instance.new("UICorner") buttonCorner.CornerRadius = UDim.new(0, 8) buttonCorner.Parent = button registerThemed(button, "button") return button end local closeButton = createTitleBarButton(-36, "X") local minimizeButton = createTitleBarButton(-74, "-") local gearButton = createTitleBarButton(-112, "\226\154\153") hubToggleButton = Instance.new("TextButton") hubToggleButton.Text = "Hub: ON" hubToggleButton.Font = Enum.Font.GothamBold hubToggleButton.TextSize = 13 hubToggleButton.TextColor3 = Color3.fromRGB(255, 255, 255) hubToggleButton.BackgroundColor3 = Color3.fromRGB(80, 200, 120) hubToggleButton.Size = UDim2.new(0, 64, 0, 28) hubToggleButton.Position = UDim2.new(1, -186, 0.5, -14) hubToggleButton.Parent = titleBar local hubToggleCorner = Instance.new("UICorner") hubToggleCorner.CornerRadius = UDim.new(0, 8) hubToggleCorner.Parent = hubToggleButton hubToggleButton.MouseButton1Click:Connect(toggleHub) local dragging = false local dragStartMousePos = nil local dragStartFramePos = nil titleBar.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true dragStartMousePos = input.Position dragStartFramePos = frame.Position end end) UserInputService.InputChanged:Connect(function(input) if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then local delta = input.Position - dragStartMousePos frame.Position = UDim2.new( dragStartFramePos.X.Scale, dragStartFramePos.X.Offset + delta.X, dragStartFramePos.Y.Scale, dragStartFramePos.Y.Offset + delta.Y ) end end) UserInputService.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = false end end) -- ===== Sidebar + innehållsytor ===== local sidebar = Instance.new("Frame") sidebar.Size = UDim2.new(0, SIDEBAR_WIDTH, 1, -TITLEBAR_HEIGHT) sidebar.Position = UDim2.new(0, 0, 0, TITLEBAR_HEIGHT) sidebar.BackgroundColor3 = getSidebarColor() sidebar.BorderSizePixel = 0 sidebar.Parent = frame registerThemed(sidebar, "sidebar") local sidebarListLayout = Instance.new("UIListLayout") sidebarListLayout.Padding = UDim.new(0, 4) sidebarListLayout.SortOrder = Enum.SortOrder.LayoutOrder sidebarListLayout.Parent = sidebar local sidebarPadding = Instance.new("UIPadding") sidebarPadding.PaddingTop = UDim.new(0, 12) sidebarPadding.PaddingLeft = UDim.new(0, 8) sidebarPadding.PaddingRight = UDim.new(0, 8) sidebarPadding.Parent = sidebar local divider = Instance.new("Frame") divider.Size = UDim2.new(0, 1, 1, -TITLEBAR_HEIGHT) divider.Position = UDim2.new(0, SIDEBAR_WIDTH, 0, TITLEBAR_HEIGHT) divider.BackgroundColor3 = getButtonColor() divider.BorderSizePixel = 0 divider.Parent = frame registerThemed(divider, "button") local function autoSizeCanvas(scrollingFrame, listLayout) local function update() scrollingFrame.CanvasSize = UDim2.new(0, 0, 0, listLayout.AbsoluteContentSize.Y + 20) end listLayout:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(update) update() end local function createCategoryContent() local content = Instance.new("ScrollingFrame") content.Size = UDim2.new(1, -(SIDEBAR_WIDTH + 1), 1, -TITLEBAR_HEIGHT) content.Position = UDim2.new(0, SIDEBAR_WIDTH + 1, 0, TITLEBAR_HEIGHT) content.BackgroundTransparency = 1 content.BorderSizePixel = 0 content.ScrollBarThickness = 5 content.ScrollBarImageColor3 = Color3.fromRGB(90, 90, 96) content.CanvasSize = UDim2.new(0, 0, 0, 0) content.Visible = false content.Parent = frame local listLayout = Instance.new("UIListLayout") listLayout.Padding = UDim.new(0, 14) listLayout.SortOrder = Enum.SortOrder.LayoutOrder listLayout.Parent = content autoSizeCanvas(content, listLayout) local padding = Instance.new("UIPadding") padding.PaddingLeft = UDim.new(0, 18) padding.PaddingRight = UDim.new(0, 18) padding.PaddingTop = UDim.new(0, 16) padding.PaddingBottom = UDim.new(0, 16) padding.Parent = content return content end local movementContent = createCategoryContent() local visualContent = createCategoryContent() local playersContent = createCategoryContent() local settingsContent = Instance.new("ScrollingFrame") settingsContent.Size = UDim2.new(1, 0, 1, -TITLEBAR_HEIGHT) settingsContent.Position = UDim2.new(0, 0, 0, TITLEBAR_HEIGHT) settingsContent.BackgroundTransparency = 1 settingsContent.BorderSizePixel = 0 settingsContent.ScrollBarThickness = 5 settingsContent.CanvasSize = UDim2.new(0, 0, 0, 0) settingsContent.Visible = false settingsContent.Parent = frame local settingsListLayout = Instance.new("UIListLayout") settingsListLayout.Padding = UDim.new(0, 12) settingsListLayout.SortOrder = Enum.SortOrder.LayoutOrder settingsListLayout.Parent = settingsContent autoSizeCanvas(settingsContent, settingsListLayout) local settingsPadding = Instance.new("UIPadding") settingsPadding.PaddingLeft = UDim.new(0, 18) settingsPadding.PaddingRight = UDim.new(0, 18) settingsPadding.PaddingTop = UDim.new(0, 16) settingsPadding.PaddingBottom = UDim.new(0, 16) settingsPadding.Parent = settingsContent -- ===== Minimera / kategorier / inställningsvy ===== local minimized = false local showingSettings = false local currentCategory = "Movement" local categoryEntries = {} local function selectCategory(name) currentCategory = name for catName, info in categoryEntries do local isSelected = catName == name info.indicator.Visible = isSelected info.button.TextColor3 = isSelected and Color3.fromRGB(255, 255, 255) or Color3.fromRGB(175, 175, 182) if not showingSettings then info.content.Visible = isSelected end end end local function setShowingSettings(state) showingSettings = state if minimized then return end sidebar.Visible = not state divider.Visible = not state settingsContent.Visible = state for catName, info in categoryEntries do info.content.Visible = (not state) and (catName == currentCategory) end end local minimizeTween = nil local MINIMIZE_TWEEN_INFO = TweenInfo.new(0.28, Enum.EasingStyle.Quint, Enum.EasingDirection.Out) local function setMinimized(state) minimized = state if minimizeTween then minimizeTween:Cancel() minimizeTween = nil end if minimized then minimizeButton.Text = "+" resizeHandle.Visible = false minimizeTween = TweenService:Create(frame, MINIMIZE_TWEEN_INFO, { Size = UDim2.new(0, FRAME_WIDTH, 0, TITLEBAR_HEIGHT), }) minimizeTween.Completed:Connect(function() if minimized then sidebar.Visible = false divider.Visible = false settingsContent.Visible = false for _, info in categoryEntries do info.content.Visible = false end end end) minimizeTween:Play() else sidebar.Visible = not showingSettings divider.Visible = not showingSettings settingsContent.Visible = showingSettings resizeHandle.Visible = true for catName, info in categoryEntries do info.content.Visible = (not showingSettings) and (catName == currentCategory) end minimizeButton.Text = "-" minimizeTween = TweenService:Create(frame, MINIMIZE_TWEEN_INFO, { Size = UDim2.new(0, FRAME_WIDTH, 0, EXPANDED_HEIGHT), }) minimizeTween:Play() end end minimizeButton.MouseButton1Click:Connect(function() setMinimized(not minimized) end) gearButton.MouseButton1Click:Connect(function() setShowingSettings(not showingSettings) end) closeButton.MouseButton1Click:Connect(function() disableHub() screenGui:Destroy() end) -- ===== Återanvändbara byggare ===== local nextLayoutOrder = 0 local function getNextLayoutOrder() nextLayoutOrder = nextLayoutOrder + 10 return nextLayoutOrder end local function createToggleButton(parent, text, onClick) local row = Instance.new("Frame") row.Size = UDim2.new(1, 0, 0, 36) row.BackgroundTransparency = 1 row.LayoutOrder = getNextLayoutOrder() row.Parent = parent local button = Instance.new("TextButton") button.Text = text button.Font = Enum.Font.GothamBold button.TextSize = 15 button.TextColor3 = Color3.fromRGB(255, 255, 255) button.BackgroundColor3 = getButtonColor() button.Size = UDim2.new(1, 0, 1, 0) button.Parent = row local buttonCorner = Instance.new("UICorner") buttonCorner.CornerRadius = UDim.new(0, 10) buttonCorner.Parent = button button.MouseButton1Click:Connect(onClick) return button end local function createHintLabel(parent, text) local hint = Instance.new("TextLabel") hint.Font = Enum.Font.Gotham hint.TextSize = 12 hint.TextColor3 = Color3.fromRGB(150, 150, 158) hint.BackgroundTransparency = 1 hint.Size = UDim2.new(1, 0, 0, 16) hint.LayoutOrder = getNextLayoutOrder() hint.TextXAlignment = Enum.TextXAlignment.Left hint.Text = text hint.Parent = parent return hint end local function createSliderRow(parent, labelPrefix, min, max, initial, suffix, onChange) local row = Instance.new("Frame") row.Size = UDim2.new(1, 0, 0, 46) row.BackgroundTransparency = 1 row.LayoutOrder = getNextLayoutOrder() row.Parent = parent local label = Instance.new("TextLabel") label.Font = Enum.Font.Gotham label.TextSize = 14 label.TextColor3 = Color3.fromRGB(205, 205, 210) label.BackgroundTransparency = 1 label.Size = UDim2.new(1, 0, 0, 18) label.TextXAlignment = Enum.TextXAlignment.Left label.Parent = row local track = Instance.new("Frame") track.Active = true track.Size = UDim2.new(1, 0, 0, 8) track.Position = UDim2.new(0, 0, 0, 28) track.BackgroundColor3 = getButtonColor() track.BorderSizePixel = 0 track.Parent = row registerThemed(track, "button") local trackCorner = Instance.new("UICorner") trackCorner.CornerRadius = UDim.new(1, 0) trackCorner.Parent = track local fill = Instance.new("Frame") fill.BackgroundColor3 = accentColor fill.BorderSizePixel = 0 fill.Size = UDim2.new(0, 0, 1, 0) fill.Parent = track registerThemed(fill, "accent") local fillCorner = Instance.new("UICorner") fillCorner.CornerRadius = UDim.new(1, 0) fillCorner.Parent = fill local knob = Instance.new("Frame") knob.Active = true knob.Size = UDim2.new(0, 18, 0, 18) knob.AnchorPoint = Vector2.new(0.5, 0.5) knob.Position = UDim2.new(0, 0, 0.5, 0) knob.BackgroundColor3 = Color3.fromRGB(255, 255, 255) knob.BorderSizePixel = 0 knob.ZIndex = 2 knob.Parent = track local knobCorner = Instance.new("UICorner") knobCorner.CornerRadius = UDim.new(1, 0) knobCorner.Parent = knob local sliderDragging = false local function setFromAlpha(alpha) alpha = math.clamp(alpha, 0, 1) knob.Position = UDim2.new(alpha, 0, 0.5, 0) fill.Size = UDim2.new(alpha, 0, 1, 0) local value = min + (max - min) * alpha label.Text = string.format("%s: %.1f%s", labelPrefix, value, suffix) onChange(value) end local function alphaFromInput(input) local trackPos = track.AbsolutePosition.X local trackSize = track.AbsoluteSize.X if trackSize <= 0 then return 0 end return (input.Position.X - trackPos) / trackSize end knob.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then sliderDragging = true end end) track.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then sliderDragging = true setFromAlpha(alphaFromInput(input)) end end) UserInputService.InputChanged:Connect(function(input) if sliderDragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then setFromAlpha(alphaFromInput(input)) end end) UserInputService.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then sliderDragging = false end end) local initialAlpha = (initial - min) / (max - min) setFromAlpha(initialAlpha) return row end local function createCategoryButton(name, content, layoutOrder) local button = Instance.new("TextButton") button.Text = name button.Font = Enum.Font.GothamBold button.TextSize = 14 button.TextColor3 = Color3.fromRGB(175, 175, 182) button.BackgroundTransparency = 1 button.Size = UDim2.new(1, 0, 0, 38) button.TextXAlignment = Enum.TextXAlignment.Left button.LayoutOrder = layoutOrder button.Parent = sidebar local buttonPadding = Instance.new("UIPadding") buttonPadding.PaddingLeft = UDim.new(0, 14) buttonPadding.Parent = button local indicator = Instance.new("Frame") indicator.Size = UDim2.new(0, 3, 0, 20) indicator.AnchorPoint = Vector2.new(0, 0.5) indicator.Position = UDim2.new(0, -8, 0.5, 0) indicator.BackgroundColor3 = accentColor indicator.BorderSizePixel = 0 indicator.Visible = false indicator.Parent = button registerThemed(indicator, "accent") local indicatorCorner = Instance.new("UICorner") indicatorCorner.CornerRadius = UDim.new(1, 0) indicatorCorner.Parent = indicator categoryEntries[name] = { button = button, indicator = indicator, content = content } button.MouseButton1Click:Connect(function() selectCategory(name) end) return button end createCategoryButton("Movement", movementContent, 1) createCategoryButton("Visual", visualContent, 2) createCategoryButton("Players", playersContent, 3) -- ===== Movement-kategorin, i bokstavsordning ===== createSliderRow(movementContent, "CFrame Speed", 10, 200, cframeSpeed, "", function(value) cframeSpeed = value end) cframeSpeedButton = createToggleButton(movementContent, "CFrame Speed: OFF", toggleCFrameSpeed) clickTeleportButton = createToggleButton(movementContent, "Click Teleport: OFF", toggleClickTeleport) createSliderRow(movementContent, "Fly Speed", 10, 200, flySpeed, "", function(value) flySpeed = value end) flyButton = createToggleButton(movementContent, "Fly: OFF", toggleFly) freecamHintLabel = createHintLabel(movementContent, "Mouse locks in freecam - press " .. keybinds.Freecam.Name .. " to exit") createSliderRow(movementContent, "Freecam Speed", 10, 200, freecamSpeed, "", function(value) freecamSpeed = value end) freecamButton = createToggleButton(movementContent, "Freecam: OFF", toggleFreecam) createSliderRow(movementContent, "Gravity", 10, 300, workspace.Gravity, "", function(value) workspace.Gravity = value end) infJumpButton = createToggleButton(movementContent, "Infinite Jump: OFF", toggleInfJump) noclipButton = createToggleButton(movementContent, "Noclip: OFF", toggleNoclip) shiftlockButton = createToggleButton(movementContent, "Shiftlock: OFF", toggleShiftlock) createSliderRow(movementContent, "WalkSpeed", 16, 200, walkSpeed, "", function(value) setWalkSpeed(value) end) -- ===== Visual-kategorin, i bokstavsordning ===== espButton = createToggleButton(visualContent, "ESP: OFF", toggleESP) createSliderRow(visualContent, "Head Scale", MIN_SCALE, MAX_SCALE, INITIAL_SCALE, "x", function(value) applyHeadScaleToAll(value) end) -- ===== Players-kategorin ===== do local label = Instance.new("TextLabel") label.Text = "Spectate" label.Font = Enum.Font.Gotham label.TextSize = 14 label.TextColor3 = Color3.fromRGB(205, 205, 210) label.BackgroundTransparency = 1 label.Size = UDim2.new(1, -60, 0, 18) label.LayoutOrder = getNextLayoutOrder() label.TextXAlignment = Enum.TextXAlignment.Left label.Parent = playersContent local stopButton = Instance.new("TextButton") stopButton.Text = "Stop" stopButton.Font = Enum.Font.GothamBold stopButton.TextSize = 12 stopButton.TextColor3 = Color3.fromRGB(255, 255, 255) stopButton.BackgroundColor3 = getButtonColor() stopButton.Size = UDim2.new(0, 56, 0, 20) stopButton.LayoutOrder = label.LayoutOrder stopButton.AnchorPoint = Vector2.new(1, 0) stopButton.Position = UDim2.new(1, 0, 0, 0) stopButton.Parent = playersContent local stopCorner = Instance.new("UICorner") stopCorner.CornerRadius = UDim.new(0, 6) stopCorner.Parent = stopButton registerThemed(stopButton, "button") stopButton.MouseButton1Click:Connect(function() stopSpectate() end) local listRow = Instance.new("Frame") listRow.Size = UDim2.new(1, 0, 0, 220) listRow.BackgroundTransparency = 1 listRow.LayoutOrder = getNextLayoutOrder() listRow.Parent = playersContent local listFrame = Instance.new("ScrollingFrame") listFrame.Size = UDim2.new(1, 0, 1, 0) listFrame.BackgroundColor3 = getListColor() listFrame.BorderSizePixel = 0 listFrame.ScrollBarThickness = 4 listFrame.CanvasSize = UDim2.new(0, 0, 0, 0) listFrame.Parent = listRow registerThemed(listFrame, "list") local listCorner = Instance.new("UICorner") listCorner.CornerRadius = UDim.new(0, 8) listCorner.Parent = listFrame local listLayout = Instance.new("UIListLayout") listLayout.Padding = UDim.new(0, 4) listLayout.SortOrder = Enum.SortOrder.LayoutOrder listLayout.Parent = listFrame autoSizeCanvas(listFrame, listLayout) local listPadding = Instance.new("UIPadding") listPadding.PaddingLeft = UDim.new(0, 6) listPadding.PaddingRight = UDim.new(0, 6) listPadding.PaddingTop = UDim.new(0, 6) listPadding.PaddingBottom = UDim.new(0, 6) listPadding.Parent = listFrame local playerButtons = {} local function addPlayerButton(plr) if plr == player then return end if playerButtons[plr] then return end local btn = Instance.new("TextButton") btn.Text = plr.Name btn.Font = Enum.Font.Gotham btn.TextSize = 14 btn.TextColor3 = Color3.fromRGB(220, 220, 225) btn.BackgroundColor3 = getButtonColor() btn.Size = UDim2.new(1, 0, 0, 26) btn.Parent = listFrame registerThemed(btn, "button") local btnCorner = Instance.new("UICorner") btnCorner.CornerRadius = UDim.new(0, 6) btnCorner.Parent = btn btn.MouseButton1Click:Connect(function() startSpectate(plr) end) playerButtons[plr] = btn end local function removePlayerButton(plr) local btn = playerButtons[plr] if btn then btn:Destroy() playerButtons[plr] = nil end end for _, plr in Players:GetPlayers() do addPlayerButton(plr) end Players.PlayerAdded:Connect(addPlayerButton) Players.PlayerRemoving:Connect(removePlayerButton) end -- ===== Settings-vyn ===== do local backRow = Instance.new("Frame") backRow.Size = UDim2.new(1, 0, 0, 32) backRow.BackgroundTransparency = 1 backRow.LayoutOrder = 1 backRow.Parent = settingsContent local backButton = Instance.new("TextButton") backButton.Text = "< Back" backButton.Font = Enum.Font.GothamBold backButton.TextSize = 14 backButton.TextColor3 = Color3.fromRGB(255, 255, 255) backButton.BackgroundColor3 = getButtonColor() backButton.Size = UDim2.new(0, 100, 1, 0) backButton.Parent = backRow registerThemed(backButton, "button") local backCorner = Instance.new("UICorner") backCorner.CornerRadius = UDim.new(0, 8) backCorner.Parent = backButton backButton.MouseButton1Click:Connect(function() setShowingSettings(false) end) local keybindsHeader = Instance.new("TextLabel") keybindsHeader.Text = "Keybinds" keybindsHeader.Font = Enum.Font.GothamBold keybindsHeader.TextSize = 15 keybindsHeader.TextColor3 = Color3.fromRGB(255, 255, 255) keybindsHeader.BackgroundTransparency = 1 keybindsHeader.Size = UDim2.new(1, 0, 0, 20) keybindsHeader.TextXAlignment = Enum.TextXAlignment.Left keybindsHeader.LayoutOrder = 2 keybindsHeader.Parent = settingsContent local function createKeybindRow(order, label, action) local row = Instance.new("Frame") row.Size = UDim2.new(1, 0, 0, 32) row.BackgroundTransparency = 1 row.LayoutOrder = order row.Parent = settingsContent local labelText = Instance.new("TextLabel") labelText.Text = label labelText.Font = Enum.Font.Gotham labelText.TextSize = 14 labelText.TextColor3 = Color3.fromRGB(205, 205, 210) labelText.BackgroundTransparency = 1 labelText.Size = UDim2.new(0.5, 0, 1, 0) labelText.TextXAlignment = Enum.TextXAlignment.Left labelText.Parent = row local keyButton = Instance.new("TextButton") keyButton.Text = keybinds[action].Name keyButton.Font = Enum.Font.GothamBold keyButton.TextSize = 13 keyButton.TextColor3 = Color3.fromRGB(255, 255, 255) keyButton.BackgroundColor3 = getButtonColor() keyButton.Size = UDim2.new(0.5, -4, 0, 28) keyButton.Position = UDim2.new(0.5, 4, 0, 2) keyButton.Parent = row registerThemed(keyButton, "button") local keyButtonCorner = Instance.new("UICorner") keyButtonCorner.CornerRadius = UDim.new(0, 6) keyButtonCorner.Parent = keyButton keybindButtons[action] = keyButton keyButton.MouseButton1Click:Connect(function() beginRebind(action, keyButton) end) end createKeybindRow(3, "CFrame Speed", "CFrameSpeed") createKeybindRow(4, "Click Teleport", "ClickTeleport") createKeybindRow(5, "Fly", "Fly") createKeybindRow(6, "Noclip", "Noclip") createKeybindRow(7, "Freecam", "Freecam") createKeybindRow(8, "Shiftlock", "Shiftlock") local colorHeader = Instance.new("TextLabel") colorHeader.Text = "UI Color" colorHeader.Font = Enum.Font.GothamBold colorHeader.TextSize = 15 colorHeader.TextColor3 = Color3.fromRGB(255, 255, 255) colorHeader.BackgroundTransparency = 1 colorHeader.Size = UDim2.new(1, 0, 0, 20) colorHeader.TextXAlignment = Enum.TextXAlignment.Left colorHeader.LayoutOrder = 9 colorHeader.Parent = settingsContent local swatchRow = Instance.new("Frame") swatchRow.Size = UDim2.new(1, 0, 0, 30) swatchRow.BackgroundTransparency = 1 swatchRow.LayoutOrder = 10 swatchRow.Parent = settingsContent local swatchSize = 28 local spacing = 8 for i, color in presetColors do local swatch = Instance.new("TextButton") swatch.Text = "" swatch.BackgroundColor3 = color swatch.Size = UDim2.new(0, swatchSize, 0, swatchSize) swatch.Position = UDim2.new(0, (i - 1) * (swatchSize + spacing), 0, 0) swatch.Parent = swatchRow local swatchCorner = Instance.new("UICorner") swatchCorner.CornerRadius = UDim.new(1, 0) swatchCorner.Parent = swatch swatch.MouseButton1Click:Connect(function() setAccentColor(color) end) end end selectCategory("Movement")