
Key Required

-- Wiggly Stick Controller - Clean Version (No Snake)
local UIS = game:GetService("UserInputService")
local RS = game:GetService("RunService")
local WS = game:GetService("Workspace")
local PS = game:GetService("Players")
local LPlayer = PS.LocalPlayer
local char = LPlayer.Character or LPlayer.CharacterAdded:Wait()
local hum = char:WaitForChild("Humanoid")
local root = char:WaitForChild("HumanoidRootPart")
local parts, active, conn, cf = {}, false, nil, CFrame.new()
local speed, rspeed = 30, math.rad(90)
local dirs = {Forward = 0, Backward = 0, Left = 0, Right = 0, Up = 0, Down = 0}
local rotL, rotR, cycle, moving = false, false, 0, false
local kbd, velConn = false, nil
local wobbliness = 5
local curliness = 0
local stickLength = 200
local targetPlayer = nil
local trackMode = false
local mo = {}
local function rebuildMo()
mo = {}
for seg = 0, stickLength - 1 do
local z = seg * 4
table.insert(mo, {pos = Vector3.new(0, 0, -z), tag = "body"})
end
end
rebuildMo()
local sg = Instance.new("ScreenGui", LPlayer:WaitForChild("PlayerGui"))
sg.Name = "StickController"
sg.ResetOnSpawn = false
sg.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
local mf = Instance.new("Frame", sg)
mf.Size = UDim2.new(0, 280, 0, 440)
mf.Position = UDim2.new(0.5, -140, 0.5, -220)
mf.BackgroundColor3 = Color3.fromRGB(15, 15, 15)
mf.BorderSizePixel = 0
Instance.new("UICorner", mf).CornerRadius = UDim.new(0, 10)
local function btn(t, x, y, w, h, c)
local b = Instance.new("TextButton", mf)
b.Size = UDim2.new(0, w, 0, h); b.Position = UDim2.new(0, x, 0, y); b.BackgroundColor3 = c
b.Text = t; b.Font = Enum.Font.GothamBold; b.TextSize = 10; b.TextColor3 = Color3.fromRGB(255, 255, 255)
Instance.new("UICorner", b).CornerRadius = UDim.new(0, 5); return b
end
local function label(t, x, y, w, h)
local l = Instance.new("TextLabel", mf)
l.Size = UDim2.new(0, w, 0, h); l.Position = UDim2.new(0, x, 0, y)
l.BackgroundTransparency = 1; l.Text = t; l.TextColor3 = Color3.fromRGB(255, 255, 255); l.TextSize = 10; l.Font = Enum.Font.Gotham; return l
end
local tb = btn("SUPER STICK (drag)", 0, 0, 280, 26, Color3.fromRGB(25, 25, 25))
tb.AutoButtonColor = false; tb.TextColor3 = Color3.fromRGB(255, 200, 100); tb.TextSize = 12
local drag, dStart, sPos = false, nil, nil
tb.InputBegan:Connect(function(i) if i.UserInputType == Enum.UserInputType.MouseButton1 then drag = true; dStart = i.Position; sPos = mf.Position end end)
UIS.InputChanged:Connect(function(i) if drag and i.UserInputType == Enum.UserInputType.MouseMovement then local d = i.Position - dStart; mf.Position = UDim2.new(sPos.X.Scale, sPos.X.Offset + d.X, sPos.Y.Scale, sPos.Y.Offset + d.Y) end end)
UIS.InputEnded:Connect(function(i) drag = false end)
local stat = label("Off", 0, 410, 280, 18)
stat.TextColor3 = Color3.fromRGB(180, 180, 180); stat.TextSize = 11
btn("BUILD STICK", 10, 32, 125, 28, Color3.fromRGB(50, 200, 50)).MouseButton1Click:Connect(function()
for _, b in pairs(parts) do if b and b.Parent then b.Velocity = Vector3.zero; b.CanCollide = true end end
table.clear(parts); if conn then conn:Disconnect() end; active = false
rebuildMo()
local fp = {}
for _, p in pairs(WS:GetDescendants()) do
if p:IsA("BasePart") and not p.Anchored and not p:IsDescendantOf(char) and p.Transparency < 0.5 then
local free = true
if next(p:GetJoints()) ~= nil then free = false end
for _, c in pairs(p:GetChildren()) do if c:IsA("JointInstance") or c:IsA("Constraint") then free = false end end
if free then table.insert(fp, {part = p, dist = (p.Position - root.Position).Magnitude}) end
end
end
if #fp == 0 then stat.Text = "No parts found" return end
table.sort(fp, function(a, b) return a.dist < b.dist end)
for i = 1, math.min(#mo, #fp) do table.insert(parts, fp[i].part) end
cf = root.CFrame * CFrame.new(0, 5, 20); cycle = 0; moving = false
posStick(); active = true; stat.Text = "Stick: " .. #parts .. " parts"
conn = RS.Heartbeat:Connect(function(dt)
if not active then return end
if kbd then root.CFrame = CFrame.new(cf.Position + cf:VectorToWorldSpace(Vector3.new(0, 10, 0))) end
if trackMode and targetPlayer and targetPlayer.Character and targetPlayer.Character:FindFirstChild("HumanoidRootPart") then
local targetPos = targetPlayer.Character.HumanoidRootPart.Position
local direction = (targetPos - cf.Position).Unit
local targetCF = CFrame.lookAt(cf.Position, cf.Position + direction)
cf = cf:Lerp(targetCF, math.min(1, dt * speed / 16))
end
local mv = Vector3.new(dirs.Right - dirs.Left, dirs.Up - dirs.Down, dirs.Backward - dirs.Forward)
moving = mv.Magnitude > 0
if moving then cf += cf:VectorToWorldSpace(mv.Unit) * speed * dt; cycle += dt * 3
else cycle += dt * 1 end
if rotL then cf *= CFrame.Angles(0, rspeed * dt, 0) end
if rotR then cf *= CFrame.Angles(0, -rspeed * dt, 0) end
posStick()
end)
end)
btn("DESTROY", 145, 32, 125, 28, Color3.fromRGB(255, 80, 80)).MouseButton1Click:Connect(function()
active = false; if conn then conn:Disconnect() end
for _, b in pairs(parts) do if b and b.Parent then b.Velocity = Vector3.zero; b.CanCollide = true; for _, v in pairs(b:GetChildren()) do if v:IsA("BodyMover") then v:Destroy() end end end end
stat.Text = "Off"
end)
local kbdBtn = btn("KEYBOARD: OFF", 10, 66, 260, 26, Color3.fromRGB(100, 100, 100))
kbdBtn.MouseButton1Click:Connect(function()
kbd = not kbd
if kbd then kbdBtn.Text = "KEYBOARD: ON (WASD/QE/ZX)"; kbdBtn.BackgroundColor3 = Color3.fromRGB(50, 200, 50)
else kbdBtn.Text = "KEYBOARD: OFF"; kbdBtn.BackgroundColor3 = Color3.fromRGB(100, 100, 100)
if velConn then velConn:Disconnect() end
local et = tick() + 5; velConn = RS.Heartbeat:Connect(function() if tick() >= et then velConn:Disconnect() return end; root.Velocity = Vector3.zero; root.RotVelocity = Vector3.zero end)
end
end)
local function dirBtn(t, x, y, c, dir)
local b = btn(t, x, y, 40, 28, c)
b.TextSize = 12
b.MouseButton1Down:Connect(function() dirs[dir] = 1 end)
b.MouseButton1Up:Connect(function() dirs[dir] = 0 end)
b.MouseLeave:Connect(function() dirs[dir] = 0 end)
end
dirBtn("W", 110, 100, Color3.fromRGB(255, 200, 50), "Forward")
dirBtn("S", 110, 132, Color3.fromRGB(255, 200, 50), "Backward")
dirBtn("A", 65, 116, Color3.fromRGB(255, 100, 100), "Left")
dirBtn("D", 155, 116, Color3.fromRGB(255, 100, 100), "Right")
dirBtn("E", 200, 100, Color3.fromRGB(100, 200, 255), "Up")
dirBtn("Q", 200, 132, Color3.fromRGB(100, 200, 255), "Down")
local zBtn = btn("Z", 15, 100, 40, 28, Color3.fromRGB(200, 150, 255))
zBtn.MouseButton1Down:Connect(function() rotL = true end)
zBtn.MouseButton1Up:Connect(function() rotL = false end)
zBtn.MouseLeave:Connect(function() rotL = false end)
local xBtn = btn("X", 15, 132, 40, 28, Color3.fromRGB(200, 150, 255))
xBtn.MouseButton1Down:Connect(function() rotR = true end)
xBtn.MouseButton1Up:Connect(function() rotR = false end)
xBtn.MouseLeave:Connect(function() rotR = false end)
label("Target Player:", 10, 170, 100, 18)
local targetLabel = label("None", 100, 170, 160, 18)
targetLabel.TextColor3 = Color3.fromRGB(255, 200, 50)
local playerList = Instance.new("ScrollingFrame", mf)
playerList.Size = UDim2.new(0, 260, 0, 60)
playerList.Position = UDim2.new(0, 10, 0, 190)
playerList.BackgroundColor3 = Color3.fromRGB(25, 25, 25)
playerList.BorderSizePixel = 0; playerList.ScrollBarThickness = 4
playerList.CanvasSize = UDim2.new(0, 0, 0, 0)
Instance.new("UICorner", playerList).CornerRadius = UDim.new(0, 5)
local function refreshPlayerList()
for _, child in pairs(playerList:GetChildren()) do if child:IsA("TextButton") then child:Destroy() end end
local y = 0
for _, pl in pairs(PS:GetPlayers()) do
if pl ~= LPlayer then
local plBtn = Instance.new("TextButton", playerList)
plBtn.Size = UDim2.new(1, -8, 0, 20); plBtn.Position = UDim2.new(0, 4, 0, y)
plBtn.BackgroundColor3 = Color3.fromRGB(50, 50, 50); plBtn.Text = pl.Name
plBtn.Font = Enum.Font.Gotham; plBtn.TextSize = 9; plBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
plBtn.BorderSizePixel = 0; Instance.new("UICorner", plBtn).CornerRadius = UDim.new(0, 3)
plBtn.MouseButton1Click:Connect(function()
targetPlayer = pl; targetLabel.Text = pl.Name
for _, c in pairs(playerList:GetChildren()) do if c:IsA("TextButton") then c.BackgroundColor3 = Color3.fromRGB(50, 50, 50) end end
plBtn.BackgroundColor3 = Color3.fromRGB(200, 50, 50)
end)
y = y + 22
end
end
playerList.CanvasSize = UDim2.new(0, 0, 0, y)
end
local refreshBtn = btn("↻", 220, 168, 50, 20, Color3.fromRGB(100, 100, 100))
refreshBtn.MouseButton1Click:Connect(refreshPlayerList)
refreshPlayerList()
local trackBtn = btn("TRACK: OFF", 10, 256, 260, 26, Color3.fromRGB(100, 100, 100))
trackBtn.MouseButton1Click:Connect(function()
trackMode = not trackMode
if trackMode then trackBtn.Text = "TRACK: ON"; trackBtn.BackgroundColor3 = Color3.fromRGB(200, 50, 50)
else trackBtn.Text = "TRACK: OFF"; trackBtn.BackgroundColor3 = Color3.fromRGB(100, 100, 100) end
end)
local sLabel = label("Speed: 30", 10, 292, 100, 18)
local sBox = Instance.new("TextBox", mf)
sBox.Size = UDim2.new(0, 50, 0, 20); sBox.Position = UDim2.new(0, 100, 0, 291)
sBox.BackgroundColor3 = Color3.fromRGB(40, 40, 40); sBox.TextColor3 = Color3.fromRGB(255, 255, 255)
sBox.Text = "30"; sBox.Font = Enum.Font.Gotham; sBox.TextSize = 10; sBox.BorderSizePixel = 0
Instance.new("UICorner", sBox).CornerRadius = UDim.new(0, 4)
btn("SET", 155, 290, 50, 22, Color3.fromRGB(100, 200, 100)).MouseButton1Click:Connect(function()
local n = tonumber(sBox.Text); if n and n > 0 then speed = n; sLabel.Text = "Speed: " .. n end
end)
local wLabel = label("Wobbliness: 5", 10, 320, 140, 18)
local wBox = Instance.new("TextBox", mf)
wBox.Size = UDim2.new(0, 50, 0, 20); wBox.Position = UDim2.new(0, 100, 0, 319)
wBox.BackgroundColor3 = Color3.fromRGB(40, 40, 40); wBox.TextColor3 = Color3.fromRGB(255, 255, 255)
wBox.Text = "5"; wBox.Font = Enum.Font.Gotham; wBox.TextSize = 10; wBox.BorderSizePixel = 0
Instance.new("UICorner", wBox).CornerRadius = UDim.new(0, 4)
btn("SET W", 155, 318, 50, 22, Color3.fromRGB(150, 100, 255)).MouseButton1Click:Connect(function()
local n = tonumber(wBox.Text); if n then wobbliness = n; wLabel.Text = "Wobbliness: " .. n end
end)
local curlLabel = label("Curliness: 0", 10, 348, 140, 18)
local curlBox = Instance.new("TextBox", mf)
curlBox.Size = UDim2.new(0, 50, 0, 20); curlBox.Position = UDim2.new(0, 100, 0, 347)
curlBox.BackgroundColor3 = Color3.fromRGB(40, 40, 40); curlBox.TextColor3 = Color3.fromRGB(255, 255, 255)
curlBox.Text = "0"; curlBox.Font = Enum.Font.Gotham; curlBox.TextSize = 10; curlBox.BorderSizePixel = 0
Instance.new("UICorner", curlBox).CornerRadius = UDim.new(0, 4)
btn("SET C", 155, 346, 50, 22, Color3.fromRGB(255, 100, 200)).MouseButton1Click:Connect(function()
local n = tonumber(curlBox.Text); if n then curliness = n; curlLabel.Text = "Curliness: " .. n end
end)
local lLabel = label("Length: 200", 10, 376, 140, 18)
local lBox = Instance.new("TextBox", mf)
lBox.Size = UDim2.new(0, 50, 0, 20); lBox.Position = UDim2.new(0, 100, 0, 375)
lBox.BackgroundColor3 = Color3.fromRGB(40, 40, 40); lBox.TextColor3 = Color3.fromRGB(255, 255, 255)
lBox.Text = "200"; lBox.Font = Enum.Font.Gotham; lBox.TextSize = 10; lBox.BorderSizePixel = 0
Instance.new("UICorner", lBox).CornerRadius = UDim.new(0, 4)
btn("SET L", 155, 374, 50, 22, Color3.fromRGB(255, 200, 50)).MouseButton1Click:Connect(function()
local n = tonumber(lBox.Text); if n and n > 0 then stickLength = n; lLabel.Text = "Length: " .. n end
end)
UIS.InputBegan:Connect(function(i, p)
if p or not kbd then return end
if i.KeyCode == Enum.KeyCode.W then dirs.Forward = 1 elseif i.KeyCode == Enum.KeyCode.S then dirs.Backward = 1
elseif i.KeyCode == Enum.KeyCode.A then dirs.Left = 1 elseif i.KeyCode == Enum.KeyCode.D then dirs.Right = 1
elseif i.KeyCode == Enum.KeyCode.E then dirs.Up = 1 elseif i.KeyCode == Enum.KeyCode.Q then dirs.Down = 1
elseif i.KeyCode == Enum.KeyCode.Z then rotL = true elseif i.KeyCode == Enum.KeyCode.X then rotR = true end
end)
UIS.InputEnded:Connect(function(i, p)
if p or not kbd then return end
if i.KeyCode == Enum.KeyCode.W then dirs.Forward = 0 elseif i.KeyCode == Enum.KeyCode.S then dirs.Backward = 0
elseif i.KeyCode == Enum.KeyCode.A then dirs.Left = 0 elseif i.KeyCode == Enum.KeyCode.D then dirs.Right = 0
elseif i.KeyCode == Enum.KeyCode.E then dirs.Up = 0 elseif i.KeyCode == Enum.KeyCode.Q then dirs.Down = 0
elseif i.KeyCode == Enum.KeyCode.Z then rotL = false elseif i.KeyCode == Enum.KeyCode.X then rotR = false end
end)
function posStick()
if not active then return end
local bi = 1
for _, d in pairs(mo) do
if bi > #parts then break end
local b = parts[bi]
if b and b.Parent then
for _, v in pairs(b:GetChildren()) do if v:IsA("BodyMover") then v:Destroy() end end
b.RotVelocity = Vector3.zero; b.CanCollide = false; b.Anchored = false
local o = d.pos
local waveX = math.sin(cycle * 2 + o.Z * 0.03) * (moving and wobbliness * 1.6 or wobbliness * 0.6)
local waveY = math.sin(cycle * 1.5 + o.Z * 0.02) * (wobbliness * 0.4)
local curlX = math.cos(cycle * 2 + o.Z * 0.02 * curliness) * (wobbliness * 0.8)
local curlY = math.sin(cycle * 2 + o.Z * 0.02 * curliness) * (wobbliness * 0.8)
b.CFrame = cf * CFrame.new(o + Vector3.new(waveX + curlX, waveY + curlY, 0))
end
bi = bi + 1
end
end
LPlayer.CharacterAdded:Connect(function(c)
char = c; hum = char:WaitForChild("Humanoid"); root = char:WaitForChild("HumanoidRootPart")
sg.Parent = LPlayer:WaitForChild("PlayerGui"); active = false; if conn then conn:Disconnect() end; table.clear(parts)
end)
stik