-- instancing local drawing_new = Drawing.new local instance_new = Instance.new -- workspace local vector2_new = Vector2.new local vector3_new = Vector3.new local cframe_new = CFrame.new local cframe_angles = CFrame.Angles local raycast_params_new = RaycastParams.new local raycast = workspace.Raycast -- color local color3_rgb = Color3.fromRGB local color3_hsv = Color3.fromHSV local color3_new = Color3.new -- math local math_floor = math.floor local math_ceil = math.ceil local math_atan2 = math.atan2 local math_rad = math.rad local math_random = math.random local math_randomseed = math.randomseed -- string local string_char = string.char local string_format = string.format -- table local table_sort = table.sort -- task local task_wait = task.wait -- namecall local gdbd = game.GetDebugId local get_children = game.GetChildren local get_descendants = game.GetDescendants local find_first_child_of_class = game.FindFirstChildOfClass local find_first_child = game.FindFirstChild local is_descendant_of = game.IsDescendantOf local world_to_view_point = find_first_child_of_class(workspace, "Camera").WorldToViewportPoint local point_world_space = cframe_new().pointToWorldSpace local point_object_space = cframe_new().pointToObjectSpace local vector_world_space = cframe_new().vectorToWorldSpace local is_a = game.IsA -- globals local workspace = workspace local pairs = pairs local pcall = pcall local tostring = tostring local tick = tick local getgenv = getgenv local mousemoverel = mousemoverel local mouse1press = mouse1press local mouse1release = mouse1release -- random math_randomseed(tick()) function random_string(len) local str = "" for i = 1, len do str = str .. string_char(math_random(97, 122)) end return str end getgenv().render_loop_stepped_name = renderloop_stepped_name or random_string(math_random(15, 35)) getgenv().update_loop_stepped_name = update_loop_stepped_name or random_string(math_random(15, 35)) -- services local players = game:GetService("Players") local run_service = game:GetService("RunService") local uis = game:GetService("UserInputService") -- other local local_player = players.LocalPlayer local mouse = local_player:GetMouse() local cam = find_first_child_of_class(workspace, "Camera") local screen_size = cam.ViewportSize local center_screen = vector2_new(screen_size.X / 2, screen_size.Y / 2) local enum_rft_blk = Enum.RaycastFilterType.Blacklist local glass = Enum.Material.Glass local white = color3_rgb(255, 255, 255) local green = color3_rgb(0, 255, 0) local dummy_part = instance_new("Part", nil) drawing_new("Square").Visible = false -- initialize drawing lib local pi = math.pi -- dont touch lol local custom_players = true local refresh_que = false local start_aim = false local aim_head = false local added_fov = 0 -- execute to apply local options = { -- global settings frame_delay = 10, -- delay between rendering each frame (in miliseconds) refresh_delay = 0.25, -- delay between refreshing script (in seconds) max_dist = 9e9, -- 9e9 = very big team_check = true, wall_check = true, loop_all_humanoids = false, -- loop through workspace to find npc's to lock onto ignore_player_humanoids = true, -- will not lock onto/esp players (only if loop_all_humanoids is enabled) -- ui settings (sort of ui) fov_circle = true, aiming_at = true, -- aimbot settings aimbot = true, smoothness = 3, fov = 200, fov_increase_on_aim = 0, -- increases your fov by this value while the aimbot is active rage_mode = false, -- disregards fov, smoothness, odds and will lock onto people behind you -- aim type settings mouse_emulation = true, -- the default, will emulate user input (and is more natural) camera_cframe = false, -- aimlock, easier to detect, does not obey the smoothness setting but locks instantly -- will not lock on to people with this *username*, do not use a displayname for this, use the username ignore_people = { ["name"] = true, -- example of how you would exclude someone }, -- will try to prefire when aiming triggerbot = false, -- aimbot activation settings acts_as_toggle = false, -- https://developer.roblox.com/en-us/api-reference/enum/UserInputType mouse_key = Enum.UserInputType["MouseButton2"], -- how to disable: mouse_key = nil, -- how to enable: mouse_key = Enum.UserInputType["*"], -- https://developer.roblox.com/en-us/api-reference/enum/KeyCode keyboard_key = Enum.KeyCode["E"], -- how to disable: keyboard_key = nil, -- how to enable: keyboard_key = Enum.KeyCode["*"], -- headshot odds headshot_chance = 100, -- odds for aiming on the head in percentage, 0 = no head (lol) and 100 = always head update_on_refresh_delay = false, -- less nauseating, will recalculate odds every refresh instead of every frame -- aiming prioritization options looking_at_you = false, -- whoever is most likely to hit you closest_to_center_screen = true, closest_to_you = false, -- taxing, usually useless, will iterate backwards through players list if the "best player to lock onto" cant be locked onto backwards_iteration = false, -- global esp settings esp = true, esp_thickness = 2, -- esp settings tracers = true, box = true, -- overhead esp settings overhead = true, -- disables name health and distance entirely name = true, distance = true, health = true, outline = true, -- text outline, laggier -- rainbow settings rainbow = false, rainbow_speed = 5, -- lower is faster, 0.000001 is the lowest you can go -- looking_at_tracer settings (lat = looking_at_tracer in short) looking_at_tracer = true, -- will show where a player is looking --https://www.google.com/search?q=color+picker lat_color = color3_rgb(200, 0, 255), -- color in rgb lat_thickness = 2, lat_length = 3, -- how far the tracer will go (in studs) -- crosshair settings crosshair = false, crosshair_distance = 4, crosshair_thickness = 1, crosshair_length = 8; } -- script already running? if remove_all_esp then run_service:UnbindFromRenderStep(render_loop_stepped_name) run_service:UnbindFromRenderStep(update_loop_stepped_name) task_wait() -- wait for a frame to pass remove_all_esp() if descendant_hum_added then descendant_hum_added:Disconnect() descendant_hum_removing:Disconnect() player_name_added:Disconnect() player_name_removed:Disconnect() end player_added:Disconnect() player_removed:Disconnect() input_began:Disconnect() input_ended:Disconnect() getgenv().remove_all_esp = nil return; end -- how the script will find the players local characters = {} local player_names = {} local function get_players() local place = game.PlaceId if options.loop_all_humanoids then if not player_names[local_player.Name] then -- ran for the first time -- get player names for _, val in pairs(get_children(players)) do player_names[val.Name] = true end getgenv().player_name_added = players.ChildAdded:Connect(function(added) player_names[added.Name] = true end) getgenv().player_name_removed = players.ChildRemoved:Connect(function(added) player_names[added.Name] = nil end) -- get players with events for _, val in pairs(workspace:GetDescendants()) do if is_a(val, "Humanoid") and val.Parent ~= local_player.Character and not (options.ignore_player_humanoids and player_names[val.Parent.Name]) then characters[gdbd(val.Parent)] = val.Parent end end getgenv().descendant_hum_added = workspace.DescendantAdded:Connect(function(added) if is_a(added, "Humanoid") and added.Parent ~= local_player.Character and not (options.ignore_player_humanoids and player_names[added.Parent.Name]) then characters[gdbd(added.Parent)] = added.Parent end end) getgenv().descendant_hum_removing = workspace.DescendantRemoving:Connect(function(removing) if is_a(removing, "Humanoid") then characters[gdbd(removing.Parent)] = nil end end) end return characters end if place == 292439477 then -- phantom forces local leaderboard = local_player.PlayerGui.Leaderboard.Main if leaderboard then if options.team_check then local is_ghost = pcall(function() return leaderboard.Ghosts.DataFrame.Data[local_player.Name] end) return get_children(workspace.Players[(is_ghost and "Bright blue") or "Bright orange"]) else local instance_table = {} for idx, val in pairs(get_children(workspace.Players["Bright blue"])) do if is_a(val, "Model") then instance_table[#instance_table + 1] = val end end for idx, val in pairs(get_children(workspace.Players["Bright orange"])) do if is_a(val, "Model") then instance_table[#instance_table + 1] = val end end return instance_table -- return both teams end end return {} -- wtf??? end if place == 3837841034 then return get_children(workspace.characters) end if place == 5938036553 then local chars = {} for _, val in pairs(get_children(workspace)) do if val.Name == "r15_rig" then chars[#chars + 1] = val end end return chars end custom_players = false return get_children(players) end local aiming = { fov_circle_obj = nil, line = nil, circle = nil; } local crosshair = { top = nil, bottom = nil, right = nil, left = nil; } local players_table = {} local tracers = {} local quads = {} local overheads = {} local looking_at_tracers = {} -- needed functions local function to_screen(vec3) local screen_pos, in_screen = world_to_view_point(cam, vec3) return vector2_new(screen_pos.X, screen_pos.Y), in_screen, screen_pos, options.rage_mode end local function get_part_corners(part) local size = part.Size * vector3_new(1, 1.5, 0) local cf = part.CFrame return { top_right = (cf * cframe_new(-size.X, -size.Y, 0)).Position, bottom_right = (cf * cframe_new(-size.X, size.Y, 0)).Position, top_left = (cf * cframe_new(size.X, -size.Y, 0)).Position, bottom_left = (cf * cframe_new(size.X, size.Y, 0)).Position, } end local function new_drawing(class_name) return function(props) local inst = drawing_new(class_name) for idx, val in pairs(props) do if idx ~= "instance" then inst[idx] = val end end return inst end end local function add_or_update_instance(tbl, child, props) local inst = tbl[child] if not inst then tbl[child] = new_drawing(props.instance)(props) return inst; end for idx, val in pairs(props) do if idx ~= "instance" then inst[idx] = val end end return inst end local function get_rainbow() return color3_hsv((tick() % options.rainbow_speed / options.rainbow_speed), 1, 1) end local function remove_esp(idx) add_or_update_instance(tracers, idx, { Visible = false, instance = "Line" }) add_or_update_instance(quads, idx, { Visible = false, instance = "Quad" }) add_or_update_instance(overheads, idx, { Visible = false, instance = "Text" }) add_or_update_instance(looking_at_tracers, idx, { Visible = false, instance = "Line" }) end local ignored_instances = {} local raycast_params = raycast_params_new() raycast_params.FilterType = enum_rft_blk raycast_params.IgnoreWater = true local function can_hit(origin_pos, part) if not options.wall_check then return true end local ignore_list = {cam, local_player.Character} for idx, val in pairs(ignored_instances) do ignore_list[#ignore_list + 1] = val end raycast_params.FilterDescendantsInstances = ignore_list local raycast_result = raycast(workspace, origin_pos, (part.Position - origin_pos).Unit * options.max_dist, raycast_params) local result_part = ((raycast_result and raycast_result.Instance) or dummy_part) if result_part ~= dummy_part then if result_part.Transparency >= 0.3 then -- ignore low transparency ignored_instances[#ignored_instances + 1] = result_part end if result_part.Material == glass then -- ignore glass ignored_instances[#ignored_instances + 1] = result_part end end return is_descendant_of(result_part, part.Parent) end local function hitting_what(origin_cframe) if not options.wall_check then return dummy_part end local ignore_list = {cam, local_player.Character} for idx, val in pairs(ignored_instances) do ignore_list[#ignore_list + 1] = val end raycast_params.FilterDescendantsInstances = ignore_list local raycast_result = raycast(workspace, origin_cframe.p, origin_cframe.LookVector * options.max_dist, raycast_params) local result_part = ((raycast_result and raycast_result.Instance) or dummy_part) if result_part ~= dummy_part then if result_part.Transparency >= 0.3 then -- ignore low transparency ignored_instances[#ignored_instances + 1] = result_part end if result_part.Material == glass then -- ignore glass ignored_instances[#ignored_instances + 1] = result_part end end return result_part end local function is_inside_fov(point) return options.rage_mode or ((point.x - center_screen.X) ^ 2 + (point.y - center_screen.Y) ^ 2 <= aiming.fov_circle_obj.Radius ^ 2) end local function chanced() -- shanced 2 - 0 gf *tabs* return options.rage_mode or math_random(1, 100) <= options.headshot_chance end local function screen_height(yval) if yval > (screen_size.Y / 2) then return -0.5 end return 0.5 end local function _refresh() for idx in pairs(tracers) do -- hide all esp instances remove_esp(idx) end players_table = get_players() -- fetch new player list end local function refresh() refresh_que = true -- queue refresh before next render end -- player events getgenv().player_added = players.ChildAdded:Connect(refresh) getgenv().player_removed = players.ChildRemoved:Connect(refresh) -- aimbot triggers getgenv().input_began = uis.InputBegan:Connect(function(input) if input.KeyCode == options.keyboard_key then if options.acts_as_toggle then start_aim = not start_aim else start_aim = true end if options.fov_increase_on_aim > 0 then for i = 1, options.fov_increase_on_aim * 0.3 do added_fov = added_fov + 3 task_wait() end added_fov = options.fov_increase_on_aim end end if input.UserInputType == options.mouse_key then if options.acts_as_toggle then start_aim = not start_aim else start_aim = true end if options.fov_increase_on_aim > 0 then for i = 1, options.fov_increase_on_aim * 0.3 do added_fov = added_fov + 3 task_wait() end added_fov = options.fov_increase_on_aim end end end) getgenv().input_ended = uis.InputEnded:Connect(function(input) if input.KeyCode == options.keyboard_key then if not options.acts_as_toggle then start_aim = false end if options.fov_increase_on_aim > 0 then for i = 1, options.fov_increase_on_aim * 0.3 do added_fov = added_fov - 3 task_wait() end added_fov = 0 end end if input.UserInputType == options.mouse_key then if not options.acts_as_toggle then start_aim = false end if options.fov_increase_on_aim > 0 then for i = 1, options.fov_increase_on_aim * 0.3 do added_fov = added_fov - 3 task_wait() end added_fov = 0 end end end) local last_tick = 0; local function stepped() if (tick() - last_tick) > (options.frame_delay / 1000) then last_tick = tick() if refresh_que then -- refresh queed? _refresh() refresh_que = false end add_or_update_instance(aiming, "fov_circle_obj", { Visible = options.fov_circle, Thickness = options.esp_thickness, Radius = options.fov + added_fov, Position = center_screen, Color = (options.rainbow and get_rainbow()) or white, instance = "Circle"; }) add_or_update_instance(crosshair, "top", { Visible = options.crosshair, Thickness = options.crosshair_thickness, From = vector2_new(center_screen.X, center_screen.Y - options.crosshair_length - options.crosshair_distance), To = vector2_new(center_screen.X, center_screen.Y - options.crosshair_distance), Color = (options.rainbow and get_rainbow()) or white, instance = "Line"; }) add_or_update_instance(crosshair, "bottom", { Visible = options.crosshair, Thickness = options.crosshair_thickness, From = vector2_new(center_screen.X, center_screen.Y + options.crosshair_length + options.crosshair_distance + 1), To = vector2_new(center_screen.X, center_screen.Y + options.crosshair_distance + 1), Color = (options.rainbow and get_rainbow()) or white, instance = "Line"; }) add_or_update_instance(crosshair, "left", { Visible = options.crosshair, Thickness = options.crosshair_thickness, From = vector2_new(center_screen.X - options.crosshair_length - options.crosshair_distance, center_screen.Y), To = vector2_new(center_screen.X - options.crosshair_distance, center_screen.Y), Color = (options.rainbow and get_rainbow()) or white, instance = "Line"; }) add_or_update_instance(crosshair, "right", { Visible = options.crosshair, Thickness = options.crosshair_thickness, From = vector2_new(center_screen.X + options.crosshair_length + options.crosshair_distance + 1, center_screen.Y), To = vector2_new(center_screen.X + options.crosshair_distance + 1, center_screen.Y), Color = (options.rainbow and get_rainbow()) or white, instance = "Line"; }) local closers_chars = {} for _, plr in pairs(players_table) do local id = gdbd(plr) if plr == local_player then continue; end if options.ignore_people[plr.Name] then continue; end if options.team_check and not options.loop_all_humanoids and not custom_players and plr.Team then if plr.TeamColor == local_player.TeamColor then remove_esp(id); continue; end if plr.Team == local_player.Team then remove_esp(id); continue; end end local plr_char = ((options.loop_all_humanoids or custom_players) and plr) or plr.Character if plr_char == nil then remove_esp(id); continue; end local root_part = find_first_child(plr_char, "Torso") or find_first_child(plr_char, "UpperTorso") or find_first_child(plr_char, "LowerTorso") or find_first_child(plr_char, "HumanoidRootPart") or find_first_child(plr_char, "Head") or find_first_child_of_class(plr_char, "BasePart") if root_part == nil then remove_esp(id); continue; end if not is_a(root_part, "BasePart") then remove_esp(id); continue; end local head = find_first_child(plr_char, "Head") or root_part if not is_a(head, "BasePart") then continue; end local plr_screen, visible, scr_z = to_screen(head.Position) local mag = (head.Position - cam.CFrame.Position).Magnitude if mag > options.max_dist then remove_esp(id); continue; end if options.esp then local col = (options.rainbow and get_rainbow()) or white local corners = get_part_corners(root_part) local a_screen, a_visible = to_screen(corners.top_left) local b_screen, b_visible = to_screen(corners.top_right) local c_screen, c_visible = to_screen(corners.bottom_right) local d_screen, d_visible = to_screen(corners.bottom_left) if options.tracers then -- doesnt have a hide condition local object_space_pos = point_object_space(cam.CFrame, vector3_new( (corners.top_left.X + corners.top_right.X) / 2, (corners.top_left.Y + corners.top_right.Y) / 2, (corners.top_left.Z + corners.top_right.Z) / 2 )) if 0 > scr_z.Z then -- thanks unnamed esp for the math local angle = math_atan2(object_space_pos.Y, object_space_pos.X) + pi object_space_pos = vector_world_space(cframe_angles(0, 0, angle), (cframe_angles(0, math_rad(89.99), 0).LookVector)) end local tracer_pos = to_screen(point_world_space(cam.CFrame, object_space_pos)) add_or_update_instance(tracers, id, { Visible = options.esp, Thickness = options.esp_thickness, From = vector2_new(screen_size.X / 2, screen_size.Y - 36), To = tracer_pos, Color = (options.rainbow and get_rainbow()) or color3_new(255 / mag, mag / 255, 0), instance = "Line"; }) end if options.box then if a_visible and b_visible and c_visible and d_visible then add_or_update_instance(quads, id, { Visible = options.esp, Thickness = options.esp_thickness, PointA = a_screen, PointB = b_screen, PointC = c_screen, PointD = d_screen, Color = col, instance = "Quad"; }) else add_or_update_instance(quads, id, { Visible = false, instance = "Quad"; }) end end if options.looking_at_tracer then local a_head_src, a_visible = to_screen(head.Position) local b_lv_src, b_visible = to_screen(head.Position + head.CFrame.LookVector * options.lat_length) if a_visible and b_visible then add_or_update_instance(looking_at_tracers, id, { Visible = options.esp, Thickness = options.lat_thickness, To = a_head_src, From = b_lv_src, Color = options.lat_color or white, instance = "Line"; }) else add_or_update_instance(looking_at_tracers, id, { Visible = false, instance = "Line"; }) end end if options.overhead then local text = ""; if options.health then local hum = find_first_child_of_class(plr_char, "Humanoid") if hum then text = string_format("%s[%d/%d] ", text, math_ceil(hum.Health), math_ceil(hum.MaxHealth)) end end if options.distance then text = string_format("%s[%d]\n", text, math_floor(mag)) end if options.name then text = string_format("%s%s ", text, plr.Name) end local head_screen, h_visible = to_screen(head.Position + head.CFrame.UpVector * 2) if h_visible then local obj = overheads[id] add_or_update_instance(overheads, id, { Visible = options.esp, Outline = options.outline, Center = true, Position = head_screen - vector2_new(0, (obj and obj.TextBounds.Y) or 0), Text = text, Color = col, instance = "Text"; }) else add_or_update_instance(overheads, id, { Visible = false, instance = "Text"; }) end end end if options.aimbot then if options.looking_at_you then closers_chars[((head.Position + head.CFrame.LookVector * mag) - cam.CFrame.p).Magnitude] = plr_char elseif options.closest_to_center_screen then closers_chars[(plr_screen - center_screen).Magnitude] = plr_char elseif options.closest_to_you then closers_chars[mag] = plr_char end end end -- sort players, esp, teamcheck if not options.aimbot then return; end local mags = {} for idx in pairs(closers_chars) do mags[#mags + 1] = idx end table_sort(mags) local idx_sorted = {} for _, idx in pairs(mags) do idx_sorted[#idx_sorted + 1] = closers_chars[idx] end local run_aimbot = nil; run_aimbot = function(plr_offset) local char = idx_sorted[plr_offset] if char then local children = get_children(char) local parts = {} for _, obj in pairs(children) do if is_a(obj, "BasePart") then local part_screen, part_in_screen, _, rage = to_screen(obj.Position) if can_hit(cam.CFrame.p, obj) and (part_in_screen or rage) and (is_inside_fov(part_screen) or rage) then local set = { part = obj, screen = part_screen, visible = part_in_screen; } parts[obj.Name] = set parts[0] = set -- set last part end end end local chosen = nil; if not options.update_on_refresh_delay then aim_head = chanced() end if parts["Head"] and aim_head then chosen = parts["Head"] else local torso = parts["Torso"] or parts["UpperTorso"] or parts["LowerTorso"] if torso then chosen = torso else chosen = parts["Head"] or parts[0] -- aim on head if odds are against the head, but the torso isnt visible, or on other visible part end end if chosen then local scale = (chosen.part.Size.Y / 2) local top, top_z, top_visible = to_screen((chosen.part.CFrame * cframe_new(0, scale, 0)).Position); local bottom, bottom_z, bottom_visible = to_screen((chosen.part.CFrame * cframe_new(0, -scale, 0)).Position); local radius = -(top - bottom).y; add_or_update_instance(aiming, "circle", { Visible = top_visible and bottom_visible and options.aiming_at, Thickness = options.esp_thickness, Radius = radius / 2, Position = chosen.screen, Color = (options.rainbow and get_rainbow()) or (start_aim and green) or white, instance = "Circle"; }) if start_aim then add_or_update_instance(aiming, "line", { Visible = options.aiming_at, Thickness = options.esp_thickness, From = center_screen, To = chosen.screen, Color = (options.rainbow and get_rainbow()) or (start_aim and green) or white, instance = "Line"; }) local smoothness = (options.rage_mode and 1) or options.smoothness if chosen.visible then if options.mouse_emulation then mousemoverel((chosen.screen.X - mouse.X) / smoothness, (chosen.screen.Y - (mouse.Y + 36)) / smoothness) elseif options.camera_cframe then cam.CFrame = cframe_new(cam.CFrame.p, chosen.part.Position) end elseif options.rage_mode then if options.mouse_emulation then mousemoverel(screen_size.X / 4, (chosen.screen.Y - (mouse.Y + 36)) * screen_height(mouse.Y)) elseif options.camera_cframe then cam.CFrame = cframe_new(cam.CFrame.p, chosen.part.Position) end end if options.triggerbot then if is_descendant_of(hitting_what(cam.CFrame), chosen.part.Parent) then mouse1press() else mouse1release() end end return; else if options.triggerbot then mouse1release() end add_or_update_instance(aiming, "line", { Visible = false, instance = "Line"; }) return; end -- aiming? return; -- part is on screen, and in fov, no need to find a new player, loop ends here end -- part exists? if options.triggerbot then mouse1release() end add_or_update_instance(aiming, "line", { Visible = false, instance = "Line"; }) add_or_update_instance(aiming, "circle", { Visible = false, instance = "Circle"; }) if options.backwards_iteration then run_aimbot(plr_offset + 1); -- previous player end end end run_aimbot(1); end end local last_refresh = 0; run_service:BindToRenderStep(render_loop_stepped_name, 300, function() if (tick() - last_refresh) > options.refresh_delay then last_refresh = tick() if not cam or not cam.Parent or cam.Parent ~= workspace then cam = find_first_child_of_class(workspace, "Camera") world_to_view_point = cam.WorldToViewportPoint end if options.update_on_refresh_delay then aim_head = chanced() end refresh() end end) -- refresher run_service:BindToRenderStep(update_loop_stepped_name, 199, stepped) -- kills esp getgenv().remove_all_esp = function() for idx in pairs(tracers) do -- hide all esp instances remove_esp(idx) end -- aiming add_or_update_instance(aiming, "fov_circle_obj", { Visible = false, instance = "Circle"; }) add_or_update_instance(aiming, "circle", { Visible = false, instance = "Circle"; }) add_or_update_instance(aiming, "line", { Visible = false, instance = "Line"; }) -- crosshair add_or_update_instance(crosshair, "top", { Visible = false, instance = "Line"; }) add_or_update_instance(crosshair, "bottom", { Visible = false, instance = "Line"; }) add_or_update_instance(crosshair, "left", { Visible = false, instance = "Line"; }) add_or_update_instance(crosshair, "right", { Visible = false, instance = "Line"; }) end