-- Made by the pepe guy -- Grapple prediction and auto dodge local Players = game:GetService("Players") local RunService = game:GetService("RunService") local player = Players.LocalPlayer local enabled = false local dodgeEnabled = false local processedBeams = {} local activeFakes = {} local dodgedBeams = {} local isDodging = false local currentAway = nil local dodgeEndTime = 0 local currentBV = nil local screenGui = Instance.new("ScreenGui") screenGui.Name = "ShotPredictionGui" screenGui.ResetOnSpawn = false screenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling screenGui.DisplayOrder = 999 screenGui.Parent = player:WaitForChild("PlayerGui") local frame = Instance.new("Frame") frame.Name = "MainFrame" frame.Size = UDim2.new(0.18, 0, 0.15, 0) frame.Position = UDim2.new(0.80, 0, 0.04, 0) frame.BackgroundColor3 = Color3.fromRGB(20, 20, 20) frame.BorderSizePixel = 0 frame.Active = true frame.Parent = screenGui local frameCorner = Instance.new("UICorner") frameCorner.CornerRadius = UDim.new(0, 8) frameCorner.Parent = frame local predButton = Instance.new("TextButton") predButton.Name = "PredictionButton" predButton.Size = UDim2.new(1, -10, 0.42, 0) predButton.Position = UDim2.new(0, 5, 0.05, 0) predButton.BackgroundColor3 = Color3.fromRGB(200, 40, 40) predButton.Text = "Shot Prediction: OFF" predButton.TextColor3 = Color3.fromRGB(255, 255, 255) predButton.Font = Enum.Font.GothamBold predButton.TextScaled = true predButton.AutoButtonColor = true predButton.Active = true predButton.Parent = frame local predCorner = Instance.new("UICorner") predCorner.CornerRadius = UDim.new(0, 6) predCorner.Parent = predButton local dodgeButton = Instance.new("TextButton") dodgeButton.Name = "DodgeButton" dodgeButton.Size = UDim2.new(1, -10, 0.42, 0) dodgeButton.Position = UDim2.new(0, 5, 0.53, 0) dodgeButton.BackgroundColor3 = Color3.fromRGB(80, 80, 80) dodgeButton.Text = "Auto-Dodge: OFF" dodgeButton.TextColor3 = Color3.fromRGB(180, 180, 180) dodgeButton.Font = Enum.Font.GothamBold dodgeButton.TextScaled = true dodgeButton.AutoButtonColor = false dodgeButton.Active = false dodgeButton.Parent = frame local dodgeCorner = Instance.new("UICorner") dodgeCorner.CornerRadius = UDim.new(0, 6) dodgeCorner.Parent = dodgeButton local function updateDodgeButtonState() if enabled then dodgeButton.Active = true dodgeButton.AutoButtonColor = true if dodgeEnabled then dodgeButton.Text = "Auto-Dodge: ON" dodgeButton.BackgroundColor3 = Color3.fromRGB(40, 180, 40) dodgeButton.TextColor3 = Color3.fromRGB(255, 255, 255) else dodgeButton.Text = "Auto-Dodge: OFF" dodgeButton.BackgroundColor3 = Color3.fromRGB(200, 40, 40) dodgeButton.TextColor3 = Color3.fromRGB(255, 255, 255) end else dodgeEnabled = false dodgeButton.Active = false dodgeButton.AutoButtonColor = false dodgeButton.Text = "Auto-Dodge: OFF" dodgeButton.BackgroundColor3 = Color3.fromRGB(80, 80, 80) dodgeButton.TextColor3 = Color3.fromRGB(180, 180, 180) end end local function isInsidePlayerFolder(obj) local current = obj.Parent while current and current ~= workspace do if current.Name == player.Name then return true end current = current.Parent end return false end local function setGrappleSpeed(obj) if not enabled then return end if obj:IsA("IntValue") and obj.Name == "grappleSpeed" then if not isInsidePlayerFolder(obj) then obj.Value = 10000 end end end local function freezeCFrameValue(obj) if not enabled then return end if obj:IsA("CFrameValue") then task.delay(0.05, function() if obj and obj.Parent then local locked = obj.Value obj.Value = locked end end) end end local function getPlayerFolder(beam) local current = beam.Parent while current and current ~= workspace do if Players:FindFirstChild(current.Name) then return current end current = current.Parent end return nil end local function findRightHand(plr) local character = plr.Character if not character then return nil end return character:FindFirstChild("RightHand") or character:FindFirstChild("Right Arm") end local function cleanupFake(originalBeam) local data = activeFakes[originalBeam] if not data then return end if data.fakeBeam and data.fakeBeam.Parent then data.fakeBeam:Destroy() end if data.proxyHook and data.proxyHook.Parent then data.proxyHook:Destroy() end if data.proxyHand and data.proxyHand.Parent then data.proxyHand:Destroy() end if data.att0 and data.att0.Parent then data.att0:Destroy() end if data.att1 and data.att1.Parent then data.att1:Destroy() end activeFakes[originalBeam] = nil processedBeams[originalBeam] = nil dodgedBeams[originalBeam] = nil end local function createClientBeam(playerFolder, originalBeam, savedProps) if not enabled then return end if processedBeams[originalBeam] then return end if playerFolder.Name == player.Name then return end processedBeams[originalBeam] = true local playerName = playerFolder.Name local plr = Players:FindFirstChild(playerName) if not plr then return end local clientHook = playerFolder:FindFirstChild("clientHook") if not (clientHook and clientHook:IsA("BasePart")) then return end local rightHand = findRightHand(plr) if not rightHand then return end local hookCF = clientHook.CFrame local handCF = rightHand.CFrame local proxyHook = Instance.new("Part") proxyHook.Name = "ClientBeamProxyHook" proxyHook.Size = Vector3.new(0.2, 0.2, 0.2) proxyHook.Transparency = 1 proxyHook.CanCollide = false proxyHook.Massless = true proxyHook.Anchored = true proxyHook.CFrame = hookCF proxyHook.Parent = workspace local proxyHand = Instance.new("Part") proxyHand.Name = "ClientBeamProxyHand" proxyHand.Size = Vector3.new(0.2, 0.2, 0.2) proxyHand.Transparency = 1 proxyHand.CanCollide = false proxyHand.Massless = true proxyHand.Anchored = true proxyHand.CFrame = handCF proxyHand.Parent = workspace local att0 = Instance.new("Attachment") att0.Name = "ClientBeamAtt0" att0.Parent = proxyHook local att1 = Instance.new("Attachment") att1.Name = "ClientBeamAtt1" att1.Parent = proxyHand local fakeBeam = Instance.new("Beam") fakeBeam.Name = "ClientFakeBeam" fakeBeam.Attachment0 = att0 fakeBeam.Attachment1 = att1 fakeBeam.Enabled = true fakeBeam.Parent = workspace if savedProps then fakeBeam.Color = savedProps.Color fakeBeam.Transparency = savedProps.Transparency fakeBeam.Width0 = savedProps.Width0 fakeBeam.Width1 = savedProps.Width1 fakeBeam.FaceCamera = savedProps.FaceCamera fakeBeam.LightEmission = savedProps.LightEmission fakeBeam.LightInfluence = savedProps.LightInfluence fakeBeam.Segments = savedProps.Segments fakeBeam.Texture = savedProps.Texture fakeBeam.TextureLength = savedProps.TextureLength fakeBeam.TextureSpeed = savedProps.TextureSpeed fakeBeam.CurveSize0 = savedProps.CurveSize0 fakeBeam.CurveSize1 = savedProps.CurveSize1 fakeBeam.ZOffset = savedProps.ZOffset end activeFakes[originalBeam] = { fakeBeam = fakeBeam, proxyHook = proxyHook, proxyHand = proxyHand, att0 = att0, att1 = att1, playerFolder = playerFolder } local conn1, conn2 conn1 = originalBeam.AncestryChanged:Connect(function() if not originalBeam:IsDescendantOf(game) then cleanupFake(originalBeam) if conn1 then conn1:Disconnect() end if conn2 then conn2:Disconnect() end end end) conn2 = originalBeam.Destroying:Connect(function() cleanupFake(originalBeam) if conn1 then conn1:Disconnect() end if conn2 then conn2:Disconnect() end end) end local function onBeam(obj) if not enabled then return end if not obj:IsA("Beam") then return end if obj.Name == "ClientFakeBeam" then return end local playerFolder = getPlayerFolder(obj) if playerFolder and playerFolder.Name == player.Name then return end local savedProps = { Color = obj.Color, Transparency = obj.Transparency, Width0 = obj.Width0, Width1 = obj.Width1, FaceCamera = obj.FaceCamera, LightEmission = obj.LightEmission, LightInfluence = obj.LightInfluence, Segments = obj.Segments, Texture = obj.Texture, TextureLength = obj.TextureLength, TextureSpeed = obj.TextureSpeed, CurveSize0 = obj.CurveSize0, CurveSize1 = obj.CurveSize1, ZOffset = obj.ZOffset } obj.Enabled = false obj.Width0 = 0 obj.Width1 = 0 if playerFolder and not processedBeams[obj] then task.delay(0.03, function() if obj and obj.Parent and enabled then createClientBeam(playerFolder, obj, savedProps) end end) end end local function onRopeConstraint(obj) if not enabled then return end if not obj:IsA("RopeConstraint") then return end local current = obj.Parent while current and current ~= workspace do for originalBeam, data in pairs(activeFakes) do if data.playerFolder == current then cleanupFake(originalBeam) end end current = current.Parent end end local function getNearbyBeamPositions(hrp) local positions = {} local maxDist = 7 for originalBeam, data in pairs(activeFakes) do if not dodgedBeams[originalBeam] and data.proxyHook and data.proxyHand and data.proxyHook.Parent and data.proxyHand.Parent then local a = data.proxyHook.Position local b = data.proxyHand.Position local ab = b - a local abLen = ab.Magnitude local closest if abLen < 0.01 then closest = a else local t = math.clamp((hrp.Position - a):Dot(ab) / ab:Dot(ab), 0, 1) closest = a + ab * t end local dist = (hrp.Position - closest).Magnitude if dist < maxDist then table.insert(positions, {pos = closest, beam = originalBeam, dist = dist}) end end end return positions end local function hasGroundInDirection(hrp, direction) local origin = hrp.Position + direction * 3 + Vector3.new(0, 1, 0) local ray = workspace:Raycast(origin, Vector3.new(0, -6, 0)) return ray ~= nil end local function calculateAwayDirection(hrp, beamPositions) if #beamPositions == 0 then return nil end local combined = Vector3.zero for _, info in ipairs(beamPositions) do local away = (hrp.Position - info.pos) * Vector3.new(1, 0, 1) if away.Magnitude > 0.05 then combined += away.Unit / math.max(info.dist, 0.5) end end if combined.Magnitude < 0.05 then combined = -hrp.CFrame.LookVector * Vector3.new(1, 0, 1) end local away = combined.Unit if not hasGroundInDirection(hrp, away) then local right = hrp.CFrame.RightVector * Vector3.new(1, 0, 1) if hasGroundInDirection(hrp, right) then return right.Unit elseif hasGroundInDirection(hrp, -right) then return (-right).Unit else return nil end end return away end local function startOrUpdateDodge(hrp, humanoid, away, beamPositions) for _, info in ipairs(beamPositions) do dodgedBeams[info.beam] = true end currentAway = away dodgeEndTime = tick() + 0.5 if not isDodging then isDodging = true local bv = Instance.new("BodyVelocity") bv.Name = "DodgeVelocity" bv.MaxForce = Vector3.new(100000, 0, 100000) bv.Velocity = away * 16 bv.P = 3000 bv.Parent = hrp currentBV = bv local conn conn = RunService.RenderStepped:Connect(function() if tick() > dodgeEndTime or not hrp or not hrp.Parent or not humanoid or not humanoid.Parent then if currentBV and currentBV.Parent then currentBV:Destroy() end currentBV = nil conn:Disconnect() isDodging = false currentAway = nil return end if currentAway then currentBV.Velocity = currentAway * 16 humanoid:Move(currentAway, false) end end) else if currentBV and currentBV.Parent then currentBV.Velocity = away * 16 end end end local function processAll() for _, v in ipairs(workspace:GetDescendants()) do setGrappleSpeed(v) freezeCFrameValue(v) onBeam(v) onRopeConstraint(v) end end for _, v in ipairs(workspace:GetDescendants()) do if v.Name == "ClientFakeBeam" or v.Name == "ClientBeamProxyHook" or v.Name == "ClientBeamProxyHand" then v:Destroy() end end workspace.DescendantAdded:Connect(function(obj) setGrappleSpeed(obj) freezeCFrameValue(obj) onBeam(obj) onRopeConstraint(obj) end) RunService.Heartbeat:Connect(function() if not enabled then return end for originalBeam, _ in pairs(activeFakes) do if not originalBeam or not originalBeam:IsDescendantOf(game) then cleanupFake(originalBeam) end end if not dodgeEnabled then return end local character = player.Character if not character then return end local hrp = character:FindFirstChild("HumanoidRootPart") local humanoid = character:FindFirstChildOfClass("Humanoid") if not hrp or not humanoid then return end local beamPositions = getNearbyBeamPositions(hrp) if #beamPositions == 0 then return end local away = calculateAwayDirection(hrp, beamPositions) if not away then return end startOrUpdateDodge(hrp, humanoid, away, beamPositions) end) predButton.MouseButton1Click:Connect(function() enabled = not enabled if enabled then predButton.Text = "Shot Prediction: ON" predButton.BackgroundColor3 = Color3.fromRGB(40, 180, 40) processAll() else predButton.Text = "Shot Prediction: OFF" predButton.BackgroundColor3 = Color3.fromRGB(200, 40, 40) for originalBeam, _ in pairs(activeFakes) do cleanupFake(originalBeam) end end updateDodgeButtonState() end) dodgeButton.MouseButton1Click:Connect(function() if not enabled then return end dodgeEnabled = not dodgeEnabled updateDodgeButtonState() end) updateDodgeButtonState()