-- THIS SCRIPT WAS EDITED BY PRO SCRIPTS -- THANK YOU LAZUMN FOR PROVIDING THIS SCRIPT IT'S REALLY APPERICIATED -- Framework is a recreation of evade and is in beta at the moment -- It took me 3 months to create this please respect me... -- arms are bugged right now.. animation might be added soon -- DEV LOG: -- Arms broke -- Camera got broken lol -- lolllllll -- i cant keep commenting at the top!!!! -- FOLLOW MY ROBLOX ACCOUNT NOWWWW!!!!! -- ever played evade before? this framework was created for that but i made it easier for trimping -- i might just decompile evade first person scripts remake them than have a decompiled evade first person -- waht you guys think? -- i spent so much timme scripting local Players = game:GetService("Players") local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local Workspace = game:GetService("Workspace") local TweenService = game:GetService("TweenService") local player = Players.LocalPlayer player:GetMouse().Icon = "rbxassetid://11783958279" local character = player.Character or player.CharacterAdded:Wait() local humanoid = character:WaitForChild("Humanoid") local rootPart = character:WaitForChild("HumanoidRootPart") local camera = Workspace.CurrentCamera humanoid.WalkSpeed = 90 if _G.fopFrameworkRunning then error(player.Name.. "[Framework] is already running — cannot run twice.") return end _G.fopFrameworkRunning = true player.CharacterRemoving:Connect(function() _G.fopFrameworkRunning = nil end) local viewmodel = Instance.new("Model") viewmodel.Name = "Viewmodel" viewmodel.Parent = camera local vHumanoid = Instance.new("Humanoid") vHumanoid.Parent = viewmodel vHumanoid.DisplayDistanceType = Enum.HumanoidDisplayDistanceType.None local function createArm(name) local arm = Instance.new("Part") arm.Name = name arm.Size = Vector3.new(0.6, 1.5, 0.6) arm.CanCollide = false arm.CastShadow = false arm.Massless = true arm.Parent = viewmodel return arm end local lArm = createArm("Left Arm") local rArm = createArm("Right Arm") local function syncAppearance() local shirt = character:FindFirstChildOfClass("Shirt") if shirt then local vShirt = viewmodel:FindFirstChildOfClass("Shirt") or Instance.new("Shirt", viewmodel) vShirt.ShirtTemplate = shirt.ShirtTemplate end local charLeft = character:FindFirstChild("Left Arm") or character:FindFirstChild("LeftUpperArm") local charRight = character:FindFirstChild("Right Arm") or character:FindFirstChild("RightUpperArm") if charLeft then lArm.Color = charLeft.Color end if charRight then rArm.Color = charRight.Color end end local screenGui = Instance.new("ScreenGui") screenGui.Name = "SpeedGui" screenGui.ResetOnSpawn = false screenGui.Parent = player.PlayerGui local frame = Instance.new("Frame") frame.Size = UDim2.new(0, 90, 0, 40) frame.Position = UDim2.new(0, 16, 1, -56) frame.BackgroundColor3 = Color3.fromRGB(0, 0, 0) frame.BackgroundTransparency = 0.25 frame.BorderSizePixel = 0 frame.Parent = screenGui local corner = Instance.new("UICorner") corner.CornerRadius = UDim.new(0, 6) corner.Parent = frame local label = Instance.new("TextLabel") label.Size = UDim2.new(1, 0, 1, 0) label.BackgroundTransparency = 1 label.TextColor3 = Color3.fromRGB(255, 255, 255) label.TextSize = 20 label.Font = Enum.Font.GothamBold label.Parent = frame syncAppearance() character.ChildAdded:Connect(syncAppearance) Workspace.Gravity = 190 player.CameraMaxZoomDistance = 0.5 humanoid.JumpPower = 52 local Config = { BaseSpeed = 16, CrouchSpeed = 8, SprintSpeed = 28, JUMP_BOOST = 1.18, BaseFOV = 85, SprintFOV = 110, MaxFOV = 130, MouseTiltSens = 0.08, BobIntensity = 0.35, StrafeTilt = 5, JumpBuildMax = 200, JumpBuildRate = 6, JumpBuildDecay = 18, JumpBuildBoost = 1.22, } local armState = { lArmPos = Vector3.new(-1.2, 0, 0), rArmPos = Vector3.new( 1.2, 0, 0), lArmAngX = 90, rArmAngX = 90, lArmAngY = 0, rArmAngY = 0, lArmAngZ = 0, rArmAngZ = 0, } local State = { Crouching = false, Sprinting = false, IsTrimping = false, IsThirdPerson = false, CanSwitch = true, OnGround = true, WasOnGround = true, } local vmBobTime = 0 local bobTime = 0 local swayAmount = Vector2.new(0, 0) local bobOffset = CFrame.identity local currentTilt = 0 local currentFOV = Config.BaseFOV local currentStrafeTilt = 0 local builtSpeed = 0 local rayParams = RaycastParams.new() rayParams.FilterDescendantsInstances = {character} local currentShiftLockAngle = 0 local function enterThirdPerson() if not State.CanSwitch then return end State.CanSwitch = false State.IsThirdPerson = true player.CameraMaxZoomDistance = 5 player.CameraMinZoomDistance = 5 task.wait(0.5) State.CanSwitch = true end local function enterFirstPerson() if not State.CanSwitch then return end State.CanSwitch = false State.IsThirdPerson = false task.spawn(function() local start = player.CameraMinZoomDistance local steps = 20 for i = 1, steps do local alpha = i / steps local current = start * (1 - alpha) player.CameraMaxZoomDistance = math.max(current, 0.5) player.CameraMinZoomDistance = math.max(current, 0.5) task.wait(0.005) end player.CameraMaxZoomDistance = 0.5 player.CameraMinZoomDistance = 0.5 task.wait(0.5) State.CanSwitch = true end) end local function togglePerspective() if State.IsThirdPerson then enterFirstPerson() else enterThirdPerson() end end local function getMoveDir() local moveDir = Vector3.new(0, 0, 0) local camCF = camera.CFrame local forward = Vector3.new(camCF.LookVector.X, 0, camCF.LookVector.Z).Unit local right = Vector3.new(camCF.RightVector.X, 0, camCF.RightVector.Z).Unit if UserInputService:IsKeyDown(Enum.KeyCode.W) then moveDir += forward end if UserInputService:IsKeyDown(Enum.KeyCode.S) then moveDir -= forward end if UserInputService:IsKeyDown(Enum.KeyCode.A) then moveDir -= right end if UserInputService:IsKeyDown(Enum.KeyCode.D) then moveDir += right end local thumbstick = UserInputService:GetNavigationGamepads() if #thumbstick > 0 then local leftStick = UserInputService:GetGamepadState(thumbstick[1]) for _, input in ipairs(leftStick) do if input.KeyCode == Enum.KeyCode.Thumbstick1 then local stickDir = Vector3.new(input.Position.X, 0, -input.Position.Y) if stickDir.Magnitude > 0.15 then local fullDir = (forward * -stickDir.Z + right * stickDir.X) if fullDir.Magnitude > 0 then moveDir += fullDir.Unit end end end end end if moveDir.Magnitude > 1 then moveDir = moveDir.Unit end return moveDir end RunService.Heartbeat:Connect(function(dt) if not rootPart or not humanoid then return end local currentVel = rootPart.AssemblyLinearVelocity local flatVel = Vector3.new(currentVel.X, 0, currentVel.Z) local verticalY = currentVel.Y local moveDir = getMoveDir() local onGround = humanoid.FloorMaterial ~= Enum.Material.Air State.OnGround = onGround local justLanded = onGround and not State.WasOnGround State.WasOnGround = onGround if onGround and not justLanded then builtSpeed = math.max(builtSpeed - Config.JumpBuildDecay * dt, 0) end local baseMax = State.Crouching and (Config.CrouchSpeed * 4.5) or State.Sprinting and (Config.SprintSpeed * 4.5) or (Config.BaseSpeed * 4.5) local maxS = math.min(baseMax + builtSpeed, Config.JumpBuildMax) local accelBase = State.Crouching and Config.CrouchSpeed or State.Sprinting and Config.SprintSpeed or Config.BaseSpeed local accel = accelBase * 5.0 if moveDir.Magnitude > 0 then flatVel += moveDir * accel * dt * 80 end local frictionMult = (not onGround) and 0.995 or State.Sprinting and 0.985 or 0.94 flatVel *= frictionMult if flatVel.Magnitude > maxS then flatVel = flatVel.Unit * maxS end local function doTrimp(normal) if flatVel.Magnitude < 18 then return end if normal.Y < 0.92 and normal.Y > 0.08 then local launch = flatVel.Magnitude * (1 - normal.Y) * 2.2 if verticalY < launch then verticalY = launch humanoid:ChangeState(Enum.HumanoidStateType.Freefall) State.IsTrimping = true end elseif math.abs(normal.Y) < 0.15 then local sideDir = Vector3.new(normal.X, 0, normal.Z) local dot = flatVel.Unit:Dot(-sideDir) if dot > 0.3 then local sideBoost = flatVel.Magnitude * dot * 1.6 if verticalY < sideBoost then verticalY = sideBoost flatVel = flatVel + sideDir * flatVel.Magnitude * 0.4 humanoid:ChangeState(Enum.HumanoidStateType.Freefall) State.IsTrimping = true end end end end local forwardRayDir = (flatVel.Magnitude > 5 and flatVel.Unit or rootPart.CFrame.LookVector) * 2.5 + Vector3.new(0, -4.5, 0) local forwardRay = Workspace:Raycast(rootPart.Position, forwardRayDir, rayParams) if forwardRay then doTrimp(forwardRay.Normal) end local sideOffsets = { Vector3.new( rootPart.CFrame.RightVector.X, 0, rootPart.CFrame.RightVector.Z) * 2.2, Vector3.new(-rootPart.CFrame.RightVector.X, 0, -rootPart.CFrame.RightVector.Z) * 2.2, } for _, offset in ipairs(sideOffsets) do local sideRay = Workspace:Raycast(rootPart.Position, offset + Vector3.new(0, -1.5, 0), rayParams) if sideRay then doTrimp(sideRay.Normal) end end if State.IsTrimping and verticalY > 5 then Workspace.Gravity = 130 else State.IsTrimping = false Workspace.Gravity = math.min(Workspace.Gravity + (190 - Workspace.Gravity) * 5 * dt, 190) end if flatVel.Magnitude > maxS then flatVel = flatVel.Unit * maxS end rootPart.AssemblyLinearVelocity = Vector3.new(flatVel.X, verticalY, flatVel.Z) end) humanoid.Jumping:Connect(function() local vel = rootPart.AssemblyLinearVelocity local flatSpeed = Vector3.new(vel.X, 0, vel.Z).Magnitude builtSpeed = math.min(builtSpeed + Config.JumpBuildRate, Config.JumpBuildMax) task.wait() local boost = Config.JUMP_BOOST + (builtSpeed / Config.JumpBuildMax) * (Config.JumpBuildBoost - Config.JUMP_BOOST) rootPart.AssemblyLinearVelocity = Vector3.new(vel.X * boost, rootPart.AssemblyLinearVelocity.Y, vel.Z * boost) end) local function ensureArms() if not lArm or not lArm.Parent then lArm = createArm("Left Arm") end if not rArm or not rArm.Parent then rArm = createArm("Right Arm") end end RunService.RenderStepped:Connect(function(dt) if not rootPart or not humanoid then return end local velocity = rootPart.AssemblyLinearVelocity local velY = velocity.Y local speed = Vector3.new(velocity.X, 0, velocity.Z).Magnitude local isMoving = speed > 2 local isFalling = humanoid.FloorMaterial == Enum.Material.Air local mouseDelta = UserInputService:GetMouseDelta() swayAmount = swayAmount:Lerp(mouseDelta, 0.1) local swayCF = CFrame.Angles( math.rad(swayAmount.Y * 0.07), math.rad(swayAmount.X * 0.07), math.rad(swayAmount.X * 0.04) ) label.Text = math.floor(speed) .. "%" local strafeInput = 0 if UserInputService:IsKeyDown(Enum.KeyCode.A) then strafeInput -= 1 end if UserInputService:IsKeyDown(Enum.KeyCode.D) then strafeInput += 1 end local thumbstick = UserInputService:GetNavigationGamepads() if #thumbstick > 0 then local leftStick = UserInputService:GetGamepadState(thumbstick[1]) for _, input in ipairs(leftStick) do if input.KeyCode == Enum.KeyCode.Thumbstick1 then if math.abs(input.Position.X) > 0.15 then strafeInput = input.Position.X end end end end local targetStrafeTilt = math.rad(strafeInput * Config.StrafeTilt * (isMoving and 1 or 0.4)) currentStrafeTilt = currentStrafeTilt + (targetStrafeTilt - currentStrafeTilt) * 8 * dt local speedRatio = math.clamp(speed / Config.JumpBuildMax, 0, 1) local targetFOV if State.Sprinting and isMoving then targetFOV = Config.SprintFOV + (Config.MaxFOV - Config.SprintFOV) * speedRatio elseif State.Crouching then targetFOV = Config.BaseFOV - 5 else targetFOV = Config.BaseFOV + (Config.SprintFOV - Config.BaseFOV) * speedRatio end currentFOV = currentFOV + (targetFOV - currentFOV) * 6 * dt vmBobTime += dt * (isMoving and (speed * 0.21) or 0.38) local pump = isMoving and math.sin(vmBobTime) * 0.28 or 0 local verticalBob = isMoving and (math.sin(vmBobTime) * 0.1) or (math.sin(vmBobTime * 0.5) * 0.03) local horizontalSway = isMoving and 0 or (math.cos(vmBobTime * 0.5) * 0.02) lArm.Transparency = State.IsThirdPerson and 1 or 0 rArm.Transparency = State.IsThirdPerson and 1 or 0 if State.IsThirdPerson then local targetAngle = math.atan2(velocity.X, velocity.Z) if speed > 1 then currentShiftLockAngle = currentShiftLockAngle + (targetAngle - currentShiftLockAngle) * 10 * dt end local camCF = camera.CFrame local flatLook = Vector3.new(camCF.LookVector.X, 0, camCF.LookVector.Z).Unit rootPart.CFrame = rootPart.CFrame:Lerp(CFrame.new(rootPart.Position) * CFrame.Angles(0, math.atan2(-flatLook.X, -flatLook.Z), 0), 12 * dt) end if not State.IsThirdPerson then camera.FieldOfView = currentFOV local vmRoot = camera.CFrame * swayCF * CFrame.new(horizontalSway, -1.6 + verticalBob, -1.1) local function getArmTargets() local isOnGround = humanoid.FloorMaterial ~= Enum.Material.Air if velY > 4 and not isOnGround then local jumpBlend = math.clamp((velY - 4) / 12, 0, 1) return { lArmPos = Vector3.new(-1.35, 0.15 * jumpBlend, -0.3 * jumpBlend), rArmPos = Vector3.new( 1.35, 0.15 * jumpBlend, -0.3 * jumpBlend), lArmAngX = 90 - 30 * jumpBlend, rArmAngX = 90 - 30 * jumpBlend, lArmAngY = 0, rArmAngY = 0, lArmAngZ = 18 * jumpBlend, rArmAngZ = -18 * jumpBlend, } elseif velY < -4 and not isOnGround then local fallBlend = math.clamp((-velY - 4) / 14, 0, 1) return { lArmPos = Vector3.new(-1.3, 0.2 * fallBlend, 0.25 * fallBlend), rArmPos = Vector3.new( 1.3, 0.2 * fallBlend, 0.25 * fallBlend), lArmAngX = 90 + 25 * fallBlend, rArmAngX = 90 + 25 * fallBlend, lArmAngY = 0, rArmAngY = 0, lArmAngZ = 22 * fallBlend, rArmAngZ = -22 * fallBlend, } elseif isMoving then local runBlend = math.clamp((speed - 2) / 6, 0, 1) local swing = math.sin(vmBobTime) * 40 * runBlend return { lArmPos = Vector3.new(-1.2, verticalBob, pump * 1.6 * runBlend), rArmPos = Vector3.new( 1.2, verticalBob, -pump * 1.6 * runBlend), lArmAngX = 90, rArmAngX = 90, lArmAngY = swing, rArmAngY = -swing, lArmAngZ = 6 * runBlend, rArmAngZ = -6 * runBlend, } else local breatheZ = math.sin(vmBobTime * 0.4) * 0.015 local breatheY = math.sin(vmBobTime * 0.5) * 0.03 return { lArmPos = Vector3.new(-1.18 + horizontalSway, breatheY, 0), rArmPos = Vector3.new( 1.18 - horizontalSway, breatheY, 0), lArmAngX = 90, rArmAngX = 90, lArmAngY = 0, rArmAngY = 0, lArmAngZ = breatheZ + 3, rArmAngZ = -breatheZ - 3, } end end local targets = getArmTargets() local lerpSpeed = 8 * dt armState.lArmPos = armState.lArmPos:Lerp(targets.lArmPos, lerpSpeed) armState.rArmPos = armState.rArmPos:Lerp(targets.rArmPos, lerpSpeed) armState.lArmAngX = armState.lArmAngX + (targets.lArmAngX - armState.lArmAngX) * lerpSpeed armState.rArmAngX = armState.rArmAngX + (targets.rArmAngX - armState.rArmAngX) * lerpSpeed armState.lArmAngY = armState.lArmAngY + (targets.lArmAngY - armState.lArmAngY) * lerpSpeed armState.rArmAngY = armState.rArmAngY + (targets.rArmAngY - armState.rArmAngY) * lerpSpeed armState.lArmAngZ = armState.lArmAngZ + (targets.lArmAngZ - armState.lArmAngZ) * lerpSpeed armState.rArmAngZ = armState.rArmAngZ + (targets.rArmAngZ - armState.rArmAngZ) * lerpSpeed lArm.CFrame = vmRoot * CFrame.new(armState.lArmPos) * CFrame.Angles(math.rad(armState.lArmAngX), math.rad(armState.lArmAngY), math.rad(armState.lArmAngZ)) rArm.CFrame = vmRoot * CFrame.new(armState.rArmPos) * CFrame.Angles(math.rad(armState.rArmAngX), math.rad(armState.rArmAngY), math.rad(armState.rArmAngZ)) end local targetTilt = math.clamp(-mouseDelta.X * Config.MouseTiltSens, -12, 12) currentTilt = currentTilt + (math.rad(targetTilt) - currentTilt) * 6 * dt local bTime = tick() * 2.0 local breathing = Vector3.new(math.sin(bTime * 0.5) * 0.04, math.sin(bTime) * 0.12, 0) if isMoving and not isFalling then bobTime += dt * (speed * 0.4) bobOffset = CFrame.new(math.cos(bobTime / 2) * 0.15, math.sin(bobTime) * 0.35, 0) else bobOffset = bobOffset:Lerp(CFrame.identity, 0.1) end if not State.IsThirdPerson then camera.CFrame = camera.CFrame * CFrame.new(breathing) * bobOffset * CFrame.Angles(0, 0, currentTilt + currentStrafeTilt) else camera.CFrame = camera.CFrame * CFrame.Angles(0, 0, currentTilt + currentStrafeTilt) end local crouchGoal = State.Crouching and -1.8 or 0 humanoid.CameraOffset = humanoid.CameraOffset:Lerp(Vector3.new(0, crouchGoal, 0), 10 * dt) end) UserInputService.InputBegan:Connect(function(i, gp) if gp then return end if i.KeyCode == Enum.KeyCode.C or i.KeyCode == Enum.KeyCode.ButtonB then State.Crouching = true State.Sprinting = false elseif i.KeyCode == Enum.KeyCode.LeftShift or i.KeyCode == Enum.KeyCode.ButtonL3 then if not State.Crouching then State.Sprinting = true end elseif i.KeyCode == Enum.KeyCode.Z or i.KeyCode == Enum.KeyCode.ButtonR3 then togglePerspective() end end) UserInputService.InputEnded:Connect(function(i, gp) if gp then return end if i.KeyCode == Enum.KeyCode.C or i.KeyCode == Enum.KeyCode.ButtonB then State.Crouching = false elseif i.KeyCode == Enum.KeyCode.LeftShift or i.KeyCode == Enum.KeyCode.ButtonL3 then State.Sprinting = false end end) local isMobile = UserInputService.TouchEnabled and not UserInputService.KeyboardEnabled if isMobile then local sprintGui = Instance.new("ScreenGui") sprintGui.Name = "SprintGui" sprintGui.ResetOnSpawn = false sprintGui.IgnoreGuiInset = true sprintGui.Parent = player.PlayerGui local sprintBtn = Instance.new("TextButton") sprintBtn.Size = UDim2.new(0.18, 0, 0.12, 0) sprintBtn.Position = UDim2.new(0.78, 0, 0.78, 0) sprintBtn.AnchorPoint = Vector2.new(0.5, 0.5) sprintBtn.BackgroundColor3 = Color3.fromRGB(255, 255, 255) sprintBtn.BackgroundTransparency = 0.3 sprintBtn.BorderSizePixel = 0 sprintBtn.Text = "SPRINT" sprintBtn.TextColor3 = Color3.fromRGB(255, 255, 255) sprintBtn.TextScaled = true sprintBtn.Font = Enum.Font.GothamBold sprintBtn.Parent = sprintGui local btnCorner = Instance.new("UICorner") btnCorner.CornerRadius = UDim.new(0.25, 0) btnCorner.Parent = sprintBtn local btnStroke = Instance.new("UIStroke") btnStroke.Color = Color3.fromRGB(255, 255, 255) btnStroke.Thickness = 2 btnStroke.Transparency = 0.6 btnStroke.Parent = sprintBtn local function setSprinting(val) if State.Crouching then return end State.Sprinting = val sprintBtn.BackgroundTransparency = val and 0.1 or 0.3 sprintBtn.TextColor3 = val and Color3.fromRGB(255, 220, 80) or Color3.fromRGB(255, 255, 255) end sprintBtn.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch then setSprinting(true) end end) sprintBtn.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch then setSprinting(false) end end) end local function resetArms() armState.lArmPos = Vector3.new(-1.2, 0, 0) armState.rArmPos = Vector3.new( 1.2, 0, 0) armState.lArmAngX = 90 armState.rArmAngX = 90 armState.lArmAngY = 0 armState.rArmAngY = 0 armState.lArmAngZ = 0 armState.rArmAngZ = 0 if lArm and lArm.Parent then lArm:Destroy() end if rArm and rArm.Parent then rArm:Destroy() end lArm = createArm("Left Arm") rArm = createArm("Right Arm") syncAppearance() end UserInputService.InputBegan:Connect(function(i, gp) if gp then return end if i.KeyCode == Enum.KeyCode.Minus then resetArms() end end) if isMobile then local perspectiveGui = Instance.new("ScreenGui") perspectiveGui.Name = "PerspectiveGui" perspectiveGui.ResetOnSpawn = false perspectiveGui.IgnoreGuiInset = true perspectiveGui.Parent = player.PlayerGui local perspectiveBtn = Instance.new("TextButton") perspectiveBtn.Size = UDim2.new(0.22, 0, 0.07, 0) perspectiveBtn.Position = UDim2.new(0.5, 0, 0.03, 0) perspectiveBtn.AnchorPoint = Vector2.new(0.5, 0) perspectiveBtn.BackgroundColor3 = Color3.fromRGB(0, 0, 0) perspectiveBtn.BackgroundTransparency = 0.35 perspectiveBtn.BorderSizePixel = 0 perspectiveBtn.Text = "FIRST PERSON" perspectiveBtn.TextColor3 = Color3.fromRGB(255, 255, 255) perspectiveBtn.TextScaled = true perspectiveBtn.Font = Enum.Font.GothamBold perspectiveBtn.Parent = perspectiveGui local perspCorner = Instance.new("UICorner") perspCorner.CornerRadius = UDim.new(0, 8) perspCorner.Parent = perspectiveBtn local perspStroke = Instance.new("UIStroke") perspStroke.Color = Color3.fromRGB(180, 180, 180) perspStroke.Thickness = 1.5 perspStroke.Transparency = 0.5 perspStroke.Parent = perspectiveBtn perspectiveBtn.MouseButton1Click:Connect(function() togglePerspective() task.wait(0.1) perspectiveBtn.Text = State.IsThirdPerson and "THIRD PERSON" or "FIRST PERSON" end) local resetGui = Instance.new("ScreenGui") resetGui.Name = "ResetArmsGui" resetGui.ResetOnSpawn = false resetGui.IgnoreGuiInset = true resetGui.Parent = player.PlayerGui local resetBtn = Instance.new("TextButton") resetBtn.Size = UDim2.new(0.18, 0, 0.08, 0) resetBtn.Position = UDim2.new(0.78, 0, 0.65, 0) resetBtn.AnchorPoint = Vector2.new(0.5, 0.5) resetBtn.BackgroundColor3 = Color3.fromRGB(255, 255, 255) resetBtn.BackgroundTransparency = 0.3 resetBtn.BorderSizePixel = 0 resetBtn.Text = "RESET ARMS" resetBtn.TextColor3 = Color3.fromRGB(255, 255, 255) resetBtn.TextScaled = true resetBtn.Font = Enum.Font.GothamBold resetBtn.Parent = resetGui local resetCorner = Instance.new("UICorner") resetCorner.CornerRadius = UDim.new(0.25, 0) resetCorner.Parent = resetBtn local resetStroke = Instance.new("UIStroke") resetStroke.Color = Color3.fromRGB(255, 255, 255) resetStroke.Thickness = 2 resetStroke.Transparency = 0.6 resetStroke.Parent = resetBtn local dragging = false local dragStartPos = Vector2.new() local btnStartPos = Vector2.new() local wasDrag = false local DRAG_THRESHOLD = 10 resetBtn.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch then dragging = true wasDrag = false dragStartPos = Vector2.new(input.Position.X, input.Position.Y) local absPos = resetBtn.AbsolutePosition local absSize = resetBtn.AbsoluteSize btnStartPos = Vector2.new( absPos.X + absSize.X * 0.5, absPos.Y + absSize.Y * 0.5 ) end end) UserInputService.TouchMoved:Connect(function(input) if not dragging then return end local delta = Vector2.new(input.Position.X, input.Position.Y) - dragStartPos if delta.Magnitude > DRAG_THRESHOLD then wasDrag = true end if wasDrag then local vp = camera.ViewportSize local newX = (btnStartPos.X + delta.X) / vp.X local newY = (btnStartPos.Y + delta.Y) / vp.Y newX = math.clamp(newX, 0.05, 0.95) newY = math.clamp(newY, 0.05, 0.95) resetBtn.Position = UDim2.new(newX, 0, newY, 0) end end) UserInputService.TouchEnded:Connect(function(input) if not dragging then return end dragging = false if not wasDrag then resetBtn.BackgroundTransparency = 0.1 resetArms() task.wait(0.12) resetBtn.BackgroundTransparency = 0.3 end end) end if isMobile then task.wait(1) game:GetService("StarterGui"):SetCore("SendNotification", { Title = "HOW TO CHANGE SPEED EASILY", Text = "This bug may never get fixed but if your speed is stuck at 16 please go to Infinite Yield and set your speed", Duration = 8, }) end