Quick actions

cmd+k|ctrl+k

Navigation

Languages

ArsenalBot

Snippet info

Language

Lua

Visibility

public

Author

legacy-v1-16166

Created

2023-07-17T23:42:10.621209Z

Updated

2024-08-21T00:25:01.954694Z

getgenv().Settings = {
    AimSens = 1/45; -- aimbot sensitivity
    LookSens = 1/80; -- aim while walking sens
    PreAimDist = 55; -- if within 55 studs then preaim
    KnifeOutDist = 85; -- if within 85 studs then swap back to gun
    ReloadDist = 50; -- if over 50 studs away then reload
    RecalDist = 15; -- if player moves over this many studs then recalculate path to them
    PFSettings = { -- only edit these if u know what ur doing
        ["WaypointSpacing"] = 4; -- space between each pathfinding waypoint
        ["AgentHeight"] = 5; -- height of the agent
        ["AgentRadius"] = 3; -- radius in which the agent can fit into
        ["AgentCanJump"] = true; -- whether the agent can jump
    }
}

local PFS = game:GetService("PathfindingService")
local PS = game:GetService("Players")
local RS = game:GetService("RunService")
local TS = game:GetService('TweenService');
local VIM = game:GetService("VirtualInputManager")
local UIS = game:GetService("UserInputService")

local Player = Player.LocalPlayer
local Mouse = Player:GetMouse()

local Camera = Workspace.CurrentCamera
local Map = Workspace.Map
local Spawns = Map.Spawns

local RayIgnore = Workspace.Ray_Ignore
local MapIgnore = Workspace.Ignore

local Equipped = "Gun"
local TargetPlayer, IsAiming, InitialPos, TargetObj

-- get the ignore list based on character and target character
local GetIgnoreList = function(Char, TargetChar)
    return {TargetChar, Char, Camera, RayIgnore, MapIgnore}
end

-- check if the target position is visible
local IsVisible = function(Position, IgnoreList)
    local Parts = Camera:GetPartsObscuringTarget({Position}, IgnoreList)

    -- return true if the table of obscuring parts is 0 in length/size
    return (#Parts == 0)
end

-- check if the target player is visible
local IsTargetVisible = function(Target)
    local Char = Player.Character
    local TargetChar = Target.Character

    -- iterate thru the target character's children
    for _, Obj in next, TargetChar:GetChildren() do
        -- check if either character is nil
        if (Char == nil or TargetChar == nil) then
            return false
        end

        -- get the ignorelist for checking if its visible
        local IgnoreList = GetIgnoreList(Char, TargetChar)

        -- check if the object is a basepart (a part, meshpart, etc.)
        if (Obj:IsA("BasePart")) then
            -- if its visible return true and the object (aimpart), otherwise return false
            if (IsVisible(Obj.Position, IgnoreList)) then
                return true, Obj
            else
                return false
            end
        end
    end
end

-- get the player's bodyparts
local GetBodyParts = function()
    -- return character, head, rootpart, and humanoid if character isnt nil, otherwise dont return anything (nil)

    if Player.Character ~= nil then
        local Char = Player.Character

        return Char, Char.Head, Char.HumanoidRootPart, Char.Humanoid
    end
end

-- get the closest visible player
local GetClosestTarget = function()
    local ClosestDist = 9e9
    local ClosestTarget = nil

    -- iterate thru all players
    for _, Target in next, PS:GetPlayers() do
        -- check if current iteration isnt the exploiter and if the target and exploiter arent on the same team
        if (Player ~= Target and Player.Team ~= Target.Team) then
            local Char = Player.Character
            local TargetChar = Target.Character
            
            -- check if the exploiter character and target character arent nil
            if (Char ~= nil and TargetChar ~= nil) then
                local Root = Char.HumanoidRootPart
                local TargetRoot = TargetChar.HumanoidRootPart

                -- get distance between both rootparts
                local Distance = (Root.Position - TargetRoot.Position).Magnitude

                -- if the distance between the 2 is less than the current closest one, that means thats the new closest player
                if (Distance < ClosestDist) then
                    -- update the variables
                    ClosestDist = Distance
                    ClosestTarget = Target
                end
            end
        end
    end

    -- return the closest target player
    return ClosestTarget
end


-- attempt to aimlock on nearest visible player
local DoAimlock = function()
    local IsVisible, AimPart = IsTargetVisible(ClosestTarget)

    -- check if the current closest target is visible
    if (IsVisible == true and IsAiming == false) then
        IsAiming = true

        local Char, Head, Root, Humanoid = GetBodyParts()
        local InitialCameraCF = Camera.CFrame

        -- linear interpolate thru the aim sensitivity
        for Index = 0, 1, Settings.AimSens do
            -- dont aim at dead people or aim while dead
            if (Char == nil or AimPart == nil or AimPart.Parent == nil) then
                break
            end

            -- dont aim at the ground
            if (Head.Position.Y + AimPart.Position.Y) < 0 then
                break
            end

            -- aim closer to the part based on the current interpolation
            local NewCFrame = CFrame.new(Camera.CFrame.Position, AimPart.Position)
            Camera.CFrame = InitialCameraCF:Lerp(NewCFrame, Index)

            -- wait until next frame
            task.wait()
        end

        -- click mouse
		VIM:SendMouseButtonEvent(Mouse.X, Mouse.Y, 0, true, game, 1)
		task.wait(0.25)
		VIM:SendMouseButtonEvent(Mouse.X, Mouse.Y, 0, false, game, 1)
    end

    IsAiming = false
end

-- attempt to move to the nearest player (even if theyre not visible)
local DoMovement = function()
    -- check if targetplayer is not nil
    if (TargetPlayer ~= nil and TargetPlayer.Character ~= nil) then
        -- get targetplayer character and rootpart
        local TargetChar = TargetPlayer.Character
        local TargetRoot = TargetChar:FindFirstChild("HumanoidRootPart")

        -- get exploiter bodyparts
        local Char, Head, Root, Humanoid = GetBodyParts()

        -- check if exploiter character and 
        if (Char ~= nil and TargetRoot ~= nil) then
            -- update the initialposition
            InitialPos = TargetRoot.Position

            -- create a path & compute it (towards the targetroot ofc)
            local Path = PFS:CreatePath(Settings.PFSettings)
            local Success, Error = pcall(function()
                Path:ComputeAsync(Root.Position, TargetRoot.Position)
            end)

            -- if the paths compution was a success and we werent ratelimited or w/e by pathfinding service
            if (Success == true and Path.Status == Enum.PathStatus.Success) then
                -- get the waypoints to the targetplayer & remove the first one
                local Waypoints =  Path:GetWaypoints()
                table.remove(Waypoints, 1)

                for _, Waypoint in next, Waypoints do
                    -- if the targetplayer we are currently moving towards is now dead
                    if (TargetPlayer.Character == nil) then
                        ClosestTarget = nil
                        return
                    -- if the targetplayer walked too far away, means we need to recalculate
                    elseif ((InitialPos - TargetRoot.Position).Magnitude > Settings.RecalDist) then
                        return DoMovement()
                    end

                    -- if the current waypoint wants us to jump, we jump
                    if (Waypoint.Action == Enum.PathWaypointAction.Jump) then
                        Humanoid:ChangeState(Enum.HumanoidStateType.Jumping)
                    end

                    -- do other movment stuff
                    Humanoid:MoveTo(Waypoint.Position)
                end
            end
        end
    end
end
INFO