
KeylessUniversal

-- SERVICES
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local Workspace = game:GetService("Workspace")
-- REFERENCES
local LocalPlayer = Players.LocalPlayer
local Camera = Workspace.CurrentCamera
-- CREATE GUI
local ScreenGui = Instance.new("ScreenGui", LocalPlayer:WaitForChild("PlayerGui"))
ScreenGui.Name = "WallhopUI"
ScreenGui.ResetOnSpawn = false
local Frame = Instance.new("Frame", ScreenGui)
Frame.Size = UDim2.new(0, 200, 0, 200)
Frame.Position = UDim2.new(0.5, -100, 0.5, -100)
Frame.BackgroundColor3 = Color3.new(1, 1, 1)
Frame.Active = true
Frame.Draggable = true
local Button = Instance.new("TextButton", Frame)
Button.Size = UDim2.new(1, -20, 0, 50)
Button.Position = UDim2.new(0, 10, 0, 10)
Button.Text = "Wallhop OFF ❌"
Button.Font = Enum.Font.SourceSansBold
Button.TextSize = 22
Button.BackgroundColor3 = Color3.fromRGB(230, 230, 230)
Button.TextColor3 = Color3.fromRGB(255, 0, 0)
-- STATE VARIABLES
local wallhopEnabled = false
local lastCamX = Camera.CFrame.LookVector.X
local jumpCooldown = 0
-- TOGGLE BUTTON
Button.MouseButton1Click:Connect(function()
wallhopEnabled = not wallhopEnabled
if wallhopEnabled then
Button.Text = "Wallhop ON ✅"
Button.TextColor3 = Color3.fromRGB(0, 255, 0)
else
Button.Text = "Wallhop OFF ❌"
Button.TextColor3 = Color3.fromRGB(255, 0, 0)
end
end)
-- JUMP FUNCTION
local function forceJump()
local char = LocalPlayer.Character
if not char then return end
local humanoid = char:FindFirstChildOfClass("Humanoid")
if humanoid and humanoid:GetState() ~= Enum.HumanoidStateType.Seated then
humanoid:ChangeState(Enum.HumanoidStateType.Jumping)
end
end
-- WALL DETECTION
local function isNearWall()
local char = LocalPlayer.Character
if not char then return false end
local root = char:FindFirstChild("HumanoidRootPart")
if not root then return false end
local rayParams = RaycastParams.new()
rayParams.FilterDescendantsInstances = {char}
rayParams.FilterType = Enum.RaycastFilterType.Blacklist
local direction = root.CFrame.LookVector * 3
local result = Workspace:Raycast(root.Position, direction, rayParams)
return result and result.Instance and result.Instance.CanCollide and result.Instance:IsA("BasePart")
end
-- RAINBOW COLOR FUNCTION
local function hsvToRgb(h, s, v)
local r, g, b
local i = math.floor(h * 6)
local f = h * 6 - i
local p = v * (1 - s)
local q = v * (1 - f * s)
local t = v * (1 - (1 - f) * s)
i = i % 6
if i == 0 then r, g, b = v, t, p
elseif i == 1 then r, g, b = q, v, p
elseif i == 2 then r, g, b = p, v, t
elseif i == 3 then r, g, b = p, q, v
elseif i == 4 then r, g, b = t, p, v
elseif i == 5 then r, g, b = v, p, q end
return Color3.new(r, g, b)
end
-- MAIN LOOP
local hue = 0
RunService.RenderStepped:Connect(function(dt)
-- Rainbow background
hue = (hue + 0.005) % 1
Frame.BackgroundColor3 = hsvToRgb(hue, 1, 1)
if not wallhopEnabled then return end
if tick() < jumpCooldown then return end
local currentCamX = Camera.CFrame.LookVector.X
local camDiff = currentCamX - lastCamX
lastCamX = currentCamX
local char = LocalPlayer.Character
if not char then return end
-- Only do if turning hard right and near wall
if camDiff > 0.15 and isNearWall() then
jumpCooldown = tick() + 0.05 -- 20 jumps per second max
forceJump()
end
end)



ai