-- 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, Hamsterball, -- 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 hamsterBallActive = false 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 stopHamsterBall 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 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 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 local 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 stopFly() stopHamsterBall() 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 humanoidRootPart = character and character:FindFirstChild("HumanoidRootPart") if not humanoidRootPart then 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 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 hamsterBallActive then stopHamsterBall() 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 -- ================= HAMSTERBALL ================= -- En riktig, osynlig fysik-boll som du styr - med äkta massa, tröghet och friktion mot -- marken, så den faktiskt RULLAR (fysiskt simulerat av Roblox) istället för att bara ha -- en uträknad animation ovanpå skriptad rörelse. Din kropp följer bollens riktiga, -- kollisionssäkra position och kopierar dess VERKLIGA rotation rakt av. local ballSpeed = 40 local hamsterButton local hamsterConnection = nil local hamsterBall = nil local hamsterBallVelocity = nil local hamsterGroundOffset = 3 local BALL_RADIUS = 4 local hamsterOriginalCanCollide = setmetatable({}, { __mode = "k" }) local function setHamsterCollisions(character, enabled) for _, part in character:GetDescendants() do if part:IsA("BasePart") then if enabled then local original = hamsterOriginalCanCollide[part] if original ~= nil then part.CanCollide = original end else if hamsterOriginalCanCollide[part] == nil then hamsterOriginalCanCollide[part] = part.CanCollide end part.CanCollide = false end end end end local function createHamsterBallPhysics(character) local humanoid = character:FindFirstChildOfClass("Humanoid") local humanoidRootPart = character:FindFirstChild("HumanoidRootPart") if not humanoid or not humanoidRootPart then return nil, nil end -- Räknas ut från karaktärens FAKTISKA HipHeight istället för en gissad konstant - -- en fast siffra passar inte alla avatarer och fick benen att sjunka genom marken. hamsterGroundOffset = humanoid.HipHeight + humanoidRootPart.Size.Y / 2 local ball = Instance.new("Part") ball.Name = "HamsterBall" ball.Shape = Enum.PartType.Ball ball.Size = Vector3.new(BALL_RADIUS * 2, BALL_RADIUS * 2, BALL_RADIUS * 2) ball.Transparency = 1 ball.CanCollide = true ball.Anchored = false -- Måttlig densitet (stabil, inte "fjäderlätt") och hög friktion så den rullar -- istället för att glida. Elasticitet 0 MED hög elasticityWeight - annars vägs -- golvets egen elasticitet in i beräkningen och kan fortfarande ge studs även -- om bollen själv har elasticitet 0. ball.CustomPhysicalProperties = PhysicalProperties.new(0.8, 0.6, 0, 1, 100) -- Spawnas en bit ovanför HumanoidRootPart så den inte börjar nedgrävd i golvet -- (det var det som tidigare orsakade en våldsam "fling" i luften vid start). ball.CFrame = humanoidRootPart.CFrame + Vector3.new(0, BALL_RADIUS - hamsterGroundOffset, 0) ball.Parent = workspace local velocity = Instance.new("BodyVelocity") velocity.MaxForce = Vector3.new(60000, 0, 60000) velocity.Velocity = Vector3.new(0, 0, 0) velocity.Parent = ball return ball, velocity end local function updateHamsterBall() local character = player.Character local humanoidRootPart = character and character:FindFirstChild("HumanoidRootPart") if not humanoidRootPart or not hamsterBall or not hamsterBallVelocity then return 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 if moveVector.Magnitude > 0 then moveVector = moveVector.Unit * ballSpeed end hamsterBallVelocity.Velocity = Vector3.new(moveVector.X, 0, moveVector.Z) -- Säkerhetsspärr: oavsett vad fysiken gör, tillåt aldrig en kraftig uppåtriktad -- hastighet (det är precis vad ett studs är). Tillåter fortfarande lite uppåtfart -- så den kan ta sig uppför sluttningar/trappor utan att kännas låst. local currentVelocity = hamsterBall.AssemblyLinearVelocity if currentVelocity.Y > 15 then hamsterBall.AssemblyLinearVelocity = Vector3.new(currentVelocity.X, 15, currentVelocity.Z) end -- Kroppen följer bollens FULLA CFrame exakt - position OCH rotation, rakt av. Det -- gör att du verkligen tumlar runt (liggande, upp-och-ner, osv) i takt med bollens -- riktiga fysik, istället för att stå fast upprätt och bara snurra runt en axel. humanoidRootPart.CFrame = hamsterBall.CFrame end function stopHamsterBall() hamsterBallActive = false if hamsterConnection then hamsterConnection:Disconnect() hamsterConnection = nil end if hamsterBall then hamsterBall:Destroy() hamsterBall = nil end hamsterBallVelocity = nil local character = player.Character if character then setHamsterCollisions(character, true) local humanoid = character:FindFirstChildOfClass("Humanoid") if humanoid then humanoid.PlatformStand = false end end if hamsterButton then hamsterButton.Text = "Hamsterball: OFF" hamsterButton.BackgroundColor3 = getButtonColor() end end local function startHamsterBall() local character = player.Character local humanoid = character and character:FindFirstChildOfClass("Humanoid") if not character or not humanoid then return end if flying then stopFly() end if noclipActive then stopNoclip() end if shiftlockActive then stopShiftlock() end if cframeSpeedActive then stopCFrameSpeed() end hamsterBallActive = true -- Kollisionen på karaktären MÅSTE stängas av INNAN bollen skapas - annars är bollen -- (stor, solid) och hela din kropp (fortfarande solid) överlappande i samma ögonblick -- den paras in i workspace, vilket ger exakt samma explosiva "fling" som originalbugg. setHamsterCollisions(character, false) hamsterBall, hamsterBallVelocity = createHamsterBallPhysics(character) if not hamsterBall then hamsterBallActive = false setHamsterCollisions(character, true) return end -- PlatformStand behövs HÄR (till skillnad från CFrame Speed) eftersom Hamsterball -- stänger av karaktärens egen kollision - utan PlatformStand tror Robloxs eget -- humanoid-system att karaktären konstant faller/saknar markkontakt och försöker -- ständigt korrigera det, vilket var precis det som kändes som att "dras till -- marken varje sekund" och ryckte till. humanoid.PlatformStand = true hamsterConnection = RunService.Heartbeat:Connect(updateHamsterBall) if hamsterButton then hamsterButton.Text = "Hamsterball: ON" hamsterButton.BackgroundColor3 = accentColor end end local function toggleHamsterBall() if not hubEnabled then return end if hamsterBallActive then stopHamsterBall() else startHamsterBall() 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 if hamsterBallActive then stopHamsterBall() 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, Hamsterball = Enum.KeyCode.H, 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 hamsterButton then hamsterButton.BackgroundColor3 = hamsterBallActive 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.Hamsterball then toggleHamsterBall() 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 hamsterBallActive then stopHamsterBall() 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 end end local function setWalkSpeed(value) walkSpeed = value applyWalkSpeedToLocalCharacter() end applyWalkSpeedToLocalCharacter() player.CharacterAdded:Connect(function(character) stopFly() stopHamsterBall() 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() stopHamsterBall() 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() stopFly() stopHamsterBall() stopNoclip() stopFreecam() stopShiftlock() stopSpectate() 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) createSliderRow(movementContent, "Ball Speed", 10, 200, ballSpeed, "", function(value) ballSpeed = value end) hamsterButton = createToggleButton(movementContent, "Hamsterball: OFF", toggleHamsterBall) 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, "Hamsterball", "Hamsterball") createKeybindRow(7, "Noclip", "Noclip") createKeybindRow(8, "Freecam", "Freecam") createKeybindRow(9, "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 = 10 colorHeader.Parent = settingsContent local swatchRow = Instance.new("Frame") swatchRow.Size = UDim2.new(1, 0, 0, 30) swatchRow.BackgroundTransparency = 1 swatchRow.LayoutOrder = 11 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 local scaleHeader = Instance.new("TextLabel") scaleHeader.Text = "UI Scale" scaleHeader.Font = Enum.Font.GothamBold scaleHeader.TextSize = 15 scaleHeader.TextColor3 = Color3.fromRGB(255, 255, 255) scaleHeader.BackgroundTransparency = 1 scaleHeader.Size = UDim2.new(1, 0, 0, 20) scaleHeader.TextXAlignment = Enum.TextXAlignment.Left scaleHeader.LayoutOrder = 12 scaleHeader.Parent = settingsContent createSliderRow(settingsContent, "Scale", 0.6, 1.6, 1, "x", function(value) uiScale.Scale = value end) end selectCategory("Movement")