Playz Hub
Playz Hub
-- Global flags
getgenv().SingularityActive = false
getgenv().AerodynamicActive = false
getgenv().AerodynamicTime = 0
getgenv().DeathSlashActive = false
getgenv().DeathSlashTime = 0
getgenv().DeathSlashParryCount = 0
getgenv().AerodynamicDetectionEnabled = false
getgenv().DeathSlashDetectionEnabled = false
local lastSpamTime = 0
local lastParryTime = 0
local parryCooldown = 0.01
local connManager = {}
local Parries = 0
local parryFlag = false
local selectedParryMode = "Custom"
local spamThreshold = 0.01
local spamSpeed = 10
local Spamming = false
local Closest_Entity = nil
local ServerStatsItem = Stats.Network.ServerStatsItem
local Alive = Workspace.Alive
local activeMethod = "Remote"
-- Manual Spam
local manualSpamEnabled = false
local spamming = false
local spamRate = 0.005
-----------------------------------------------------------
-- Remote Lookup
-----------------------------------------------------------
-----------------------------------------------------------
-- Tween and Animation Helpers
-----------------------------------------------------------
local function executeTween(target, info, props)
local tw = TweenService:Create(target, info, props)
tw:Play()
task.wait(info.Time)
Debris:AddItem(tw, 0)
tw:Destroy()
end
-----------------------------------------------------------
-- Animation Management
-----------------------------------------------------------
local AnimStorage = { list = {}, current = nil, track = nil }
for _, anim in pairs(ReplicatedStore.Misc.Emotes:GetChildren()) do
if anim:IsA("Animation") and anim:GetAttribute("EmoteName") then
AnimStorage.list[anim:GetAttribute("EmoteName")] = anim
end
end
local animNames = {}
for name in pairs(AnimStorage.list) do
table.insert(animNames, name)
end
table.sort(animNames)
-----------------------------------------------------------
-- Spam Module
-----------------------------------------------------------
local Spam = {}
function Spam.Get_Closest()
local Max_Distance = math.huge
Closest_Entity = nil
for _, Entity in pairs(Workspace.Alive:GetChildren()) do
if tostring(Entity) ~= tostring(LocalPlayer) then
local Distance =
LocalPlayer:DistanceFromCharacter(Entity.PrimaryPart.Position)
if Distance < Max_Distance then
Max_Distance = Distance
Closest_Entity = Entity
end
end
end
return Closest_Entity
end
function Spam.Entity_Properties()
Spam.Get_Closest()
if not Closest_Entity then
return false
end
local Entity_Velocity = Closest_Entity.PrimaryPart.Velocity
local Entity_Direction = (LocalPlayer.Character.PrimaryPart.Position -
Closest_Entity.PrimaryPart.Position).Unit
local Entity_Distance = (LocalPlayer.Character.PrimaryPart.Position -
Closest_Entity.PrimaryPart.Position).Magnitude
return {Velocity=Entity_Velocity, Direction=Entity_Direction,
Distance=Entity_Distance}
end
function Spam.Ball_Properties()
local Ball = Spam.FetchBall()
if not Ball then
return {Velocity=Vector3.zero, Direction=Vector3.zero, Distance=math.huge,
Dot=0}
end
local Ball_Velocity = Ball:FindFirstChild("zoomies") and
Ball.zoomies.VectorVelocity or Vector3.zero
local Ball_Direction = (LocalPlayer.Character.PrimaryPart.Position -
Ball.Position).Unit
local Ball_Distance = (LocalPlayer.Character.PrimaryPart.Position -
Ball.Position).Magnitude
local Ball_Dot = Ball_Direction:Dot(Ball_Velocity.Unit)
return {Velocity=Ball_Velocity, Direction=Ball_Direction,
Distance=Ball_Distance, Dot=Ball_Dot}
end
function Spam.CalcAccuracy(params)
local ball = Spam.FetchBall()
if not ball then return 0 end
Spam.Get_Closest()
local accuracy = 0
local vel = ball:FindFirstChild("zoomies") and ball.zoomies.VectorVelocity or
ball.AssemblyLinearVelocity
local spd = vel.Magnitude
local toBall = (LocalPlayer.Character.PrimaryPart.Position -
ball.Position).Unit
local ballDir = vel.Unit
local dot = toBall:Dot(ballDir)
local targetPos = Closest_Entity and Closest_Entity.PrimaryPart.Position or
Vector3.new()
local targetDist = LocalPlayer:DistanceFromCharacter(targetPos)
local maxSpamRange = params.Ping + math.min(spd / 7, 95)
if params.EntityProps.Distance > maxSpamRange then return accuracy end
if params.BallProps.Distance > maxSpamRange then return accuracy end
if targetDist > maxSpamRange then return accuracy end
local maxSpeed = 5 - math.min(spd / 7, 5)
local adjDot = math.clamp(dot, -1, 1) * maxSpeed
accuracy = maxSpamRange - adjDot
return accuracy
end
function Spam.FetchBall()
for _, b in pairs(Workspace.Balls:GetChildren()) do
if b:GetAttribute("realBall") then
b.CanCollide = false
return b
end
end
end
-----------------------------------------------------------
-- Auto Parry Module
-----------------------------------------------------------
local AutoParry = {}
local parryDelay = 0.06
local smoothRadians = 0
local lastStableTime = tick()
local recentVels = {}
local Previous_Velocities = {}
local lastWarping = tick()
function AutoParry.playParryAnimation()
local baseParryAnim =
ReplicatedStore.Shared.SwordAPI.Collection.Default:FindFirstChild("GrabParry")
local currSword = LocalPlayer.Character:GetAttribute("CurrentlyEquippedSword")
if not currSword or not baseParryAnim then return end
local swordInfo =
ReplicatedStore.Shared.ReplicatedInstances.Swords.GetSword:Invoke(currSword)
if not swordInfo or not swordInfo.AnimationType then return end
for _, folder in
pairs(ReplicatedStore.Shared.SwordAPI.Collection:GetChildren()) do
if folder.Name == swordInfo.AnimationType then
local selName = folder:FindFirstChild("Grab") and "Grab" or "GrabParry"
if folder:FindFirstChild(selName) then
baseParryAnim = folder[selName]
end
end
end
parryAnimation =
LocalPlayer.Character.Humanoid.Animator:LoadAnimation(baseParryAnim)
parryAnimation:Play()
end
function AutoParry.fetchBalls()
local balls = {}
for _, b in pairs(Workspace.Balls:GetChildren()) do
if b:GetAttribute("realBall") then
b.CanCollide = false
table.insert(balls, b)
end
end
return balls
end
function AutoParry.Get_Ball()
return Spam.FetchBall() -- Map to Spam.FetchBall
end
function AutoParry.computeParryData(mode)
local eventTable = {}
local cam = Workspace.CurrentCamera
if lastInputType == Enum.UserInputType.MouseButton1 or
lastInputType == Enum.UserInputType.MouseButton2 or
lastInputType == Enum.UserInputType.Keyboard then
local mPos = UserInputService:GetMouseLocation()
currentMousePos = { mPos.X, mPos.Y }
else
currentMousePos = { cam.ViewportSize.X / 2, cam.ViewportSize.Y / 2 }
end
AutoParry.Parry = function(isSpam)
if tick() - lastParryTime < parryCooldown then return false end
lastParryTime = tick()
if getgenv().DeathSlashActive then
getgenv().DeathSlashParryCount = getgenv().DeathSlashParryCount + 1
if getgenv().DeathSlashParryCount >= 35 then
getgenv().DeathSlashActive = false
getgenv().DeathSlashParryCount = 0
stopDeathSlashSpam()
end
end
return true
end
function AutoParry.triggerParry(mode)
if not canProcessParry() then return end
selectedParryMode = mode
AutoParry.Parry(false)
end
-- Anti-Curve Detection
function AutoParry.detectCurve()
local ball = AutoParry.Get_Ball()
if not ball or not LocalPlayer.Character or not
LocalPlayer.Character.PrimaryPart then return false end
local zoom = ball:FindFirstChild("zoomies")
if not zoom then return false end
local totalWeight = 0
local weightedSum = Vector3.new(0, 0, 0)
for i, vel in ipairs(recentVels) do
local weight = i / #recentVels
weightedSum = weightedSum + vel * weight
totalWeight = totalWeight + weight
end
local avgVel = weightedSum / totalWeight
local stabilizationDelay = reachTime / (speed < 300 and 0.9 or speed < 600 and
1.0 or 1.1)
if (tick() - lastStableTime) < math.max(0.03, stabilizationDelay) then
return true
end
if (tick() - lastWarping) < (reachTime / (speed < 300 and 0.9 or 1.1)) then
return true
end
table.insert(Previous_Velocities, currentVel)
if #Previous_Velocities > 10 then
table.remove(Previous_Velocities, 1)
end
if #Previous_Velocities == 10 then
local intendedDiff1 = (ballDir - Previous_Velocities[1].Unit).Unit
local diff1 = dotVal - toBall:Dot(intendedDiff1)
local intendedDiff2 = (ballDir - Previous_Velocities[2].Unit).Unit
local diff2 = toBall:Dot(intendedDiff2)
if diff1 < dotThreshold or diff2 < dotThreshold then
return true
end
end
-----------------------------------------------------------
-- VISUALIZER SETUP
-----------------------------------------------------------
local visualEnabled = false
local visColor = Color3.fromRGB(255, 0, 0) -- Default, no color picker
local function getCharacter()
return LocalPlayer and LocalPlayer.Character
end
local function getPrimaryPart()
local c = getCharacter()
return c and c.PrimaryPart
end
local function getActiveBall()
local ballCont = Workspace:FindFirstChild("Balls")
if ballCont then
for _, b in ipairs(ballCont:GetChildren()) do
if not b.Anchored then
return b
end
end
end
return nil
end
local function computeVisualizerRadius()
local b = getActiveBall()
if b then
local v = b.Velocity.Magnitude
return math.clamp(v / 2.4 + 10, 15, 200)
end
return 15
end
local visPart = Instance.new("Part")
visPart.Shape = Enum.PartType.Ball
visPart.Anchored = true
visPart.CanCollide = false
visPart.Material = Enum.Material.ForceField
visPart.Transparency = 0.5
visPart.CastShadow = false
visPart.Parent = Workspace
visPart.Size = Vector3.new(0, 0, 0)
local function toggleVisualizer(state)
visualEnabled = state
if not state then
visPart.Size = Vector3.new(0, 0, 0)
end
end
RunService.RenderStepped:Connect(function()
if not visualEnabled then return end
local prim = getPrimaryPart()
local b = getActiveBall()
if prim and b then
local rad = computeVisualizerRadius()
visPart.Size = Vector3.new(rad, rad, rad)
visPart.CFrame = prim.CFrame
visPart.Color = visColor
else
visPart.Size = Vector3.new(0, 0, 0)
end
end)
-----------------------------------------------------------
-- MANUAL SPAM SETUP
-----------------------------------------------------------
local screenGui = Instance.new("ScreenGui", CoreGui)
screenGui.Name = "SimpleSpamUI"
screenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
screenGui.Enabled = false
spamButton.MouseButton1Click:Connect(function()
spamming = not spamming
if spamming then
spamButton.Text = "OFF"
spamButton.TextColor3 = Color3.fromRGB(255, 50, 50)
else
spamButton.Text = "ON"
spamButton.TextColor3 = Color3.fromRGB(50, 255, 50)
end
end)
RunService.Heartbeat:Connect(function()
if spamming and manualSpamEnabled then
if tick() - lastParryTime < parryCooldown then return end
lastParryTime = tick()
task.wait(spamRate)
end
end)
-----------------------------------------------------------
-- AI PLAY SETUP
-----------------------------------------------------------
local AIPlaying = false
local AICoroutine = nil
local AITarget = nil
local AICurrentMethod = "Legit"
local AIStuckCheck = {
lastPosition = Vector3.new(),
stuckDuration = 0
}
local AICooldowns = {
jump = 0,
dash = 0,
targetSwitch = 0,
action = 0
}
local AIMethods = {
Legit = function(character)
if not character then
return
end
local humanoid = character:FindFirstChildOfClass("Humanoid")
local primaryPart = character:FindFirstChild("HumanoidRootPart") or
character.PrimaryPart
if not humanoid or not primaryPart then
return
end
local ball = getSafeBall()
local validPlayers = getValidPlayers()
local target = nil
if ball and (math.random() > 0.4 or #validPlayers == 0) then
local predictionTime = 0.5 + (math.random() * 0.3)
target = {
Position = predictPosition(ball.Position, ball.Velocity,
predictionTime),
Type = "Ball"
}
elseif #validPlayers > 0 then
if (AICooldowns.targetSwitch <= 0) or not AITarget then
AITarget = validPlayers[math.random(math.max(1, #validPlayers - 2),
#validPlayers)]
AICooldowns.targetSwitch = 2 + (math.random() * 2)
end
if AITarget and AITarget.PrimaryPart then
local predictionTime = 0.4 + (math.random() * 0.2)
target = {
Position = predictPosition(AITarget.PrimaryPart.Position,
AITarget.Velocity, predictionTime),
Type = "Player"
}
end
end
if target then
local idealDistance = math.random(8, 15)
local toTarget = target.Position - primaryPart.Position
local moveToPos = target.Position - (toTarget.Unit * idealDistance)
local shouldJump = (primaryPart.Position - target.Position).Magnitude <
15 and
target.Position.Y > (primaryPart.Position.Y + 1.5)
and
humanoid.FloorMaterial ~= Enum.Material.Air and
AICooldowns.jump <= 0
if shouldJump then
humanoid.Jump = true
AICooldowns.jump = 0.8 + (math.random() * 0.4)
end
moveToPosition(character, moveToPos, true)
else
local wanderPos = primaryPart.Position + Vector3.new(math.random(-25,
25), 0, math.random(-25, 25))
moveToPosition(character, wanderPos, false)
end
end
}
-----------------------------------------------------------
-- LOAD EXTERNAL LIBRARY AND SETUP UI TABS
-----------------------------------------------------------
local function loadExternalLib(url)
local success, lib = pcall(function() return loadstring(game:HttpGet(url))()
end)
if not success then
warn("Failed to load library from " .. url)
return nil
end
return lib
end
-----------------------------------------------------------
-- MAIN TAB SETUP
-----------------------------------------------------------
mainTab.create_title({ name = "Combat", section = "left" })
mainTab.create_description_toggle({
name = "Auto Parry",
description = "Automatically parries incoming balls",
flag = "pr",
enabled = false,
section = "left",
callback = function(state)
if state then
connManager["Auto Parry"] = RunService.PreSimulation:Connect(function()
local ball = AutoParry.Get_Ball()
local ballList = AutoParry.fetchBalls()
for _, b in ipairs(ballList) do
if not b then repeat task.wait() until b end
local zoom = b:FindFirstChild("zoomies")
if not zoom then return end
b:GetAttributeChangedSignal("target"):Once(function() parryFlag
= false end)
if parryFlag then return end
local ballTarget = b:GetAttribute("target")
local primaryTarget = ball and ball:GetAttribute("target")
local vel = zoom.VectorVelocity
local dist = (LocalPlayer.Character.PrimaryPart.Position -
b.Position).Magnitude
local spd = vel.Magnitude
local ping = Stats.Network.ServerStatsItem["Data
Ping"]:GetValue() / 1000
local parryThresh = (spd / 3.75) + (ping * spd * 0.7)
local curved = AutoParry.detectCurve()
if ballTarget == tostring(LocalPlayer) and
getgenv().AerodynamicActive then
if tick() - (getgenv().AerodynamicTime or 0) >=
(getgenv().AerodynamicDelay or 0.6) then
getgenv().AerodynamicActive = false
end
return
end
if primaryTarget == tostring(LocalPlayer) and curved then
return
end
if ballTarget == tostring(LocalPlayer) and dist <= parryThresh
then
AutoParry.triggerParry(selectedParryMode)
parryFlag = true
end
local lastCycle = tick()
repeat
RunService.PreSimulation:Wait()
until (tick() - lastCycle) >= 1 or not parryFlag
parryFlag = false
end
end)
else
if connManager["Auto Parry"] then
connManager["Auto Parry"]:Disconnect()
connManager["Auto Parry"] = nil
end
end
end
})
mainTab.create_description_toggle({
name = "Auto Spam",
description = "Automatically spams when conditions are met",
flag = "Spams",
enabled = false,
section = "left",
callback = function(state)
if state then
connManager["Auto Spam"] = RunService.Heartbeat:Connect(function()
local Ball = Spam.FetchBall()
if not Ball or not Ball:FindFirstChild("zoomies") then
Spamming = false
return
end
if Spamming then
for _ = 1, spamSpeed do
task.spawn(function()
AutoParry.Parry(false)
end)
end
end
end)
else
local conn = connManager["Auto Spam"]
if conn then conn:Disconnect() end
connManager["Auto Spam"] = nil
Spamming = false
end
end
})
mainTab.create_slider({
name = "Spam Threshold",
flag = "spam_threshold",
section = "right",
value = 0.2,
minimum_value = 0.1,
maximum_value = 5,
callback = function(val)
spamThreshold = value
end
})
mainTab.create_slider({
name = "Auto Spam Speed",
flag = "fps",
section = "right",
value = 150,
minimum_value = 0,
maximum_value = 50,
callback = function(value)
spamSpeed = math.floor(value)
end
})
mainTab.create_dropdown({
name = "Curve Position",
flag = "po",
section = "left",
option = "Custom",
options = {"Custom", "Random", "Backwards", "Straight", "Up", "Right", "Left",
"Dot"},
callback = function(value)
selectedParryMode = value
end
})
mainTab.create_description_toggle({
name = "Tracker",
description = "Shows the parry range",
flag = "Spams",
enabled = false,
section = "left",
callback = function(state)
toggleVisualizer(state)
end
})
mainTab.create_description_toggle({
name = "Manual Spam",
description = "an auto click button.",
flag = "No_Render_Toggle",
enabled = false,
section = "left",
callback = function(state)
manualSpamEnabled = state
screenGui.Enabled = state
if not state then
spamming = false
spamButton.Text = "ON"
spamButton.TextColor3 = Color3.fromRGB(50, 255, 50)
end
end
})
mainTab.create_slider({
name = "Manual Spam Rate",
flag = "fps",
section = "right",
value = 150,
minimum_value = 0,
maximum_value = 10,
callback = function(value)
spamRate = value
end
})