-- https://discord.gg/JGDAWjhWzp join for a full script with reanim (mic up & mic up 18+ more support for reanim coming soon) -- scriptblox could i pretty pls get verifyed for open srcs pretty plssssss local UIS = game:GetService("UserInputService") local RunService = game:GetService("RunService") local Players = game:GetService("Players") local HttpService = game:GetService("HttpService") local VirtualInputManager = game:GetService("VirtualInputManager") local camera = workspace.CurrentCamera local player = Players.LocalPlayer if not mousemoverel then warn("mousemoverel unavailable") return end local G = (getgenv and getgenv()) or _G if G.__AimScript and G.__AimScript.kill then pcall(G.__AimScript.kill) end G.__AimScript = { conns = {}, gui = nil } local function track(c) table.insert(G.__AimScript.conns, c) return c end G.__AimScript.kill = function() for _, c in ipairs(G.__AimScript.conns) do pcall(function() c:Disconnect() end) end G.__AimScript.conns = {} if G.__AimScript.gui then pcall(function() G.__AimScript.gui:Destroy() end) G.__AimScript.gui = nil end end local CONFIG_FILE = "aimbotconfig.json" local C = { enabled = true, aimKey = Enum.KeyCode.E, gainFar = 0.28, gainClose = 0.52, closePx = 70, smooth = 0.42, response = 11, maxStep = 55, reaction = 0.08, wiggle = 1.8, wiggleSpeed = 5.5, stopChance = 0.012, stopDuration = 0.045, overshootChance = 0.25, overshootMin = 55, overshootScale = 1.10, curveRadius = 20, trigEnabled = true, trigMode = "Hold", trigRadius = 28, trigDelay = 0.02, trigCps = 12, trigHoldOnlyAim = true, smoothSwitch = false, smoothA = 0.35, smoothB = 0.70, smoothC = 1.20, switchMin = 0.4, switchMax = 1.8, } local aiming = false local accX, accY = 0, 0 local stepX, stepY = 0, 0 local startT = 0 local phase = 0 local doOvershoot = false local overshootDone = false local lastTarget = nil local stopUntil = 0 local wiggleX, wiggleY = 0, 0 local trigHolding = false local nextClick = 0 local trigStart = 0 -- smooth switch state local activeSmooth = C.smooth local nextSwitchAt = 0 local lastSmoothIdx = 0 local function parts() local out = {} local maps = workspace:FindFirstChild("Maps") if not maps then return out end for _, mf in ipairs(maps:GetChildren()) do local tf = mf:FindFirstChild("Targets") if tf then for _, t in ipairs(tf:GetChildren()) do local p = t:FindFirstChild("Primary") if p and p:IsA("BasePart") then table.insert(out, p) end end end end return out end local function closest(list) local center = camera.ViewportSize * 0.5 local best, bestD = nil, math.huge for _, p in ipairs(list) do local sp, on = camera:WorldToViewportPoint(p.Position) if on and sp.Z > 0 then local d = (Vector2.new(sp.X, sp.Y) - center).Magnitude if d < bestD then bestD, best = d, p end end end return best, bestD end local function mouseDown() pcall(function() VirtualInputManager:SendMouseButtonEvent(0, 0, 0, true, game, 1) end) end local function mouseUp() pcall(function() VirtualInputManager:SendMouseButtonEvent(0, 0, 0, false, game, 1) end) end local function clickOnce() mouseDown() task.delay(0.02, mouseUp) end -- config save local function serialize() local t = {} for k, v in pairs(C) do if typeof(v) == "EnumItem" then t[k] = { __enum = tostring(v.EnumType), name = v.Name } else t[k] = v end end return HttpService:JSONEncode(t) end local function applyConfig(data) if type(data) ~= "table" then return end for k, v in pairs(data) do if C[k] ~= nil then if type(v) == "table" and v.__enum and v.name then local ok, ev = pcall(function() return Enum[v.__enum][v.name] end) if ok and ev then C[k] = ev end else C[k] = v end end end activeSmooth = C.smooth end local function saveConfig() local ok, err = pcall(function() if writefile then writefile(CONFIG_FILE, serialize()) else G.__AimConfigSave = serialize() end end) if ok then print("config saved") else warn("ave failed:", err) end end local function loadConfig() local ok, raw = pcall(function() if isfile and isfile(CONFIG_FILE) and readfile then return readfile(CONFIG_FILE) elseif G.__AimConfigSave then return G.__AimConfigSave end return nil end) if not ok or not raw or raw == "" then print("no config found") return false end local ok2, data = pcall(function() return HttpService:JSONDecode(raw) end) if not ok2 or type(data) ~= "table" then warn("config corrupt") return false end applyConfig(data) print("config loaded") return true end local function startAim() if not C.enabled then return end aiming = true accX, accY = 0, 0 stepX, stepY = 0, 0 startT = os.clock() phase = math.random() * 100 doOvershoot = math.random() < C.overshootChance overshootDone = false lastTarget = nil stopUntil = 0 wiggleX, wiggleY = 0, 0 trigStart = os.clock() activeSmooth = C.smoothSwitch and C.smoothA or C.smooth nextSwitchAt = os.clock() + C.switchMin + math.random() * math.max(C.switchMax - C.switchMin, 0) lastSmoothIdx = 1 end local function stopAim() aiming = false accX, accY = 0, 0 stepX, stepY = 0, 0 lastTarget = nil if trigHolding then mouseUp() trigHolding = false end end local function pickRandomSmooth() local vals = { C.smoothA, C.smoothB, C.smoothC } -- random index, prefer not same as last (but allow if only one) local idx = math.random(1, 3) if idx == lastSmoothIdx then idx = (idx % 3) + 1 -- 50% chance still allow same for true randomness if math.random() < 0.5 then idx = math.random(1, 3) end end lastSmoothIdx = idx return vals[idx], idx end -- UI local function corner(parent, r) local c = Instance.new("UICorner") c.CornerRadius = UDim.new(0, r or 6) c.Parent = parent return c end local function pad(parent, t, b, l, r) local p = Instance.new("UIPadding") p.PaddingTop = UDim.new(0, t or 0) p.PaddingBottom = UDim.new(0, b or 0) p.PaddingLeft = UDim.new(0, l or 0) p.PaddingRight = UDim.new(0, r or 0) p.Parent = parent end local gui = Instance.new("ScreenGui") gui.Name = "AimbotUI" gui.ResetOnSpawn = false gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling gui.Parent = player:WaitForChild("PlayerGui") G.__AimScript.gui = gui local frame = Instance.new("Frame") frame.Name = "Main" frame.Size = UDim2.fromOffset(300, 520) frame.Position = UDim2.new(0, 20, 0.5, -260) frame.BackgroundColor3 = Color3.fromRGB(22, 22, 28) frame.BorderSizePixel = 0 frame.Active = true frame.Draggable = true frame.Parent = gui corner(frame, 10) local title = Instance.new("TextLabel") title.Size = UDim2.new(1, -40, 0, 36) title.Position = UDim2.fromOffset(12, 6) title.BackgroundTransparency = 1 title.Font = Enum.Font.GothamBold title.TextSize = 16 title.TextColor3 = Color3.fromRGB(230, 230, 240) title.TextXAlignment = Enum.TextXAlignment.Left title.Text = "aimbot · hold E" title.Parent = frame local hideBtn = Instance.new("TextButton") hideBtn.Size = UDim2.fromOffset(28, 28) hideBtn.Position = UDim2.new(1, -34, 0, 8) hideBtn.BackgroundColor3 = Color3.fromRGB(40, 40, 50) hideBtn.Text = "–" hideBtn.TextColor3 = Color3.fromRGB(200, 200, 210) hideBtn.Font = Enum.Font.GothamBold hideBtn.TextSize = 18 hideBtn.Parent = frame corner(hideBtn, 6) local body = Instance.new("ScrollingFrame") body.Size = UDim2.new(1, -16, 1, -48) body.Position = UDim2.fromOffset(8, 42) body.BackgroundTransparency = 1 body.BorderSizePixel = 0 body.ScrollBarThickness = 4 body.CanvasSize = UDim2.fromOffset(0, 1100) body.Parent = frame local layout = Instance.new("UIListLayout") layout.Padding = UDim.new(0, 8) layout.Parent = body pad(body, 4, 8, 4, 4) -- slider refs so config load can refresh labels local sliderRefresh = {} local function addToggle(name, key) local row = Instance.new("Frame") row.Size = UDim2.new(1, -8, 0, 32) row.BackgroundColor3 = Color3.fromRGB(32, 32, 40) row.BorderSizePixel = 0 row.Parent = body corner(row, 6) local lbl = Instance.new("TextLabel") lbl.Size = UDim2.new(1, -50, 1, 0) lbl.Position = UDim2.fromOffset(10, 0) lbl.BackgroundTransparency = 1 lbl.Font = Enum.Font.Gotham lbl.TextSize = 13 lbl.TextColor3 = Color3.fromRGB(210, 210, 220) lbl.TextXAlignment = Enum.TextXAlignment.Left lbl.Text = name lbl.Parent = row local btn = Instance.new("TextButton") btn.Size = UDim2.fromOffset(36, 20) btn.Position = UDim2.new(1, -44, 0.5, -10) btn.BackgroundColor3 = C[key] and Color3.fromRGB(80, 180, 120) or Color3.fromRGB(60, 60, 70) btn.Text = C[key] and "ON" or "OFF" btn.TextColor3 = Color3.fromRGB(255, 255, 255) btn.Font = Enum.Font.GothamBold btn.TextSize = 11 btn.Parent = row corner(btn, 4) local function sync() btn.Text = C[key] and "ON" or "OFF" btn.BackgroundColor3 = C[key] and Color3.fromRGB(80, 180, 120) or Color3.fromRGB(60, 60, 70) end sliderRefresh[key] = sync btn.MouseButton1Click:Connect(function() C[key] = not C[key] sync() if key == "enabled" and not C.enabled then stopAim() end if key == "trigEnabled" and not C.trigEnabled and trigHolding then mouseUp() trigHolding = false end if key == "smoothSwitch" then activeSmooth = C.smoothSwitch and C.smoothA or C.smooth end end) end local function addSlider(name, key, minV, maxV, decimals) decimals = decimals or 2 local row = Instance.new("Frame") row.Size = UDim2.new(1, -8, 0, 52) row.BackgroundColor3 = Color3.fromRGB(32, 32, 40) row.BorderSizePixel = 0 row.Parent = body corner(row, 6) local lbl = Instance.new("TextLabel") lbl.Size = UDim2.new(1, -16, 0, 20) lbl.Position = UDim2.fromOffset(10, 4) lbl.BackgroundTransparency = 1 lbl.Font = Enum.Font.Gotham lbl.TextSize = 12 lbl.TextColor3 = Color3.fromRGB(210, 210, 220) lbl.TextXAlignment = Enum.TextXAlignment.Left lbl.Parent = row local function fmt(v) if decimals <= 0 then return tostring(math.floor(v + 0.5)) end local m = 10 ^ decimals return string.format("%." .. decimals .. "f", math.floor(v * m + 0.5) / m) end local bar = Instance.new("Frame") bar.Size = UDim2.new(1, -20, 0, 8) bar.Position = UDim2.fromOffset(10, 32) bar.BackgroundColor3 = Color3.fromRGB(50, 50, 62) bar.BorderSizePixel = 0 bar.Parent = row corner(bar, 4) local fill = Instance.new("Frame") fill.BackgroundColor3 = Color3.fromRGB(120, 140, 255) fill.BorderSizePixel = 0 fill.Parent = bar corner(fill, 4) local function refresh() local v = C[key] lbl.Text = name .. " " .. fmt(v) local rel = math.clamp((v - minV) / math.max(maxV - minV, 1e-6), 0, 1) fill.Size = UDim2.new(rel, 0, 1, 0) end refresh() sliderRefresh[key] = refresh local dragging = false local function setFromX(x) local rel = math.clamp((x - bar.AbsolutePosition.X) / math.max(bar.AbsoluteSize.X, 1), 0, 1) C[key] = minV + (maxV - minV) * rel refresh() end bar.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = true setFromX(input.Position.X) end end) track(UIS.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = false end end)) track(UIS.InputChanged:Connect(function(input) if dragging and input.UserInputType == Enum.UserInputType.MouseMovement then setFromX(input.Position.X) end end)) end local function addDropdown(name, key, options) local row = Instance.new("Frame") row.Size = UDim2.new(1, -8, 0, 32) row.BackgroundColor3 = Color3.fromRGB(32, 32, 40) row.BorderSizePixel = 0 row.Parent = body corner(row, 6) local lbl = Instance.new("TextLabel") lbl.Size = UDim2.new(0.45, 0, 1, 0) lbl.Position = UDim2.fromOffset(10, 0) lbl.BackgroundTransparency = 1 lbl.Font = Enum.Font.Gotham lbl.TextSize = 13 lbl.TextColor3 = Color3.fromRGB(210, 210, 220) lbl.TextXAlignment = Enum.TextXAlignment.Left lbl.Text = name lbl.Parent = row local btn = Instance.new("TextButton") btn.Size = UDim2.new(0.48, -8, 0, 22) btn.Position = UDim2.new(0.5, 0, 0.5, -11) btn.BackgroundColor3 = Color3.fromRGB(50, 55, 75) btn.Text = tostring(C[key]) btn.TextColor3 = Color3.fromRGB(255, 255, 255) btn.Font = Enum.Font.GothamBold btn.TextSize = 12 btn.Parent = row corner(btn, 4) local idx = 1 for i, o in ipairs(options) do if o == C[key] then idx = i break end end local function sync() btn.Text = tostring(C[key]) for i, o in ipairs(options) do if o == C[key] then idx = i break end end end sliderRefresh[key] = sync btn.MouseButton1Click:Connect(function() idx = idx % #options + 1 C[key] = options[idx] btn.Text = options[idx] if C[key] ~= "Hold" and trigHolding then mouseUp() trigHolding = false end end) end local function addSection(text) local row = Instance.new("TextLabel") row.Size = UDim2.new(1, -8, 0, 22) row.BackgroundTransparency = 1 row.Font = Enum.Font.GothamBold row.TextSize = 12 row.TextColor3 = Color3.fromRGB(140, 150, 200) row.TextXAlignment = Enum.TextXAlignment.Left row.Text = text row.Parent = body end local function addButton(name, fn) local row = Instance.new("TextButton") row.Size = UDim2.new(1, -8, 0, 32) row.BackgroundColor3 = Color3.fromRGB(45, 50, 70) row.BorderSizePixel = 0 row.Font = Enum.Font.GothamBold row.TextSize = 13 row.TextColor3 = Color3.fromRGB(230, 230, 240) row.Text = name row.Parent = body corner(row, 6) row.MouseButton1Click:Connect(fn) end local function refreshAllUI() for _, fn in pairs(sliderRefresh) do pcall(fn) end end addSection("AIM") addToggle("Aim enabled", "enabled") addSlider("Gain far", "gainFar", 0.08, 0.6, 2) addSlider("Gain close", "gainClose", 0.15, 0.85, 2) addSlider("Smooth (base)", "smooth", 0.15, 2.0, 2) addSlider("Response", "response", 4, 30, 0) addSlider("Max step", "maxStep", 20, 120, 0) addSlider("Wiggle", "wiggle", 0, 10, 1) addSlider("Wiggle speed", "wiggleSpeed", 1, 12, 1) addSlider("Stop chance", "stopChance", 0, 0.05, 3) addSlider("Curve radius", "curveRadius", 8, 40, 0) addSection("SMOOTHNESS SWITCH") addToggle("Smooth switch", "smoothSwitch") addSlider("Smooth value 1", "smoothA", 0.15, 2.0, 2) addSlider("Smooth value 2", "smoothB", 0.15, 2.0, 2) addSlider("Smooth value 3", "smoothC", 0.15, 2.0, 2) addSlider("Switch min (s)", "switchMin", 0.1, 3, 2) addSlider("Switch max (s)", "switchMax", 0.2, 5, 2) addSection("TRIGGERBOT") addToggle("Trigger enabled", "trigEnabled") addDropdown("Mode", "trigMode", { "Hold", "Fast Click" }) addSlider("Trigger radius", "trigRadius", 8, 60, 0) addSlider("Trigger delay", "trigDelay", 0, 0.15, 3) addSlider("Fast CPS", "trigCps", 4, 20, 0) addToggle("Only while aiming", "trigHoldOnlyAim") addSection("CONFIG") addButton("Save config", function() saveConfig() end) addButton("Load config", function() if loadConfig() then refreshAllUI() activeSmooth = C.smoothSwitch and C.smoothA or C.smooth end end) -- auto-load on start task.defer(function() if loadConfig() then refreshAllUI() activeSmooth = C.smoothSwitch and C.smoothA or C.smooth end end) local collapsed = false hideBtn.MouseButton1Click:Connect(function() collapsed = not collapsed if collapsed then body.Visible = false frame.Size = UDim2.fromOffset(300, 44) hideBtn.Text = "+" else body.Visible = true frame.Size = UDim2.fromOffset(300, 520) hideBtn.Text = "–" end end) track(UIS.InputBegan:Connect(function(input) if input.KeyCode == Enum.KeyCode.RightShift then frame.Visible = not frame.Visible end end)) track(UIS.InputBegan:Connect(function(input, gp) if gp then return end if input.KeyCode == C.aimKey then startAim() end end)) track(UIS.InputEnded:Connect(function(input) if input.KeyCode == C.aimKey then stopAim() end end)) track(RunService.RenderStepped:Connect(function(dt) local want = C.enabled and UIS:IsKeyDown(C.aimKey) if want and not aiming then startAim() elseif not want and aiming then stopAim() end dt = math.clamp(dt, 1 / 240, 1 / 20) local now = os.clock() local center = camera.ViewportSize * 0.5 local plist = parts() local target, dist = closest(plist) dist = dist or math.huge -- random smoothness switch (not sequential) if C.smoothSwitch and aiming and now >= nextSwitchAt then local val = pickRandomSmooth() activeSmooth = val local span = math.max(C.switchMax - C.switchMin, 0.05) nextSwitchAt = now + C.switchMin + math.random() * span elseif not C.smoothSwitch then activeSmooth = C.smooth end if aiming and now - startT >= C.reaction and target then if now < stopUntil then stepX, stepY = stepX * 0.3, stepY * 0.3 elseif math.random() < C.stopChance then stopUntil = now + C.stopDuration * (0.7 + math.random() * 0.6) end if target ~= lastTarget then lastTarget = target doOvershoot = math.random() < C.overshootChance overshootDone = false phase = math.random() * 100 end local sp, on = camera:WorldToViewportPoint(target.Position) if on and sp.Z > 0 then local dx = sp.X - center.X local dy = sp.Y - center.Y dist = math.sqrt(dx * dx + dy * dy) local t = now - startT local ws = C.wiggleSpeed local w = C.wiggle local targetWX = (math.sin(t * ws + phase) + math.sin(t * ws * 0.37 + phase * 2.1) * 0.55 + math.sin(t * ws * 1.7 + phase * 0.5) * 0.25) * w local targetWY = (math.cos(t * ws * 0.9 + phase * 1.3) + math.sin(t * ws * 0.51 + phase * 0.7) * 0.55 + math.cos(t * ws * 1.4 + phase) * 0.25) * w wiggleX = wiggleX + (targetWX - wiggleX) * math.clamp(dt * 8, 0, 1) wiggleY = wiggleY + (targetWY - wiggleY) * math.clamp(dt * 8, 0, 1) local blend = math.clamp(1 - (dist / math.max(C.closePx, 1)), 0, 1) blend = blend * blend local gain = C.gainFar + (C.gainClose - C.gainFar) * blend if doOvershoot and not overshootDone and dist >= C.overshootMin then gain = gain * C.overshootScale if dist < C.overshootMin * 0.6 then overshootDone = true end end if dist <= C.curveRadius then gain = math.min(gain, C.gainClose * 0.85) end local sUse = activeSmooth local gainCap = 0.9 + math.clamp(sUse - 1, 0, 1) * 0.08 gain = math.clamp(gain, 0.05, gainCap) local desiredX = (dx + wiggleX) * gain local desiredY = (dy + wiggleY) * gain local sVal = math.max(sUse, 0.05) local sBase = math.clamp(sVal, 0.05, 1) local sBoost = math.max(sVal - 1, 0) local sm = 1 - (1 - sBase) ^ (dt * 60) local lockMul = 1 + sBoost * 1.35 desiredX = desiredX * sm * lockMul desiredY = desiredY * sm * lockMul local resp = 1 - math.exp(-C.response * dt) stepX = stepX + (desiredX - stepX) * resp stepY = stepY + (desiredY - stepY) * resp if dist < 6 then stepX = stepX * 0.55 stepY = stepY * 0.55 end local mag = math.sqrt(stepX * stepX + stepY * stepY) if mag > C.maxStep and mag > 0 then local s = C.maxStep / mag stepX, stepY = stepX * s, stepY * s end if now < stopUntil then stepX, stepY = stepX * 0.15, stepY * 0.15 end accX = accX + stepX accY = accY + stepY local mx = (accX >= 0) and math.floor(accX) or math.ceil(accX) local my = (accY >= 0) and math.floor(accY) or math.ceil(accY) if mx ~= 0 or my ~= 0 then mousemoverel(mx, my) accX = accX - mx accY = accY - my end end end local canTrig = C.trigEnabled if C.trigHoldOnlyAim then canTrig = canTrig and aiming end local onTarget = target and dist <= C.trigRadius if canTrig and onTarget and (now - trigStart) >= C.trigDelay then if C.trigMode == "Hold" then if not trigHolding then mouseDown() trigHolding = true end else if trigHolding then mouseUp() trigHolding = false end local interval = 1 / math.max(C.trigCps, 1) if now >= nextClick then clickOnce() nextClick = now + interval end end else if trigHolding then mouseUp() trigHolding = false end end end))