Crack Lua Aarne.club crack

Начинающий
Статус
Оффлайн
Регистрация
2 Фев 2022
Сообщения
49
Реакции[?]
7
Поинты[?]
0

Данный скрипт не проверялся модераторами, так как является кряком приватной LUA и в нём может присутствовать обфускация. Даже известные пользователи могут выложить вредоносный скрипт под видом крякнутого, поэтому любое использование исключительно на свой страх и риск.

code_language.lua:
local function vtable_entry(instance, index, type)
    return ffi.cast(type, (ffi.cast("void***", instance)[0])[index])
end

local function vtable_thunk(index, typestring)
    local t = ffi.typeof(typestring)
    return function(instance, ...)
        assert(instance ~= nil)
        if instance then
            return vtable_entry(instance, index, t)(instance, ...)
        end
    end
end

local function vtable_bind(module, interface, index, typestring)F
    local instance = Utils.CreateInterface(module, interface) or error("invalid interface")
    local fnptr = vtable_entry(instance, index, ffi.typeof(typestring)) or error("invalid vtable")
    return function(...)
        return fnptr(instance, ...)
    end
end

function table.keys(array) local out = {} for key, k in pairs(array) do table.insert(out, key) end return out end
function table.find(array, to_find) for i, k in ipairs(array) do return k == to_find end end

function table.filter(array, func)
    local filtered = {}

    for i, k in ipairs(array) do
        if func(k) then
            table.insert(filtered, k)
        end
    end

    return filtered
end

local files = {}

ffi.cdef[[
    typedef struct {
        uint8_t r;
        uint8_t g;
        uint8_t b;
        uint8_t a;
    } color_struct_t;

    typedef void (__cdecl* console_color_print)(void*,const color_struct_t&, const char*, ...);

    bool URLDownloadToFileA(void* LPUNKNOWN, const char* LPCSTR, const char* LPCSTR2, int a, int LPBINDSTATUSCALLBACK); 
    bool CreateDirectoryA(const char* lpPathName, void* lpSecurityAttributes);
    bool DeleteUrlCacheEntryA(const char* lpszUrlName);
]]

local console = {}

console.interface_type = ffi.typeof("uintptr_t**")
console.cvar_interface = ffi.cast(console.interface_type, Utils.CreateInterface("vstdlib.dll", "VEngineCvar007"))
console._print = ffi.cast("console_color_print", console.cvar_interface[0][25])

console.color_print = function(color, text)
    if color == nil then
        return
    end

    local col = ffi.new("color_struct_t")
    col.r = color.r * 255
    col.g = color.g * 255
    col.b = color.b * 255
    col.a = color.a * 255

    console._print(console.cvar_interface, col, text)
end

console.print = function(...)
    console.color_print(Color.RGBA(118, 200, 232), '[Aarne.club] ')

    for i, v in ipairs({...}) do
        local color = v[2] or Color.RGBA(255, 255, 255)
        local text = v[1] or ''

        console.color_print(color, text)
    end

    print('')
end

--@nope: uwu colored printi :33333
local uwu = {}

uwu.calc_count = function(string, search)
    local count = 0

    for i = 1, #string do
        if string:sub(i, i) == search then
            count = count + 1
        end
    end

    return count
end

--@note: ДА У МЕНЯ ЧУТЬ МАЗГА НАХЪУЙ НЕ ВЗАРВАЛАСЬ ТАКОЕ ДЕЛАТЬ ЕБАНЫЙ РОТ
uwu.print = function(_string, vector, alpha, font, shadow)
    local string = _string
    local old_text_size = 0

    for i = 1, uwu.calc_count(string, "{") do
        local start_prefix = string:find('{')
        local end_prefix = string:find('}')

        local string_color = string:sub(start_prefix, end_prefix)
        local load_color = loadstring('return ' .. string_color)()
        local next_string = string:sub(end_prefix + 1)

        local next_prefix_start = next_string:find('{')
        local new_string = next_prefix_start and next_string:sub(1, next_prefix_start - 1) or next_string

        string = next_string

        if (vector or alpha or font or shadow) then
            local color = Color.new(unpack(load_color))
            color.a = alpha

            Render.ShadowText(new_string, Vector2.new(vector.x + old_text_size, vector.y), color, font, shadow, false)

            old_text_size = old_text_size + Render.CalcTextSize(new_string, font.size, font.init).x

            goto skip
        end

        console.color_print(Color.new(unpack(load_color)), new_string)

        ::skip::
    end
end



files.default_path = 'nl\\aarne.club'

files.UrlMon = ffi.load('UrlMon')
files.WinInet = ffi.load('WinInet')
files.Gdi32 = ffi.load('Gdi32')

files.download = function(self, url, file_name, path)
    path = path and path or self.default_path

    path = path .. '\\' .. file_name

    self.WinInet.DeleteUrlCacheEntryA(url)
    self.UrlMon.URLDownloadToFileA(nil, url, path, 0, 0)
    
    local log = ('Successfully downloaded (%s) to (%s) folder'):format(file_name, self.default_path)
    Cheat.AddEvent(log)
    uwu.print(('{0.54, 0.83, 1}[Aarne.club] {1, 1, 1}Successfully downloaded {0.78, 1, 0}%s {1, 1, 1}to {0.78, 1, 0}%s {1, 1, 1}folder \n'):format(file_name, self.default_path))
end

files.create_directory = function(self, path)
    path = path and path or self.default_path

    ffi.C.CreateDirectoryA(path, NULL)

    local log = ('Successfully created (%s) folder'):format(path)
    Cheat.AddEvent(log)
    uwu.print(('{0.54, 0.83, 1}[Aarne.club] {1, 1, 1}Successfully created {0.78, 1, 0}%s {1, 1, 1}folder \n'):format(path))
end

local http = Panorama.LoadString([[
    return {
        request: function(url, options){
            $.AsyncWebRequest(url, options);
        }
    }
]])()

local json = Panorama.LoadString([[
    return {
        encode: JSON.stringify,
        parse: JSON.parse
    };
]])()

local ffi_handler = {}
local animation_breaker = {}

ffi_handler.sigs = {
    get_pose_params = {"client.dll", "55 8B EC 8B 45 08 57 8B F9 8B 4F 04 85 C9 75 15"} -- https://github.com/perilouswithadollarsign/cstrike15_src/blob/master/public/studio.cpp#L931
}

ffi_handler.offsets = {
    animstate = 0x9960, -- m_bIsScoped - 20
    landing_anim = 0x109, -- аэээ ну из структуры анимстейта просто взять
    m_pStudioHdr = 0x2950, -- https://github.com/frk1/hazedumper/blob/master/csgo.json#L55
}

ffi_handler.bind_argument = function(fn, arg)
    return function(...)
        return fn(arg, ...)
    end
end

ffi_handler.interface_type = ffi.typeof("uintptr_t**")

ffi_handler.i_client_entity_list = ffi.cast(ffi_handler.interface_type, Utils.CreateInterface("client.dll", "VClientEntityList003"))
ffi_handler.get_client_entity = ffi_handler.bind_argument(ffi.cast("void*(__thiscall*)(void*, int)", ffi_handler.i_client_entity_list[0][3]), ffi_handler.i_client_entity_list)

ffi_handler.get_pose_parameters = ffi.cast( "struct {char pad[8]; float m_flStart; float m_flEnd; float m_flState;}*(__thiscall* )( void*, int )", Utils.PatternScan(unpack(ffi_handler.sigs.get_pose_params)))

animation_breaker.cache = {}

local base64 = {}
local b = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'

base64.encode = function(string)
    return ((string:gsub('.', function(x)
        local r, b = '', x:byte()
        for i = 8, 1, -1 do
            r = r .. (b % 2 ^ i - b % 2 ^ (i - 1) > 0 and '1' or '0')
        end

        return r;
    end) .. '0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
        if (#x < 6) then
            return ''
        end

        local c = 0
        
        for i = 1, 6 do
            c = c + (x:sub(i, i) == '1' and 2 ^ (6 - i) or 0)
        end

        return b:sub(c + 1, c + 1)
    end) .. ({ '', '==', '=' })[#string % 3 + 1])
end

base64.decode = function(string)
    string = string.gsub(string, '[^' .. b .. '=]', '')
    return (string:gsub('.', function(x)
        if (x == '=') then
            return ''
        end

        local r, f = '', (b:find(x) - 1)
        for i = 6, 1, -1 do
            r = r .. (f % 2 ^ i -f % 2 ^ (i - 1) > 0 and '1' or '0')
        end

        return r;
    end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x)
        if (#x ~= 8) then
            return ''
        end

        local c = 0
        for i = 1, 8 do
            c = c + (x:sub(i, i) == '1' and 2 ^ (8 - i) or 0)
        end
        return string.char(c)
    end))
end

local defines = {}
local draggables = {
    create_draggable = function(start_position_x, start_position_y, starting_size_x, starting_size_y, name, callback_fn)
    return {
        position_x = start_position_x:GetInt(),
        position_y = start_position_y:GetInt(),
        size_x = starting_size_x,
        size_y = starting_size_y,
        started_dragging = false,
        initial_drag_pos = Vector2.new(0, 0),
        drag_pos = Vector2.new(0, 0),
        callback_function = callback_fn,

        update = function(self)
            if Cheat.IsMenuVisible() then
                local mouse_position = Cheat.GetMousePos()
                local is_in_bounds = (mouse_position.x >= self.position_x and mouse_position.y >= self.position_y and mouse_position.x <= self.position_x + self.size_x and mouse_position.y <= self.position_y + self.size_y)
                if (is_in_bounds or self.started_dragging) and Cheat.IsKeyDown(1) and (defines.mouse_target == 0 or defines.mouse_target == name) then
                    defines.mouse_target = name
                    if not self.started_dragging then           
                        self.started_dragging = true
                        self.initial_drag_pos = Vector2.new(mouse_position.x - self.position_x, mouse_position.y - self.position_y)
                    else
                        self.position_x = mouse_position.x - self.initial_drag_pos.x
                        self.position_y = mouse_position.y - self.initial_drag_pos.y

                        start_position_x:SetInt(math.floor(tonumber(self.position_x)))
                        start_position_y:SetInt(math.floor(tonumber(self.position_y)))
                    end
                    elseif not Cheat.IsKeyDown(1) then
                        defines.mouse_target = 0
                            self.started_dragging = false
                            self.initial_drag_pos = self.drag_pos
                    end
                end
            self.callback_function(self)
        end
    }
    end
}

local clipboard = {}

clipboard.GetClipboardTextCount = vtable_bind("vgui2.dll", "VGUI_System010", 7, "int(__thiscall*)(void*)")
clipboard.SetClipboardText = vtable_bind("vgui2.dll", "VGUI_System010", 9, "void(__thiscall*)(void*, const char*, int)")
clipboard.GetClipboardText = vtable_bind("vgui2.dll", "VGUI_System010", 11, "int(__thiscall*)(void*, int, const char*, int)")

local new_char_arr = ffi.typeof("char[?]")

clipboard.paste = function()
    local len = clipboard.GetClipboardTextCount()

    if len > 0 then
        local char_arr = new_char_arr(len)
        clipboard.GetClipboardText(0, char_arr, len)
        return ffi.string(char_arr, len - 1)
    end
end

clipboard.copy = function(string)
    string = tostring(string)

    clipboard.SetClipboardText(string, string.len(string))

    Cheat.AddEvent('Config successfully copied to clipboard')
    uwu.print('{0.54, 0.83, 1}[Aarne.club] {1, 1, 1}Config successfully copied to clipboard \n')
end

math.pi_divided = math.pi / 180

function math.clamp(value, min, max)
    return math.min(max, math.max(min, value))
end

function math.lerp(start, end_pos, time)
    if time == nil then
        time = 0.095
    end

    time = math.clamp(GlobalVars.frametime * (time * 175), 0, 1)
    if type(start) == "userdata" then
        local r, g, b, a = start.r, start.g, start.b, start.a
        local e_r, e_g, e_b, e_a = end_pos.r, end_pos.g, end_pos.b, end_pos.a
        r = math.lerp(r, e_r, time)
        g = math.lerp(g, e_g, time)
        b = math.lerp(b, e_b, time)
        a = math.lerp(a, e_a, time)
        return Color.new(r, g, b, a)
    end

    local delta = end_pos - start
    delta = delta * time
    delta = delta + start

    if end_pos == 0 and delta < 0.01 and delta > -0.01 then
        delta = 0
    elseif end_pos == 1 and delta < 1.01 and delta > 0.99 then
        delta = 1
    end

    return delta
end

function math.closest_point_on_ray(ray_from, ray_to, desired_point)
    local to = desired_point - ray_from
    local direction = ray_to - ray_from
    local ray_length = direction:Length()

    direction = direction / ray_length

    local direction_along = direction.x * to.x + direction.y * to.y + direction.z * to.z
    if direction_along < 0 then return ray_from end
    if direction_along > ray_length then return ray_to end

    return Vector.new(ray_from.x + direction.x * direction_along, ray_from.y + direction.y * direction_along, ray_from.z + direction.z * direction_along)
end

function math.normalize(ang)
    while (ang > 180.0) do
        ang = ang - 360.0
    end
    while (ang < -180.0) do
        ang = ang + 360.0
    end
    return ang
end

function Render.ShadowText(string, vector, color, font, shadow, centered)
    if not centered then centered = false end
    if shadow then
        Render.Text(string, vector + 1, Color.new(0.0, 0.0, 0.0, color.a), font.size, font.init, false, centered)
    end
    Render.Text(string, vector, color, font.size, font.init, false, centered)
end

function Render.HorizontalGradient(x, y, w, h, color_1, color_2)
    Render.GradientBoxFilled(Vector2.new(x, y), Vector2.new(x + w / 2, y + h), color_2, color_1, color_2, color_1)
    Render.GradientBoxFilled(Vector2.new(x + w / 2, y), Vector2.new(x + w, y + h), color_1, color_2, color_1, color_2)
end

function Render.FilledBox(x, y, w, h, color)
    Render.BoxFilled(Vector2.new(x, y), Vector2.new(x, y) + Vector2.new(w, h), color)
end

function C_BasePlayer:IsEnemy()
    return EntityList.GetLocalPlayer() and self:IsTeamMate() == false
end

function C_BasePlayer:IsScoped()
    return self:GetProp("m_bIsScoped")
end











uwu.print(('{0.54, 0.83, 1}[Aarne.club] {1, 1, 1}Welcome back, {0.78, 1, 0}%s \n'):format(Cheat.GetCheatUserName()))

local tabs = {
    global = "Global",
    antiaim = "Anti-Aim",
    antibruteforce = "Anti-Bruteforce",
    visual = "Visuals",
    config = "Config",
    playerlist = "Player List"
}



local vars = {}

vars.screen = EngineClient:GetScreenSize()
vars.thirdperson = Menu.FindVar("Visuals", "View", "Thirdperson", "Enable Thirdperson")
vars.minimum_damage = Menu.FindVar("Aimbot", "Ragebot", "Accuracy", "Minimum Damage")



local font = {}

-- @note: uwu?
--[[ files:create_directory()
files:download('https://fontsforyou.com/downloads/99851-smallestpixel7', 'smallest_pixel-7.ttf') ]]

font.verdana = {}
font.verdana.size = 12
font.verdana.init = Render.InitFont("Verdana", font.verdana.size)

font.arrow = {}
font.arrow.size = 15
font.arrow.init = Render.InitFont("Verdana", font.arrow.size, {"b"})

font.verdana_r = {}
font.verdana_r.size = 12
font.verdana_r.init = Render.InitFont("Verdana", font.verdana_r.size, {'r'})

font.slow = {}
font.slow.size = 14
font.slow.init = Render.InitFont("Verdana", font.slow.size, {"b"})

font.slow2 = {}
font.slow2.size = 27
font.slow2.init = Render.InitFont("Verdana", font.slow.size, {"b"})

font.pixel = {}
font.pixel.size = 10
font.pixel.init = Render.InitFont('smallest pixel-7', font.pixel.size, {"r"})

font.prediction = {}
font.prediction.size = 12
font.prediction.init = Render.InitFont("Verdana", font.prediction.size, {"b"})


vars.dt_ref = Menu.FindVar("Aimbot", "Ragebot", "Exploits", "Double Tap")
vars.hs_ref = Menu.FindVar("Aimbot", "Ragebot", "Exploits", "Hide Shots")
vars.slowmo_ref = Menu.FindVar("Aimbot", "Anti Aim", "Misc", "Slow Walk")
vars.fakelag_ref = Menu.FindVar("Aimbot", "Anti Aim", "Fake Lag", "Enable Fake Lag")




local menu = {}




local playerlist = {}

playerlist.data = {}

playerlist.hitboxes = { 'head', 'neck', 'pelvis', 'stomach', 'lower chest', 'chest', 'upper chest', 'right thigh', 'left thigh', 'right calf',
    'left calf', 'right foot', 'left foot', 'right hand', 'left hand', 'right upper arm', 'right forearm', 'left upper arm', 'left forearm' }

playerlist.ClearData = function(self)
    for player_name, menu_items in pairs(self.data) do
        for menu_item_name, menu_item in pairs(menu_items) do
            Menu.DestroyItem(menu_item)
        end
    end

    self.data = {}
end

playerlist.UpdateData = function(self)
    self:ClearData()

    local players = EntityList.GetPlayers()

    if not players or #players < 1 then
        return
    end

    for i, player in ipairs(players) do

        if player:IsEnemy() then

            local player_name = player:GetName()

            self.data[player_name] = {
                ['Override'] = Menu.Switch(tabs.playerlist, player_name, ('Override %s'):format(player_name), false),
                ['Ignore Target'] = Menu.Switch(tabs.playerlist, player_name, 'Ignore Target', false),
                ['High Priority'] = Menu.Switch(tabs.playerlist, player_name, 'High Priority', false),
                ['Force Safety'] = Menu.Switch(tabs.playerlist, player_name, 'Force Safety', false),
                ['Hitbox System'] = Menu.Switch(tabs.playerlist, player_name, 'Hitbox System', false, 'For "Disable Hitbox" and "Disable Multipoint" work you need to enable this switch.'),
                ['Disable Hitbox'] = Menu.MultiCombo(tabs.playerlist, player_name, 'Disable Hitbox', self.hitboxes, 0, 'Enable "Hitbox System" for this feature to work.'),
                ['Disable Multipoint'] = Menu.MultiCombo(tabs.playerlist, player_name, 'Disable Multipoint', self.hitboxes, 0, 'Enable "Hitbox System" for this feature to work.'),
                ['Trashtalk'] = Menu.Switch(tabs.playerlist, player_name, 'Trashtalk', false),
                ['Trashtalk Text'] = Menu.TextBox(tabs.playerlist, player_name, 'Trashtalk Text', 64, ''),
            }

        end

    end

end

playerlist:UpdateData()

playerlist.menu_keys_update = function() if #table.keys(playerlist.data) < 1 then return {'No Enemies'} end return table.keys(playerlist.data) end
playerlist.menu_keys = playerlist.menu_keys_update()

playerlist.menu_target = Menu.Combo(tabs.playerlist, 'Player List', 'Target', playerlist.menu_keys, 0)

playerlist.MenuVisible = function(self)
    local taget_index = self.menu_target:Get()
    local target_name = self.menu_keys[taget_index + 1]

    for name, k in pairs(self.data) do
        local state = (name == target_name)
        
        for menu_name, menu_item in pairs(self.data[name]) do
            self.data[name][menu_name]:SetVisible(state)
        end
    end
end

playerlist:MenuVisible()

playerlist.menu_target:RegisterCallback(function()
    playerlist:MenuVisible()
end)

playerlist.menu_update_targets = Menu.Button(tabs.playerlist, 'Player List', 'Update Targets', '', function()
    playerlist:UpdateData()
    playerlist.menu_keys = playerlist.menu_keys_update()
    playerlist.menu_target:UpdateList(playerlist.menu_keys)
    playerlist:MenuVisible()
end)



playerlist.on_prediction = function(self)
    local players = EntityList.GetPlayers()

    if not players or #players < 1 then
        return
    end

    for i, player in ipairs(players) do

        if player:IsEnemy() then

            local player_name = player:GetName()

            if playerlist.data[player_name] then

                local data = playerlist.data[player_name]

                if data['Override']:Get() then

                    local player_index = player:EntIndex()

                    if data['Ignore Target']:Get() then

                        RageBot.IgnoreTarget(player_index)

                    end

                    if data['Force Safety']:Get() then

                        RageBot.ForceSafety(player_index)

                    end

                    if data['High Priority']:Get() then

                        RageBot.SetTargetPriority(player_index, 100)

                    end

                    if data['Hitbox System']:Get() then

                        for i = 0, 18 do

                            if data['Disable Hitbox']:Get(i + 1) then
                                RageBot.EnableHitbox(player_index, i, false)
                            end

                            if data['Disable Multipoint']:Get(i + 1) then
                                RageBot.EnableMultipoints(player_index, i, false)
                            end

                        end

                    end

                end

            end

        end

    end

end



local antiaim = {}

antiaim.state_list = {"Shared", "Standing", "Moving", "Crouching", "Slowwalk", "Air", "On Use", "Roll"}
antiaim.features_list = {"Override", "Disable Anti-Bruteforce", "Yaw Add Left", "Yaw Add Right", "Yaw Modifier", "Modifier Degree", "Fake Limit Type", "Left Limit", "Right Limit", "Fake Options", "LBY Mode", "Freestanding Desync", "Desync On Shot"}


menu["Anti-Aim"] = {}


menu["Anti-Aim"]["Anti-Aim"] = {}
antiaim_menu = menu["Anti-Aim"]["Anti-Aim"]
conditions_menu = menu["Anti-Aim"]

antiaim_menu["Enable Anti-Aim"] = Menu.Switch(tabs.antiaim, "Main", "Enable Anti-Aim", false)
antiaim_menu["Anti-Aim on Use"] = Menu.Switch(tabs.antiaim, "Main", "Anti-Aim on Use", false)
antiaim_menu["Anti-Backstab"] = Menu.Switch(tabs.antiaim, "Main", "Anti-Backstab", false)
antiaim_menu["Roll Anti-Aim"] = Menu.Switch(tabs.antiaim, "Main", "Roll Anti-Aim", false)
antiaim_menu["Roll on Manuals"] = Menu.Switch(tabs.antiaim, "Main", "Roll on Manuals", false, 'Will work only if u enable any manual (left, rigth)')
antiaim_menu["Roll Left"] = Menu.SliderInt(tabs.antiaim, "Main", "Roll Left", 45, -45, 45)
antiaim_menu["Roll Right"] = Menu.SliderInt(tabs.antiaim, "Main", "Roll Right", -45, -45, 45)
antiaim_menu["Conditions"] = Menu.Switch(tabs.antiaim, "Main", "Conditions", false)
antiaim_menu["Yaw Base"] = Menu.Combo(tabs.antiaim, "Main", "Yaw Base", {"Forward", "Backward", "Right", "Left", "At Target", "Freestanding"}, 0)
antiaim_menu["Tab"] = Menu.Combo(tabs.antiaim, "Main", "Condition", antiaim.state_list, 0)

for i, state in pairs(antiaim.state_list) do
    conditions_menu[state] = {
        ["Override"] = Menu.Switch(tabs.antiaim, state, ("Override %s"):format(state), false),
        ["Disable Anti-Bruteforce"] = Menu.Switch(tabs.antiaim, state, "Disable Anti-Bruteforce", false),
        ["Yaw Add Left"] = Menu.SliderInt(tabs.antiaim, state, "Yaw Left", 0, -180, 180),
        ["Yaw Add Right"] = Menu.SliderInt(tabs.antiaim, state, "Yaw Right", 0, -180, 180),
        ["Yaw Modifier"] = Menu.Combo(tabs.antiaim, state, "Yaw Modifier", {"Disable", "Center", "Offset", "Random", "Spin"}, 0),
        ["Modifier Degree"] = Menu.SliderInt(tabs.antiaim, state, "Modifier Degree", 0, -180, 180),
        ["Fake Limit Type"] = Menu.Combo(tabs.antiaim, state, "Fake Limit Type", {"Static", "Jitter"}, 0),
        ["Left Limit"] = Menu.SliderInt(tabs.antiaim, state, "Fake Limit Left", 0, 0, 60),
        ["Right Limit"] = Menu.SliderInt(tabs.antiaim, state, "Fake Limit Right", 0, 0, 60),
        ["Fake Options"] = Menu.MultiCombo(tabs.antiaim, state, "Fake Options", {"Avoid Overlap", "Jitter", "Randomize Jitter"}, 0),
        ["LBY Mode"] = Menu.Combo(tabs.antiaim, state, "LBY Mode", {"Disable", "Opposite", "Sway"}, 0),
        ["Freestanding Desync"] = Menu.Combo(tabs.antiaim, state, "Freestanding Desync", {"Off", "Peek Fake", "Peek Real"}, 0),
        ["Desync On Shot"] = Menu.Combo(tabs.antiaim, state, "Desync On Shot", {"Disable", "Opposite", "Freestanding", "Switch"}, 0),
    }
end

antiaim.update_menu = function()
    local is_conditions = antiaim_menu["Conditions"]:Get()
    antiaim_menu["Tab"]:SetVisible(is_conditions)

    if not is_conditions then
        antiaim_menu["Tab"]:Set(0)
    end

    antiaim_menu["Roll Right"]:SetVisible(antiaim_menu["Roll Anti-Aim"]:Get())
    antiaim_menu["Roll Left"]:SetVisible(antiaim_menu["Roll Anti-Aim"]:Get())
    antiaim_menu["Roll on Manuals"]:SetVisible(antiaim_menu["Roll Anti-Aim"]:Get())

    for i, state in pairs(antiaim.state_list) do
        local tab_index = (antiaim_menu["Tab"]:Get() + 1)
        local tab_name = antiaim.state_list[tab_index]

        local menu_antiaim = conditions_menu[state]
        local menu_state = (tab_name == state)

        for i, feature in pairs(antiaim.features_list) do
            menu_antiaim[feature]:SetVisible(menu_state)
        end
        
        conditions_menu["Shared"]["Override"]:SetVisible(false)
    end
end

antiaim.update_menu()

antiaim_menu["Tab"]:RegisterCallback(antiaim.update_menu)
antiaim_menu["Conditions"]:RegisterCallback(antiaim.update_menu)
antiaim_menu["Roll Anti-Aim"]:RegisterCallback(antiaim.update_menu)



antiaim.hostage_distance = function()
    local local_player = EntityList.GetLocalPlayer()
    if not local_player then
        return false
    end

    local host_ent = EntityList.GetEntitiesByClassID(97)
    local multi_hosts_dist = {}

    for i, host in pairs(host_ent) do
        local host_origin = host:GetRenderOrigin()
        local local_origin = local_player:GetRenderOrigin()
        local dist = host_origin:DistTo(local_origin)

        table.insert(multi_hosts_dist, dist)
    end

    local min_dist = math.floor(math.min(unpack(multi_hosts_dist)))

    if math.floor(min_dist) < 70 and not (math.floor(min_dist) == 0) then
        return false
    end

    return true
end

antiaim.defuse_bomb_distance = function()
    local local_player = EntityList.GetLocalPlayer()
    if not local_player then
        return false
    end

    local curr_team = local_player:GetProp("m_iTeamNum")
    local bomb_ent = EntityList.GetEntitiesByClassID(129)

    if table.getn(bomb_ent) > 0 then
        local bomb_origin = bomb_ent[1]:GetRenderOrigin()
        local local_origin = local_player:GetRenderOrigin()
        local dist = bomb_origin:DistTo(local_origin)
        
        if dist <= 90 and curr_team ~= 2 then   
            return false
        end
    end

    return true
end

antiaim.legit_aa_time = GlobalVars.realtime
antiaim.in_use = false

antiaim.allow_on_use = function()
    if not antiaim_menu["Enable Anti-Aim"]:Get() then
        return
    end

    if not antiaim_menu["Anti-Aim on Use"]:Get() then
        return
    end

    if Cheat.IsKeyDown(0x45) and antiaim.defuse_bomb_distance() and antiaim.hostage_distance() then
        antiaim.in_use = false

        if (GlobalVars.realtime >= antiaim.legit_aa_time + 0.2) then
            if (antiaim.in_use == false) then
                EngineClient.ExecuteClientCmd("+use")
                antiaim.in_use = true
            end
            if (antiaim.in_use == true) then
                EngineClient.ExecuteClientCmd("-use")
            end
        else
            if (antiaim.in_use == true) then
                EngineClient.ExecuteClientCmd("-use")
                antiaim.in_use = false
            end
            antiaim.legit_aa_time = GlobalVars.realtime
        end
    else
        antiaim.in_use = false
    end
end

antiaim.GetManuals = function()
    local get_yaw_base = antiaim.refs["Yaw Base"]:Get()

    local freestand = (get_yaw_base == 5)
    local right = (get_yaw_base == 2)
    local left = (get_yaw_base == 3)
    local any = (left or right or freestand)

    return {
        any = any,
        left = left,
        right = right,
    }
end

antiaim.get_roll_state = function()
    if not antiaim_menu["Enable Anti-Aim"]:Get() then
        return false
    end

    if not antiaim_menu["Roll Anti-Aim"]:Get() then
        return false
    end
    
    if antiaim_menu["Roll on Manuals"]:Get() and not (antiaim.GetManuals().right or antiaim.GetManuals().left) then
        return false
    end

    return true
end

antiaim.GetPlayerState = function()
    local local_player = EntityList.GetLocalPlayer()
    if not local_player then
        return nil
    end

    local flags = local_player:GetProp("m_fFlags")
    local velocity = local_player:GetProp("m_vecVelocity"):Length2D()

    local is_in_air = bit.band(flags, 1)
    local is_crouching = bit.band(flags, 6)

    if antiaim.get_roll_state() then return 'Roll' end

    if antiaim.in_use then return "On Use" end

    if (is_in_air == 0) or Cheat.IsKeyDown(0x20) then return "Air" end

    if (is_crouching == 6) then return "Crouching" end

    if vars.slowmo_ref:Get() and velocity > 3 then return "Slowwalk" end

    if velocity > 3 then return "Moving" end

    return "Standing"
end

antiaim.GetDesync = function()
    local local_player = EntityList.GetLocalPlayer()
    if not local_player then
        return 0
    end

    local degree = math.normalize(AntiAim.GetCurrentRealRotation() - local_player:GetProp("m_angEyeAngles[1]"))
    return math.abs(math.floor(tonumber(string.format("%.2f", (math.clamp(degree, AntiAim.GetMinDesyncDelta(), AntiAim.GetMaxDesyncDelta()))))))
end


antiaim.refs = {}

antiaim.refs["Pitch"] =                 Menu.FindVar("Aimbot", "Anti Aim", "Main", "Pitch")
antiaim.refs["Yaw Base"] =              Menu.FindVar("Aimbot", "Anti Aim", "Main", "Yaw Base")
antiaim.refs["Yaw Add"] =               Menu.FindVar("Aimbot", "Anti Aim", "Main", "Yaw Add")
antiaim.refs["Yaw Modifier"] =          Menu.FindVar("Aimbot", "Anti Aim", "Main", "Yaw Modifier")
antiaim.refs["Modifier Degree"] =       Menu.FindVar("Aimbot", "Anti Aim", "Main", "Modifier Degree")
antiaim.refs["Left Limit"] =            Menu.FindVar("Aimbot", "Anti Aim", "Fake Angle", "Left Limit")
antiaim.refs["Right Limit"] =           Menu.FindVar("Aimbot", "Anti Aim", "Fake Angle", "Right Limit")
antiaim.refs["Fake Options"] =          Menu.FindVar("Aimbot", "Anti Aim", "Fake Angle", "Fake Options")
antiaim.refs["LBY Mode"] =              Menu.FindVar("Aimbot", "Anti Aim", "Fake Angle", "LBY Mode")
antiaim.refs["Freestanding Desync"] =   Menu.FindVar("Aimbot", "Anti Aim", "Fake Angle", "Freestanding Desync")
antiaim.refs["Desync On Shot"] =        Menu.FindVar("Aimbot", "Anti Aim", "Fake Angle", "Desync On Shot")




antiaim.antibruteforce = {}

antiaim.antibruteforce.limits = {
    min = 2,
    max = 10,
}

menu["Anti-Aim"]["Anti-Bruteforce"] = {}

menu["Anti-Aim"]["Anti-Bruteforce"]["Enable Anti-Bruteforce"] = Menu.Switch(tabs.antibruteforce, "Anti-Bruteforce", "Enable", false)

menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"] = Menu.SliderInt(tabs.antibruteforce, 'Anti-Bruteforce', 'Phases Count', antiaim.antibruteforce.limits.min, antiaim.antibruteforce.limits.min, antiaim.antibruteforce.limits.max)
menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:SetVisible(false)

antiaim.antibruteforce.create_phase = Menu.Button(tabs.antibruteforce, 'Anti-Bruteforce', 'Create new phase', '', function()
    if menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Get() < antiaim.antibruteforce.limits.max then
        menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Set(menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Get() + 1)
    end
end)

antiaim.antibruteforce.remove_phase = Menu.Button(tabs.antibruteforce, 'Anti-Bruteforce', 'Remove last phase', '', function()
    if menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Get() > antiaim.antibruteforce.limits.min then
        menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Set(menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Get() - 1)
    end
end)


menu["Anti-Aim"]["Anti-Bruteforce Phases"] = {}

for i = 1, antiaim.antibruteforce.limits.max do
    menu["Anti-Aim"]["Anti-Bruteforce Phases"][i] = Menu.SliderInt(tabs.antibruteforce, 'Phases', ('[Phase %i] Fake Limit'):format(i), 0, -60, 60)
end

antiaim.antibruteforce.MenuVisible = function()

    local global_state = menu["Anti-Aim"]["Anti-Bruteforce"]["Enable Anti-Bruteforce"]:Get()

    antiaim.antibruteforce.create_phase:SetVisible(global_state)
    antiaim.antibruteforce.remove_phase:SetVisible(global_state)

    for i = 1, #menu["Anti-Aim"]["Anti-Bruteforce Phases"] do

        if menu["Anti-Aim"]["Anti-Bruteforce Phases"][i] then

            menu["Anti-Aim"]["Anti-Bruteforce Phases"][i]:SetVisible(i <= menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Get() and global_state)

        end

    end
end

antiaim.antibruteforce.MenuVisible()

menu["Anti-Aim"]["Anti-Bruteforce"]["Enable Anti-Bruteforce"]:RegisterCallback(antiaim.antibruteforce.MenuVisible)
antiaim.antibruteforce.create_phase:RegisterCallback(antiaim.antibruteforce.MenuVisible)
antiaim.antibruteforce.remove_phase:RegisterCallback(antiaim.antibruteforce.MenuVisible)






antiaim.antibruteforce.work_blyad = true
antiaim.antibruteforce.distance = 150 -- дистанция при которой он работает
antiaim.antibruteforce.last_handled_tick = -1 -- последний тик когда сработал антибрут
antiaim.antibruteforce.current_phase = 0 -- текущая фаза -- 0 = выключено
antiaim.antibruteforce.update_time = 0 -- время последнего срабатывания
antiaim.antibruteforce.active_time = 5 -- seconds

antiaim.antibruteforce.on_event = function(event)
    if not menu["Anti-Aim"]["Anti-Bruteforce"]["Enable Anti-Bruteforce"]:Get() then
        return
    end

    if event:GetName() ~= "bullet_impact" then
        return
    end

    if not antiaim.antibruteforce.work_blyad then
        return
    end

    if antiaim.antibruteforce.last_handled_tick == GlobalVars.tickcount then
        return
    end

    local localplayer = EntityList.GetLocalPlayer()
    if not localplayer or not localplayer:IsAlive() then
        return
    end

    local userid = event:GetInt("userid")
    local player_object = EntityList.GetPlayerForUserID(userid)
    if not player_object or player_object:IsDormant() or player_object:IsTeamMate() then
        return
    end

    local eye_position = localplayer:GetEyePosition()
    if not eye_position then
        return
    end

    local enemy_eye_position = player_object:GetEyePosition()
    if not enemy_eye_position then
        return
    end

    local impact_vector = Vector.new(event:GetFloat("x"), event:GetFloat("y"), event:GetFloat("z"))
    
    local distance_to_local = math.closest_point_on_ray(enemy_eye_position, impact_vector, eye_position):DistTo(eye_position)

    if distance_to_local > antiaim.antibruteforce.distance then
        return
    end

    antiaim.antibruteforce.last_handled_tick = GlobalVars.tickcount
    
    -- это сделано что бы начинать антибрут с фазы которая противоположна текущему углу
    if antiaim.antibruteforce.current_phase ~= 0 then
        antiaim.antibruteforce.current_phase = antiaim.antibruteforce.current_phase + 1
        if antiaim.antibruteforce.current_phase > menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Get() then
            antiaim.antibruteforce.current_phase = 1
        end
    else
        local inverter = AntiAim.GetInverterState() and 1 or -1

        antiaim.antibruteforce.current_phase = 1

        for i = 1, menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Get() do
            local angle = menu["Anti-Aim"]["Anti-Bruteforce Phases"][i]:Get()

            if angle * inverter > 0 then
                antiaim.antibruteforce.current_phase = i
                break
            end
        end

    end

    antiaim.antibruteforce.update_time = GlobalVars.realtime + antiaim.antibruteforce.active_time
end

local antibackstab = {}

antibackstab.update = function()
    if not antiaim_menu["Anti-Backstab"]:Get() then
        return false
    end

    local local_player = EntityList.GetLocalPlayer()
    if not local_player or not local_player:IsAlive() then
        return false
    end

    local players = EntityList.GetPlayers()
    if not players or #players < 0 then
        return false
    end

    local local_origin = local_player:GetRenderOrigin()

    local enemy_w_knife = table.filter(players, function(player)
        return (not player:IsDormant() and player:IsEnemy() and player:IsAlive() and player:GetActiveWeapon() and player:GetActiveWeapon():IsKnife())
    end)

    local dist_to_local_enemy = table.filter(enemy_w_knife, function(player)
        return (local_origin:DistTo(player:GetRenderOrigin()) < 150)
    end)

    if #dist_to_local_enemy > 0 then
        return true
    end

    return false
end

antiaim.angle_vec = function(angles)
    local forward, right = Vector.new(), Vector.new()

    local pitch, yaw, roll = angles.pitch * math.pi_divided, angles.yaw * math.pi_divided, angles.roll * math.pi_divided
    local cp = math.cos(pitch)
    local sp = math.sin(pitch)

    local cy = math.cos(yaw)
    local sy = math.sin(yaw)

    local cr = math.cos(roll)
    local sr = math.sin(roll)

    forward.x = cp * cy
    forward.y = cp * sy
    forward.z = -sp

    right.x = -1 * sr * sp * cy + -1 * cr * -sy
    right.y = -1 * sr * sp * sy + -1 * cr * cy
    right.z = -1 * sr * cp

    return forward, right
end

antiaim.actual_mov = Vector2.new(0, 0)
antiaim.mov_fix = function(cmd)
    local frL, riL = antiaim.angle_vec(QAngle.new(0, cmd.viewangles.yaw, 0))
    local frC, riC = antiaim.angle_vec(cmd.viewangles)

    frL.z = 0
    riL.z = 0
    frC.z = 0
    riC.z = 0

    frL = frL / frL:Length()
    riL = riL / riL:Length()
    frC = frC / frC:Length()
    riC = riC / riC:Length()

    local worldCoords = frL * actual_mov.x + riL * actual_mov.y;

    cmd.sidemove = (frC.x * worldCoords.y - frC.y * worldCoords.x) / (riC.y * frC.x - riC.x * frC.y)
    cmd.forwardmove = (riC.y * worldCoords.x - riC.x * worldCoords.y) / (riC.y * frC.x - riC.x * frC.y)
end

antiaim.roll = function(cmd)
    if not antiaim.get_roll_state() then
        return
    end

    cmd.viewangles.roll = AntiAim.GetInverterState() and antiaim_menu["Roll Left"]:Get() or antiaim_menu["Roll Right"]:Get()
end

antiaim.roll_movement = function(cmd)
    if not antiaim.get_roll_state() then
        return
    end

    actual_mov = Vector2.new(cmd.forwardmove, cmd.sidemove)
    antiaim.mov_fix(cmd)
end


antiaim.on_prediction = function()
    if not antiaim_menu["Enable Anti-Aim"]:Get() then
        return
    end
    
    local player_state = antiaim.GetPlayerState()
    if not player_state then
        return
    end

    local is_inverted = AntiAim.GetInverterState()
    local data = conditions_menu[player_state]

    if not (data["Override"]:Get() and antiaim_menu["Conditions"]:Get()) then
        data = conditions_menu["Shared"]
    end

    for key, aa_ref in pairs(antiaim.refs) do
        local get_value = function()
            if (key == "Pitch") then
                return antiaim.in_use and 0 or 1
            end

            if (key == "Yaw Base") then
                return antiaim.in_use and 0 or antiaim_menu["Yaw Base"]:Get()
            end

            if antiaim.antibruteforce.current_phase ~= 0 and key == "Yaw Modifier" then
                return 0
            end

            if (key == "Yaw Add") then
                return is_inverted and data["Yaw Add Left"]:Get() or data["Yaw Add Right"]:Get()
            end

            if (data["Fake Limit Type"]:Get() == 1) then
                local tickcount = GlobalVars.tickcount % 4 > 1

                if (key == "Left Limit") then
                    return tickcount and data["Left Limit"]:Get() or 18
                end

                if (key == "Right Limit") then
                    return tickcount and data["Right Limit"]:Get() or 18
                end
            end

            return data[key]:Get()
        end

        local value = get_value()

        antiaim.refs[key]:Set(value)
    end

    if antibackstab.update() and not antiaim.in_use then
        antiaim.refs["Yaw Base"]:Set(4)
        antiaim.refs["Yaw Add"]:Set(180)
    end

    antiaim.antibruteforce.work_blyad = not data["Disable Anti-Bruteforce"]:Get()

    if not antiaim.antibruteforce.work_blyad or antiaim.antibruteforce.current_phase == 0 or antiaim.antibruteforce.update_time < GlobalVars.realtime then
        antiaim.antibruteforce.current_phase = 0
        return
    end


    local menu_item = menu["Anti-Aim"]["Anti-Bruteforce Phases"][antiaim.antibruteforce.current_phase]
    if not menu_item then
        return
    end

    local angle = menu_item:Get()

    AntiAim.OverrideInverter(angle < 0)
    AntiAim.OverrideLimit(math.abs(angle))
end




menu["Anti-Aim"]["Animations"] = {}

menu["Anti-Aim"]["Animations"]["Pitch on Land"] = Menu.Switch(tabs.antiaim, "Misc", "Pitch on Land", false)
menu["Anti-Aim"]["Animations"]["Static Air Legs"] = Menu.Switch(tabs.antiaim, "Misc", "Static Air Legs", false)
menu["Anti-Aim"]["Animations"]["Static Landing Legs"] = Menu.Switch(tabs.antiaim, "Misc", "Static Landing Legs", false)

animation_breaker.set_params = function(player_ptr, layer, start_val, end_val)

    player_ptr = ffi.cast("unsigned int", player_ptr)

    if player_ptr == 0x0 then
        return false
    end

    local studio_hdr = ffi.cast("void**", player_ptr + ffi_handler.offsets.m_pStudioHdr)[0]

    if studio_hdr == nil then
        return false
    end

    local pose_params = ffi_handler.get_pose_parameters(studio_hdr, layer)

    if pose_params == nil then
        return
    end

    if animation_breaker.cache[layer] == nil then
        animation_breaker.cache[layer] = {}

        animation_breaker.cache[layer].m_flStart = pose_params.m_flStart
        animation_breaker.cache[layer].m_flEnd = pose_params.m_flEnd

        animation_breaker.cache[layer].m_flState = pose_params.m_flState

        animation_breaker.cache[layer].installed = false
        return true
    end

    if start_val ~= nil and not animation_breaker.cache[layer].installed then

        pose_params.m_flStart   = start_val
        pose_params.m_flEnd     = end_val

        pose_params.m_flState   = (pose_params.m_flStart + pose_params.m_flEnd) / 2

        animation_breaker.cache[layer].installed = true
        return true
    end
    
    if animation_breaker.cache[layer].installed then

        pose_params.m_flStart   = animation_breaker.cache[layer].m_flStart
        pose_params.m_flEnd     = animation_breaker.cache[layer].m_flEnd

        pose_params.m_flState   = animation_breaker.cache[layer].m_flState

        animation_breaker.cache[layer].installed = false

        return true
    end

    return false
end

animation_breaker.handle_prediction = function(cmd)

    local local_player = ffi_handler.get_client_entity(EngineClient.GetLocalPlayer())

    if local_player == nil then
        return
    end

    local local_player_addr = ffi.cast("unsigned int", local_player)

    if local_player_addr == 0x0 then
        return
    end

    local animstate = ffi.cast( "void**", local_player_addr + ffi_handler.offsets.animstate)[0]

    if animstate == nil then
        return
    end

    animstate = ffi.cast("unsigned int", animstate)

    if animstate == 0x0 then
        return
    end
    
    local landing_anim = ffi.cast("bool*", animstate + ffi_handler.offsets.landing_anim)[0]

    if landing_anim == nil then
        return
    end

    if menu["Anti-Aim"]["Animations"]["Static Landing Legs"]:Get() then
        animation_breaker.set_params(local_player, 0, -180, -179)
    end

    if menu["Anti-Aim"]["Animations"]["Static Air Legs"]:Get() then
        animation_breaker.set_params(local_player, 6, 0.9, 1)
    end
    
    if menu["Anti-Aim"]["Animations"]["Pitch on Land"]:Get() and landing_anim and bit.band(cmd.buttons, 2) == 0 then
        animation_breaker.set_params(local_player, 12, 0.999, 1)
    end

end

animation_breaker.handle_cmove = function()

    local local_player = ffi_handler.get_client_entity(EngineClient.GetLocalPlayer())

    if local_player == nil then
        return
    end

    for k, v in pairs(animation_breaker.cache) do
        animation_breaker.set_params(local_player, k)
    end

end

animation_breaker.on_destroy = function()

    local local_player = ffi_handler.get_client_entity(EngineClient.GetLocalPlayer())

    if local_player == nil then
        return
    end

    for k, v in pairs(animation_breaker.cache) do
        animation_breaker.set_params(local_player, k)
    end

end





menu["Visual"] = {}



local binds = {}

menu["Visual"]["Binds"] = {}
binds_menu = menu["Visual"]["Binds"]

binds_menu["Enable indicators"] = Menu.MultiCombo(tabs.visual, "Visual", "Indicators", {"Desync & Line / State", "Script name", "Binds", "Min. Damage"}, 0)
binds_menu["Binds"] = Menu.MultiCombo(tabs.visual, "Visual", "Binds", {"Double Tap", "Hide Shots", "Minimum Damage"}, 0)
binds_menu["Indicators Type"]   = Menu.Combo(tabs.visual, "Visual", "Indicators type", {"Default", "Pixel"}, 0)

binds_menu["Min Damage X"] = Menu.SliderInt(tabs.visual, "Colors", "[Min. Damage] X", math.floor(vars.screen.x / 2), 0, math.floor(vars.screen.x))
binds_menu["Min Damage Y"] = Menu.SliderInt(tabs.visual, "Colors", "[Min. Damage] Y", math.floor(vars.screen.y / 2), 0, math.floor(vars.screen.y))

binds_menu["Script name Color"] = Menu.ColorEdit(tabs.visual, "Colors", "[Indicators] Script name", Color.RGBA(150, 150, 255))
binds_menu["Desync Line Color"] = Menu.ColorEdit(tabs.visual, "Colors", "[Indicators] Desync", Color.RGBA(150, 150, 255))

binds.menu_update = function()
    local state = binds_menu["Enable indicators"]

    binds_menu["Script name Color"]:SetVisible(state:Get(2))
    binds_menu["Desync Line Color"]:SetVisible(state:Get(1))
    binds_menu["Min Damage X"]:SetVisible(state:Get(4))
    binds_menu["Min Damage Y"]:SetVisible(state:Get(4))
    binds_menu["Binds"]:SetVisible(state:Get(3))
end

binds.menu_update()

binds_menu["Enable indicators"]:RegisterCallback(binds.menu_update)

local min_damage = {}

min_damage.on_draw = function()
    if not binds_menu["Enable indicators"]:Get(4) then
        return
    end

    local local_player = EntityList.GetLocalPlayer()

    if not local_player or not local_player:IsAlive() then
        return
    end

    local x, y = binds_menu["Min Damage X"]:Get(), binds_menu["Min Damage Y"]:Get()

    Render.Text(tostring(vars.minimum_damage:Get()), Vector2.new(x, y), Color.new(1.0, 1.0, 1.0), font.pixel.size, font.pixel.init, true)
end


local mt = {
    name = "",
    alpha = 0,
    add_y = 13,
    color = Color.RGBA(0, 255, 0),

    GetName = function(self)
        return self.name
    end,

    GetColor = function(self)
        return self.color
    end,

    GetBool = function()
        return true
    end,

    CustomRender = function(name, vector, color)
        Render.ShadowText(name, vector, color, font.verdana, true, true)
    end,
}

binds.data = {}

binds.data.CreateObject = function(self, array)
    table.insert(self, setmetatable(array, {__index = mt}))
end


-- @type: default

binds.data:CreateObject({
    name = "0°",

    GetName = function(self)
        local desync = antiaim.GetDesync()
        self.name = ("%s°"):format(desync)

        return self.name
    end,

    GetColor = function()
        local color = binds_menu["Desync Line Color"]:Get()
        color.a = 1.0
        
        return color
    end,

    GetBool = function()
        return binds_menu["Enable indicators"]:Get(1) and binds_menu["Indicators Type"]:Get() == 0 and antiaim.antibruteforce.current_phase == 0
    end,

    CustomRender = function(name, vector, color)
        local w = (90 / 60 * antiaim.GetDesync())

        Render.ShadowText(name, Vector2.new(vector.x, vector.y - 10), Color.new(1.0, 1.0, 1.0, color.a), font.verdana, true, true)
        Render.HorizontalGradient(vector.x - w / 2, vector.y, w, 1, color, Color.new(color.r, color.g, color.b, 0))
    end,
})

binds.data:CreateObject({
    name = "",

    GetName = function(self)
        local desync = antiaim.GetDesync()
        self.name = ("%s°"):format(desync)

        return self.name
    end,

    GetColor = function()
        local color = binds_menu["Desync Line Color"]:Get()
        color.a = 1.0
        
        return color
    end,

    GetBool = function()
        return binds_menu["Enable indicators"]:Get(1) and binds_menu["Indicators Type"]:Get() == 0 and antiaim.antibruteforce.current_phase ~= 0
    end,

    CustomRender = function(name, vector, color)
        local w = 90 / 5 * (antiaim.antibruteforce.update_time - GlobalVars.realtime)
        name = ('Phase: %s'):format(antiaim.antibruteforce.current_phase)
        
        Render.ShadowText(name, Vector2.new(vector.x, vector.y - 10), Color.new(1.0, 1.0, 1.0, color.a), font.verdana, true, true)
        Render.HorizontalGradient(vector.x - w / 2, vector.y, w, 1, color, Color.new(color.r, color.g, color.b, 0))
    end,
})

binds.data:CreateObject({
    name = "AARNE YAW",

    GetName = function(self)
        if antiaim.in_use then
            return "LEGIT AA"
        end

        if antiaim.GetManuals().any then
            return "MANUAL AA"
        end

        return self.name
    end,

    GetColor = function()
        local color = binds_menu["Script name Color"]:Get()
        color.a = 1.0
        
        return color
    end,

    GetBool = function()
        return binds_menu["Enable indicators"]:Get(2) and binds_menu["Indicators Type"]:Get() == 0
    end,
})

binds.data:CreateObject({
    name = "DT",

    GetColor = function()
        local dt_charge = Exploits.GetCharge()

        return Color.new(1.0 - (1.0 * dt_charge), dt_charge, 0.0)
    end,
    
    GetBool = function()
        if vars.dt_ref:Get() and binds_menu["Enable indicators"]:Get(3) and binds_menu["Indicators Type"]:Get() == 0 and binds_menu["Binds"]:Get(1) then
            return true
        end

        return false
    end,

    CustomRender = function(name, vector, color)
        local dt_charge = Exploits.GetCharge()

        Render.ShadowText(name, vector, color, font.verdana, true, true)
        Render.Circle(Vector2.new(vector.x - 13, vector.y), 4, 30, color, 1.6, 0, 360 * dt_charge)
    end,
})

binds.data:CreateObject({
    name = "ON-SHOT",

    GetBool = function()
        if vars.hs_ref:Get() and not vars.dt_ref:Get() and binds_menu["Enable indicators"]:Get(3) and binds_menu["Indicators Type"]:Get() == 0 and binds_menu["Binds"]:Get(2) then
            return true
        end

        return false
    end,
})

binds.data:CreateObject({
    name = "DMG",

    GetBool = function()
        local CheatBinds = Cheat.GetBinds()

        for i, bind in ipairs(CheatBinds) do
            local bind_name = bind:GetName()
            local bind_is_active = bind:IsActive()

            if (bind_name == "Minimum Damage") and bind_is_active and binds_menu["Enable indicators"]:Get(3) and binds_menu["Indicators Type"]:Get() == 0 and binds_menu["Binds"]:Get(3) then
                return true
            end
        end

        return false
    end
})



-- @type: pixel

local pixel_color_1 = Color.new(1.0, 1.0, 1.0)
local pixel_color_2 = Color.new(1.0, 1.0, 1.0)

binds.data:CreateObject({
    name = "AARNE-YAW",
    add_y = 10,

    GetName = function(self)
        return self.name
    end,

    GetColor = function()
        local color = binds_menu["Script name Color"]:Get()
        color.a = 1.0
        
        return color
    end,

    GetBool = function()
        return binds_menu["Enable indicators"]:Get(2) and binds_menu["Indicators Type"]:Get() == 1
    end,

    CustomRender = function(name, vector, color)
        local is_inverted = AntiAim.GetInverterState()

        pixel_color_1 = math.lerp(pixel_color_1, is_inverted and Color.new(1.0, 1.0, 1.0, color.a) or color)
        pixel_color_2 = math.lerp(pixel_color_2, is_inverted and color or Color.new(1.0, 1.0, 1.0, color.a))

        Render.Text("AARNE-\x20\x20\x20", vector, pixel_color_1, font.pixel.size, font.pixel.init, true, true)

        local text_size = Render.CalcTextSize("AARNE-", font.pixel.size, font.pixel.init) - Render.CalcTextSize("\x20\x20\x20", font.pixel.size, font.pixel.init)

        vector.x = vector.x + text_size.x
        Render.Text("YAW", vector, pixel_color_2, font.pixel.size, font.pixel.init, true, true)
    end,
})

binds.data:CreateObject({
    name = '',
    add_y = 10,

    GetName = function()
        return ('PHASE: %s'):format(antiaim.antibruteforce.current_phase)
    end,

    GetColor = function()
        return Color.new(1.0, 1.0, 1.0)
    end,

    GetBool = function()
        return binds_menu["Enable indicators"]:Get(1) and binds_menu["Indicators Type"]:Get() == 1 and antiaim.antibruteforce.current_phase ~= 0
    end,

    CustomRender = function(name, vector, color)
        Render.Text(name, vector, color, font.pixel.size, font.pixel.init, true, true)

        local name_size = Render.CalcTextSize(name, font.pixel.size, font.pixel.init)
        local val = antiaim.antibruteforce.update_time - GlobalVars.realtime
        Render.Circle(Vector2.new(vector.x - name_size.x / 2 - 6, vector.y), 3, 30, color, 1, 0, 360 / 5 * val)
    end,
})

binds.data:CreateObject({
    name = "",
    add_y = 10,

    GetName = function(self)
        local state = antiaim.GetPlayerState()

        if state then
            return ("%s"):format(state)
        end

        return self.name
    end,

    GetColor = function()
        return Color.new(1.0, 1.0, 1.0)
    end,

    GetBool = function()
        return binds_menu["Enable indicators"]:Get(1) and binds_menu["Indicators Type"]:Get() == 1 and antiaim.antibruteforce.current_phase == 0
    end,

    CustomRender = function(name, vector, color)
        Render.Text(name, vector, color, font.pixel.size, font.pixel.init, true, true)
    end,
})

binds.data:CreateObject({
    name = "DT",
    add_y = 10,

    GetColor = function()
        local dt_charge = Exploits.GetCharge()

        return Color.new(1.0 - (1.0 * dt_charge), dt_charge, 0.0)
    end,
    
    GetBool = function()
        if vars.dt_ref:Get() and binds_menu["Enable indicators"]:Get(3) and binds_menu["Indicators Type"]:Get() == 1 and binds_menu["Binds"]:Get(1) then
            return true
        end

        return false
    end,

    CustomRender = function(name, vector, color)
        Render.Text(name, vector, color, font.pixel.size, font.pixel.init, true, true)
    end,
})

binds.data:CreateObject({
    name = "HS",
    add_y = 10,

    GetBool = function()
        if vars.hs_ref:Get() and not vars.dt_ref:Get() and binds_menu["Enable indicators"]:Get(3) and binds_menu["Indicators Type"]:Get() == 1 and binds_menu["Binds"]:Get(2) then
            return true
        end

        return false
    end,

    CustomRender = function(name, vector, color)
        Render.Text(name, vector, color, font.pixel.size, font.pixel.init, true, true)
    end,
})

binds.data:CreateObject({
    name = "DMG",
    add_y = 10,

    GetColor = function()
        return Color.RGBA(204, 183, 106)
    end,

    GetBool = function()
        local CheatBinds = Cheat.GetBinds()

        for i, bind in ipairs(CheatBinds) do
            local bind_name = bind:GetName()
            local bind_is_active = bind:IsActive()

            if (bind_name == "Minimum Damage") and bind_is_active and binds_menu["Enable indicators"]:Get(3) and binds_menu["Indicators Type"]:Get() == 1 and binds_menu["Binds"]:Get(3) then
                return true
            end
        end

        return false
    end,

    CustomRender = function(name, vector, color)
        Render.Text(name, vector, color, font.pixel.size, font.pixel.init, true, true)
    end,
})




binds.GetActiveBinds = function(self)
    local active_binds = {}

    for i, data in ipairs(self.data) do
        data.alpha = math.lerp(data.alpha, data:GetBool() and 255 or 0, 0.095)

        if data.alpha > 1 then
            table.insert(active_binds, data)
        end
    end

    return active_binds
end

binds.on_draw = function()
    local local_player = EntityList.GetLocalPlayer()
    if not local_player or not local_player:IsAlive() then
        return
    end

    local x, y, plus = vars.screen.x / 2, vars.screen.y / 2, 0

    local active_data = binds:GetActiveBinds()
    for i, data in pairs(active_data) do
        local alpha = data.alpha / 255
        local color = data:GetColor()
        local name = data:GetName()

        color.a = alpha

        local off = y + (plus * data.add_y) + 30
        data.CustomRender(name, Vector2.new(x, off), color)

        plus = plus + alpha
    end
end



local arrows = {}

menu["Visual"]["Arrows"] = {}
arrows_menu = menu["Visual"]["Arrows"]

arrows_menu["Arrows"] = Menu.Combo(tabs.visual, "Visual", "Arrows", {"Disable", "Default", "TeamSkeet"}, 0)
arrows_menu["Size"] =  Menu.SliderInt(tabs.visual, "Visual", "[Arrow] Size", 9, 0, 50)
arrows_menu["Distance"] =  Menu.SliderInt(tabs.visual, "Visual", "[Arrow] Distance", 43, 0, 60)
arrows_menu["Arrow Color"] = Menu.ColorEdit(tabs.visual, "Colors", "[Arrows] Color", Color.RGBA(150, 150, 255))
arrows_menu["Inverted Color"] = Menu.ColorEdit(tabs.visual, "Colors", "[Arrows] Inverted Color", Color.RGBA(150, 150, 255))

arrows.update_menu = function()
    local state = arrows_menu["Arrows"]:Get()

    arrows_menu["Size"]:SetVisible(state == 2)
    arrows_menu["Distance"]:SetVisible(state == 1 or state == 2)
    arrows_menu["Arrow Color"]:SetVisible(state == 1 or state == 2)
    arrows_menu["Inverted Color"]:SetVisible(state == 2)
end

arrows.update_menu()

arrows_menu["Arrows"]:RegisterCallback(arrows.update_menu)

arrows.by_text = function(x, y, arr_col, is_manual)
    local distance = arrows_menu["Distance"]:Get()

    local arrow = ""
    local dist = 0

    if is_manual.left then
        arrow = "<"
        dist = -distance
    end

    if is_manual.right then
        arrow = ">"
        dist = distance
    end

    Render.ShadowText(arrow, Vector2.new(x + dist, y), arr_col, font.arrow, true, true)
end

arrows.by_poly = function(x, y, arr_col, inv_col, is_manual)
    local distance, height, size = arrows_menu["Distance"]:Get(), arrows_menu["Size"]:Get(), 5 + arrows_menu["Size"]:Get()

    local m_left = is_manual.left and arr_col or Color.RGBA(17, 17, 17, 130)
    local m_right = is_manual.right and arr_col or Color.RGBA(17, 17, 17, 130)

    local s_right = AntiAim.GetInverterState() and Color.RGBA(17, 17, 17, 130) or inv_col
    local s_left = AntiAim.GetInverterState() and inv_col or Color.RGBA(17, 17, 17, 130)

    Render.PolyFilled(m_left, Vector2.new(x - distance, y - height), Vector2.new(x - (distance + size), y), Vector2.new(x - distance, y + height))
    Render.PolyFilled(m_right, Vector2.new(x + distance, y - height), Vector2.new(x + (distance + size), y), Vector2.new(x + distance, y + height))

    Render.BoxFilled(Vector2.new(x - (distance - 2), y - height), Vector2.new(x - (distance - 2) + 2, y + height), s_left)
    Render.BoxFilled(Vector2.new(x + (distance - 2), y - height), Vector2.new(x + (distance - 2) - 2, y + height), s_right)
end

arrows.on_draw = function()
    local local_player = EntityList.GetLocalPlayer()
    if not local_player or not local_player:IsAlive() then
        return
    end

    local state = arrows_menu["Arrows"]:Get()
    if state == 0 then
        return
    end

    local x, y = vars.screen.x / 2, vars.screen.y / 2
    local is_manual = antiaim.GetManuals()
    local arr_col = arrows_menu["Arrow Color"]:Get()
    local inv_col = arrows_menu["Inverted Color"]:Get()

    arr_col.a = 1.0
    inv_col.a = 1.0

    if state == 1 then
        arrows.by_text(x, y, arr_col, is_manual)
    end
    if state == 2 then
        arrows.by_poly(x, y, arr_col, inv_col, is_manual)
    end
end



menu["Visual"]["Hitlogs"] = {}

menu["Visual"]["Hitlogs"]["Draw Type"] = Menu.MultiCombo(tabs.visual, "Visual", "Hitlogs", {"Custom Render", "Under Crosshair", "Console Print", }, 0)

local hitlogs = {}

hitlogs.data = {}

hitlogs.count = {
    "st",
    "nd",
    "rd"
}

hitlogs.shots = 0

hitlogs.hitgroup_names = {'head', 'chest', 'stomach', 'left arm', 'right arm', 'left leg', 'right leg', 'neck', '?', 'gear' }

hitlogs.reasons = { "hit", "resolver", "spread", "occlusion",  "prediction error" }

hitlogs.reset = function(event)
    if event:GetName() == "round_start" then
        hitlogs.shots = 0
    end
end

hitlogs.shot_data = {}

hitlogs.on_ragebot = function(shot)
    hitlogs.shot_data = {
        backtrack = shot.backtrack,
        hitchance = shot.hitchance,
        damage = shot.damage,
        angle = shot.angle,
    }
end


hitlogs.on_registered_shot = function(shot)
    local reason = hitlogs.reasons[shot.reason + 1]
    local name = EntityList.GetPlayer(shot.target_index):GetName() or "?"
    local hitchance = math.floor(shot.hitchance + 0.5)

    hitlogs.shots = hitlogs.shots + 1

    local count_shot = ("%i%s"):format(hitlogs.shots, hitlogs.count[hitlogs.shots] or "th")
    
    local log = nil
    local print_log = nil

    if reason == "hit" then
        print_log = ("{1, 1, 1}Registered {0.78, 1, 0}%s {1, 1, 1}shot in {0.78, 1, 0}%s's %s {1, 1, 1}[damage: {0.78, 1, 0}%s{1, 1, 1}/{0.78, 1, 0}%s {1, 1, 1}| hitchance: {0.78, 1, 0}%s{1, 1, 1}/{0.78, 1, 0}%s {1, 1, 1}| history: {0.78, 1, 0}%s{1, 1, 1}]"):format(count_shot, name, hitlogs.hitgroup_names[shot.hitgroup], shot.damage, hitlogs.shot_data.damage, hitchance, hitlogs.shot_data.hitchance, shot.backtrack)
        log = ("Registered %s shot in %s's %s [damage: %s/%s | hitchance: %s/%s | history: %s]"):format(count_shot, name, hitlogs.hitgroup_names[shot.hitgroup], shot.damage, hitlogs.shot_data.damage, hitchance, hitlogs.shot_data.hitchance, shot.backtrack)
    else
        print_log = ("{1, 1, 1}Missed {1, 0, 0}%s {1, 1, 1}shot in {1, 0, 0}%s's %s {1, 1, 1}due to {1, 0, 0}%s {1, 1, 1}[damage: {1, 0, 0}%s{1, 1, 1}/{1, 0, 0}%s {1, 1, 1}| hitchance: {1, 0, 0}%s{1, 1, 1}/{1, 0, 0}%s {1, 1, 1}| history: {1, 0, 0}%s{1, 1, 1}]"):format(count_shot, name, hitlogs.hitgroup_names[shot.hitgroup + 1], reason, shot.damage, hitlogs.shot_data.damage, hitchance, hitlogs.shot_data.hitchance, shot.backtrack)
        log = ("Missed %s shot in %s's %s due to %s [damage: %s/%s | hitchance: %s/%s | history: %s]"):format(count_shot, name, hitlogs.hitgroup_names[shot.hitgroup + 1], reason, shot.damage, hitlogs.shot_data.damage, hitchance, hitlogs.shot_data.hitchance, shot.backtrack)
    end

    if menu["Visual"]["Hitlogs"]["Draw Type"]:GetBool(3) then
        uwu.print('{0.54, 0.83, 1}[Aarne.club] ' .. print_log .. '\n')
    end

    if log and menu["Visual"]["Hitlogs"]["Draw Type"]:GetBool(1) then
        table.insert(hitlogs.data, {
            log = print_log,
            alpha = 1,
            realtime = GlobalVars.realtime,
        })
    end
end

hitlogs.on_draw = function()
    if not menu["Visual"]["Hitlogs"]["Draw Type"]:GetBool(1) then
        return
    end

    local x, y, plus = 5, 5, 0

    for i, data in ipairs(hitlogs.data) do

        data.alpha = math.lerp(data.alpha, (data.realtime + 5 < GlobalVars.realtime) and 0 or 255, 0.095)

        local alpha = data.alpha / 255

        local off = y + 13 * plus
        uwu.print(data.log, Vector2.new(x, off), alpha, font.verdana_r, false)
        --Render.ShadowText(data.log, Vector2.new(x, off), Color.new(1.0, 1.0, 1.0, alpha), font.verdana_r, true)

        plus = plus + alpha

        if data.alpha <= 0 then
            table.remove(hitlogs.data, i)
        end
    end
end


hitlogs.on_hurt = function(event)
    if not (event:GetName() == "player_hurt") then
        return
    end

    if not menu["Visual"]["Hitlogs"]["Draw Type"]:GetBool(2) then
        return
    end

    local local_player = EntityList.GetLocalPlayer()
    local userid = EntityList.GetPlayerForUserID(event:GetInt("userid", 0))
    local attacker = EntityList.GetPlayerForUserID(event:GetInt("attacker", 0))

    if not (local_player == attacker) then
        return
    end

    local target_name = userid:GetName()
    local health = event:GetInt("health", 0)
    local damage = event:GetInt("dmg_health", 0)
    local hitgroup = event:GetInt("hitgroup", 0)
    local hitgroup_name = hitlogs.hitgroup_names[hitgroup] or "?"

    local log = ("%s %s -%s (%s)"):format(target_name, hitgroup_name, damage, health)

    binds.data:CreateObject({
        name = log,
        time = GlobalVars.realtime,

        GetBool = function(self)
            if self.time + 5 < GlobalVars.realtime then
                return false
            end
            return true
        end,

        GetColor = function()
            if health <= 0 then
                return Color.new(0.5, 0.2, 0.2)
            end

            return Color.new(1.0, 1.0, 1.0)
        end,

        CustomRender = function(name, vector, color)
            vector.y = vector.y + 20
            Render.ShadowText(name, vector, color, font.verdana, true, true)
        end
    })
end



local snaplines = {}

menu["Visual"]["Snaplines"] = {}

menu["Visual"]["Snaplines"]["Enable and Color"] = Menu.SwitchColor(tabs.visual, "Visual", "Snaplines", false, Color.RGBA(255, 255, 255, 100))

snaplines.on_draw = function()
    if not menu["Visual"]["Snaplines"]["Enable and Color"]:GetBool() then
        return
    end

    local snap_color = menu["Visual"]["Snaplines"]["Enable and Color"]:GetColor()

    local hitbox = 4
    local players = EntityList.GetPlayers()
    local local_player = EntityList.GetLocalPlayer()

    if not local_player or not local_player:IsAlive() or not players or #players < 1 then
        return
    end
    
    local local_hitbox = local_player:GetHitboxCenter(hitbox)
    local local_hitbox_2d = Render.WorldToScreen(local_hitbox)

    if not vars.thirdperson:Get() then
        local_hitbox_2d = Vector2.new(vars.screen.x / 2, vars.screen.y)
    end

    for i, player in ipairs(players) do
        if player:IsEnemy() and player:IsAlive() and not player:IsDormant() then
            local player_hitbox = player:GetHitboxCenter(hitbox)
            local player_hitbox_2d = Render.WorldToScreen(player_hitbox)

            Render.Line(local_hitbox_2d, player_hitbox_2d, snap_color)
        end
    end
end




local hitmarker = {}

menu["Visual"]["Hitmarker"] = {}
menu["Visual"]["Hitmarker"]["Enable Hitmarker"] = Menu.MultiCombo(tabs.visual, "Visual", "Hitmarker", {'Damage', 'Сross'}, 0)

menu["Visual"]["Hitmarker"]['Color'] = Menu.ColorEdit(tabs.visual, 'Colors', '[Hitmarker] Color', Color.RGBA(255, 255, 255))

hitmarker.update_menu = function()
    local state = menu["Visual"]["Hitmarker"]["Enable Hitmarker"]:Get(1) or menu["Visual"]["Hitmarker"]["Enable Hitmarker"]:Get(2)
    menu["Visual"]["Hitmarker"]['Color']:SetVisible(state)
end

hitmarker.update_menu()

menu["Visual"]["Hitmarker"]["Enable Hitmarker"]:RegisterCallback(hitmarker.update_menu)

hitmarker.data = {}

hitmarker.on_hurt = function(event)
    if not menu["Visual"]["Hitmarker"]["Enable Hitmarker"]:Get(1) and not menu["Visual"]["Hitmarker"]["Enable Hitmarker"]:Get(2) then
        return
    end

    if not (event:GetName() == "player_hurt") then
        return
    end

    local local_player = EntityList.GetLocalPlayer()
    if not local_player then
        return
    end

    local userid = EntityList.GetPlayerForUserID(event:GetInt("userid", 0))
    local attacker = EntityList.GetPlayerForUserID(event:GetInt("attacker", 0))

    if not (local_player == attacker) then
        return
    end

    local local_weapon = local_player:GetActiveWeapon()
    if not local_weapon or not local_weapon:IsGun() then
        return
    end

    local damage = event:GetInt("dmg_health", 0)
    local hitgroup = event:GetInt("hitgroup", 0)

    local userid_hitbox = userid:GetHitboxCenter(hitgroup)

    local color = menu["Visual"]["Hitmarker"]['Color']:Get()

    table.insert(hitmarker.data, {
        alpha = 1,
        move = 1,
        color = color,
        damage = damage,
        hitgroup = hitgroup,
        userid_hitbox = userid_hitbox,

        realtime = GlobalVars.realtime,
    })
end

hitmarker.on_draw = function()
    for i, data in ipairs(hitmarker.data) do
        local hitgroup = data.hitgroup
        local userid_hitbox = data.userid_hitbox

        if not userid_hitbox or not userid_hitbox.x then
            return
        end

        local userid_hitbox_2d = Render.WorldToScreen(userid_hitbox)

        local damage = tostring(data.damage)

        data.alpha = math.lerp(data.alpha, data.move >= 200 and 0 or 255, 0.095)
        local alpha = data.alpha / 255

        data.color.a = alpha

        if menu["Visual"]["Hitmarker"]["Enable Hitmarker"]:Get(2) then
            Render.FilledBox(userid_hitbox_2d.x - 4.5, userid_hitbox_2d.y, 10, 1, data.color)
            Render.FilledBox(userid_hitbox_2d.x, userid_hitbox_2d.y - 4.5, 1, 10, data.color)
        end

        data.move = math.lerp(data.move, 255, 0.005)

        userid_hitbox_2d.y = userid_hitbox_2d.y - (70 * data.move / 255)

        if menu["Visual"]["Hitmarker"]["Enable Hitmarker"]:Get(1) then
            Render.ShadowText(damage, userid_hitbox_2d, data.color, font.verdana_r, true, true)
        end

        if data.move >= 200 then
            if data.alpha < 1 then
                table.remove(hitmarker.data, i)
            end
        end
    end
end

local scope_line = {}

scope_line.var = Menu.FindVar("Visuals", "View", "Camera", "Remove Scope")

menu["Visual"]["Custom Scope"] = {}

scope_line_menu = menu["Visual"]["Custom Scope"]

scope_line_menu["Enable"] = Menu.Switch(tabs.visual, "Visual", "Custom Scope", false)
scope_line_menu["Offset"] = Menu.SliderInt(tabs.visual, "Visual", "Offset", 10, 0, 500)
scope_line_menu["Length"] = Menu.SliderInt(tabs.visual, "Visual", "Length", 60, 0, 1000)
scope_line_menu["Color 1"] = Menu.ColorEdit(tabs.visual, "Colors", "[Custom Scope] Start", Color.RGBA(255, 255, 255))
scope_line_menu["Color 2"] = Menu.ColorEdit(tabs.visual, "Colors", "[Custom Scope] End", Color.RGBA(255, 255, 255, 0))

scope_line.update_menu = function()
    for key, menu in pairs(scope_line_menu) do
        local state = scope_line_menu["Enable"]:Get()

        if not (key == "Enable") then
            menu:SetVisible(state)
        end
    end
end

scope_line.update_menu()

scope_line_menu["Enable"]:RegisterCallback(scope_line.update_menu)

scope_line.anim_num = 0

scope_line.on_draw = function()
    if not scope_line_menu["Enable"]:Get() then
        return
    end

    scope_line.var:SetInt(2)

    local local_player = EntityList.GetLocalPlayer()

    local state = (not local_player or not local_player:IsAlive() or not local_player:GetProp("m_bIsScoped"))

    scope_line.anim_num = math.lerp(scope_line.anim_num, state and 0 or 255, 0.095)

    local alpha = scope_line.anim_num / 255

    scope_line.offset = scope_line_menu["Offset"] :Get() * alpha
    scope_line.length = scope_line_menu["Length"]:Get() * alpha
    scope_line.col_1 = scope_line_menu["Color 1"]:Get()
    scope_line.col_2 = scope_line_menu["Color 2"]:Get()
    scope_line.width = 1

    scope_line.col_1.a = scope_line.col_1.a * alpha
    scope_line.col_2.a = scope_line.col_2.a * alpha
    
    scope_line.start_x = vars.screen.x / 2
    scope_line.start_y = vars.screen.y / 2

    --Left
    Render.GradientBoxFilled(Vector2.new(scope_line.start_x - scope_line.offset, scope_line.start_y), Vector2.new(scope_line.start_x - scope_line.offset - scope_line.length, scope_line.start_y + scope_line.width), scope_line.col_1, scope_line.col_2, scope_line.col_1, scope_line.col_2)

    --Right
    Render.GradientBoxFilled(Vector2.new(scope_line.start_x + scope_line.offset, scope_line.start_y), Vector2.new(scope_line.start_x + scope_line.offset + scope_line.length, scope_line.start_y + scope_line.width), scope_line.col_1, scope_line.col_2, scope_line.col_1, scope_line.col_2)

    --Up
    Render.GradientBoxFilled(Vector2.new(scope_line.start_x, scope_line.start_y + scope_line.offset), Vector2.new(scope_line.start_x + scope_line.width, scope_line.start_y + scope_line.offset + scope_line.length), scope_line.col_1, scope_line.col_1, scope_line.col_2, scope_line.col_2)

    --Down
    Render.GradientBoxFilled(Vector2.new(scope_line.start_x, scope_line.start_y - scope_line.offset), Vector2.new(scope_line.start_x + scope_line.width, scope_line.start_y - scope_line.offset - scope_line.length), scope_line.col_1, scope_line.col_1, scope_line.col_2, scope_line.col_2)
end



local sloweddown = {}

menu["Visual"]["Velocity Recovery"] = {}

menu["Visual"]["Velocity Recovery"]["Enable"] = Menu.Switch(tabs.visual, "Visual", "Velocity Recovery", false)
menu["Visual"]["Velocity Recovery"]["X"] = Menu.SliderInt(tabs.visual, 'Visual', 'Velocity Recovery X', math.floor(vars.screen.x / 2), 0, math.floor(vars.screen.x))
menu["Visual"]["Velocity Recovery"]["Y"] = Menu.SliderInt(tabs.visual, 'Visual', 'Velocity Recovery Y', 300, 0, math.floor(vars.screen.y))

menu["Visual"]["Velocity Recovery"]["X"]:SetVisible(false)
menu["Visual"]["Velocity Recovery"]["Y"]:SetVisible(false)

sloweddown.anim_line = 0

sloweddown.on_draw = draggables.create_draggable(menu["Visual"]["Velocity Recovery"]["X"], menu["Visual"]["Velocity Recovery"]["Y"], 160, 40, 3, function(self)
    if not menu["Visual"]["Velocity Recovery"]["Enable"]:Get() then
        return
    end

    local local_player = EntityList.GetLocalPlayer()
    if not local_player or not local_player:IsAlive() then
        return
    end

    local vel = local_player:GetProp("m_flVelocityModifier")
    if vel == 1 and not Cheat.IsMenuVisible() then
        return
    end

    local color = Color.new(1.0 - (1.0 * vel), vel / 2, 0.0)
    local alpha = math.abs(GlobalVars.curtime * 2 % 2 - 1)

    local text = ("Recovery: %s%%"):format(math.floor(vel * 100))

    local text_width = 105
    sloweddown.anim_line = math.lerp(sloweddown.anim_line, math.floor((text_width - 2) * vel), 0.095)

    local x, y = self.position_x, self.position_y

    Render.PolyFilled(Color.new(0, 0, 0, 0.2 * alpha), Vector2.new(x + 20, y - 4), Vector2.new(x - 3, y + 42), Vector2.new(x + 43, y + 42))
    Render.PolyFilled(Color.new(color.r, color.g, color.b, alpha), Vector2.new(x + 20, y + 0), Vector2.new(x + 0, y + 40), Vector2.new(x + 40, y + 40))
    Render.ShadowText("!", Vector2.new(x + 15, y + 10), Color.new(0.0, 0.0, 0.0, 0.7 * alpha), font.slow2)

    Render.ShadowText(text, Vector2.new(x + 50, y + 5), Color.new(1.0, 1.0, 1.0), font.slow, true)

    Render.Box(Vector2.new(x + 50, y + 25), Vector2.new(x + 55 + text_width, y + 40), Color.new(0.0, 0.0, 0.0))
    Render.BoxFilled(Vector2.new(x + 51, y + 26), Vector2.new(x + 54 + text_width, y + 39), Color.new(0.0, 0.0, 0.0, 0.3))
    Render.BoxFilled(Vector2.new(x + 51, y + 26), Vector2.new(x + 56 + sloweddown.anim_line, y + 39), color)
end)




menu["Global"] = {}


local max_misses = {}

menu["Global"]['Max Misses'] = {
    ['Enable'] = Menu.Switch(tabs.global, 'Rage', 'Max. Misses', false, 'After Х misses, script disable head for ragebot.'),
    ['Max'] = Menu.SliderInt(tabs.global, 'Rage', 'Max.', 2, 1, 10)
}

max_misses.update_menu = function()
    local val = menu["Global"]['Max Misses']['Enable']:Get()
    menu["Global"]['Max Misses']['Max']:SetVisible(val)
end

max_misses.update_menu()
menu["Global"]['Max Misses']['Enable']:RegisterCallback(max_misses.update_menu)

max_misses.data = {}

max_misses.on_registered_shot = function(shot)
    if shot.reason ~= 1 then
        return
    end
    
    if not max_misses.data[shot.target_index] then
        max_misses.data[shot.target_index] = {
            esp_bool = false,
            shots = 0,
        }
    end

    max_misses.data[shot.target_index].shots = max_misses.data[shot.target_index].shots + 1
end

max_misses.on_prediction = function()
    if not menu["Global"]['Max Misses']['Enable']:Get() then
        return
    end
    
    for player_index, data in pairs(max_misses.data) do
        if data.shots >= menu["Global"]['Max Misses']['Max']:Get() then
            data.esp_bool = true

            RageBot.EnableHitbox(player_index, 0, false)
        end
    end
end

max_misses.reset_data = function(event)
    if event:GetName() ~= 'round_start' then
        return
    end

    max_misses.data = {}
end

ESP.CustomText("Body", "enemies", "BODY", function(ent)
    local data = max_misses.data[ent:EntIndex()]

    if data and data.esp_bool then
        return 'BODY'
    end
end)



local teleport = {}

menu['Global']['Teleport'] = {}

teleport.csgo_weapons = { [1] = "Deagle", [2] = "Pistols", [3] = "Pistols", [4] = "Pistols", [5] = "Pistols", [6] = "Pistols", [7] = "Rifle/LMG", [8] = "Rifle/LMG", [9] = "AWP", [10] = "Rifle/LMG", [11] = "AutoSnipers", [12] = "Rifle/LMG", [13] = "Rifle/LMG", [14] = "Rifle/LMG", [15] = "Rifle/LMG", [16] = "Rifle/LMG", [17] = "SMG", [18] = "SMG", [19] = "SMG", [20] = "Scout", [21] = "Rifle/LMG", [22] = "Rifle/LMG", [23] = "SMG", [24] = "SMG", [25] = "Shotgun", [26] = "SMG", [27] = "Shotgun", [28] = "Rifle/LMG", [29] = "Shotgun", [30] = "Pistols", [31] = "Taser", [32] = "Pistols", [33] = "SMG", [34] = "SMG", [35] = "Shotgun", [36] = "Pistols", [37] = "AutoSnipers", [38] = "AutoSnipers", [39] = "Rifle/LMG", [40] = "Scout", [41] = "Other", [42] = "Other", [43] = "Nades", [44] = "Nades", [45] = "Nades", [46] = "Nades", [47] = "Nades", [48] = "Nades", [49] = "Other", [59] = "Other", [60] = "Rifle/LMG", [61] = "Pistols", [63] = "Pistols", [64] = "Pistols", [500] = "Other", [505] = "Other", [506] = "Other", [507] = "Other", [508] = "Other", [509] = "Other", [512] = "Other", [514] = "Other", [515] = "Other", [516] = "Other", [197108] = "Other", [197113] = "Other", [197114] = "Other", [197115] = "Other", [197116] = "Other", [197123] = "Other", [197120] = "Other", [197128] = "Other", [197124] = "Other", [197130] = "Other", [197122] = "Other", [197117] = "Other", [197131] = "Other", [197127] = "Other", [197111] = "Other", [197125] = "Other", [197126] = "Other", [197129] = "Other", [197133] = "Other", [262205] = "Pistols", [262208] = "Pistols" }

teleport.weapons_list = {}
teleport.weapon_list_names = {}

for k, v in pairs(teleport.csgo_weapons) do
    if teleport.weapons_list[v] == nil then
        teleport.weapons_list[v] = {}
        table.insert(teleport.weapon_list_names, v)
    end

    table.insert(teleport.weapons_list[v], k)
end

table.sort(teleport.weapon_list_names)

teleport.combo_weapon_ids = {}

menu['Global']['Teleport']['Enable'] = Menu.Switch(tabs.global, 'Rage', 'Teleport In Air', false)
menu['Global']['Teleport']['Weapons'] = Menu.MultiCombo(tabs.global, 'Rage', 'Weapons', (function()
    local tbl = {}

    for k, v in pairs(teleport.weapon_list_names) do
        table.insert(tbl, v)
        teleport.combo_weapon_ids[v] = k
    end

    return tbl
end)(), 0)

teleport.update_menu = function()
    menu['Global']['Teleport']['Weapons']:SetVisible(menu['Global']['Teleport']['Enable']:Get())
end

teleport.update_menu()

menu['Global']['Teleport']['Enable']:RegisterCallback(teleport.update_menu)

teleport.min_penetrate_damage = 10

teleport.on_prediction = function()
    if not menu['Global']['Teleport']['Enable']:Get() then
        return
    end

    if not vars.dt_ref:Get() then
        return
    end

    if Exploits.GetCharge() ~= 1 then
        return
    end

    local localplayer = EntityList.GetLocalPlayer()
    if localplayer == nil or not localplayer:IsAlive() then
        return
    end

    local active_weapon = localplayer:GetActiveWeapon()
    if active_weapon == nil then
        return
    end

    active_weapon = active_weapon:GetWeaponID()

    local group_name = teleport.csgo_weapons[active_weapon]
    if group_name == nil then
        return
    end

    local is_allowed_by_combo = bit.band(menu['Global']['Teleport']['Weapons']:Get(), bit.lshift(1, teleport.combo_weapon_ids[group_name] - 1)) ~= 0
    if not is_allowed_by_combo then
        return
    end

    local flags = localplayer:GetProp("m_fFlags")
    local on_ground = bit.band(flags, bit.lshift(1, 0)) ~= 0
    if on_ground then
        return
    end

    local players = EntityList.GetPlayers()

    if #players == 1 then
        return
    end

    local local_player_hitbox = localplayer:GetHitboxCenter(6)

    for k, current_player in ipairs(players) do
        if current_player == local_player or current_player:IsDormant() or current_player:IsTeamMate() or not current_player:IsAlive() then
            goto skip
        end

        local player_eye = current_player:GetEyePosition()
        
        local penetrated_bullet = Cheat.FireBullet(current_player, player_eye, local_player_hitbox)

        if penetrated_bullet.trace.hit_entity ~= nil and penetrated_bullet.damage > teleport.min_penetrate_damage and penetrated_bullet.trace.hit_entity:EntIndex() == localplayer:EntIndex() then
            Exploits.ForceTeleport()
            break
        end

        ::skip::
    end
end

local aimbot = {}

menu["Global"]["Dormant"] = {}

menu["Global"]["Dormant"]["Dormant Enable"] = Menu.Switch(tabs.global, "Rage", "Dormant Aimbot", false, 'shit like russian army')
menu["Global"]["Dormant"]["Auto Stop"] = Menu.Switch(tabs.global, "Rage", "Auto Stop", false)
menu["Global"]["Dormant"]["Auto Scope"] = Menu.Switch(tabs.global, "Rage", "Auto Scope", false)
menu["Global"]["Dormant"]["Minimum Damage"] = Menu.SliderInt(tabs.global, "Rage", "Minimum Damage", 5, 1, 100)

aimbot.update_menu = function()
    local state = menu["Global"]["Dormant"]["Dormant Enable"]:Get()

    menu["Global"]["Dormant"]["Minimum Damage"]:SetVisible(state)
    menu["Global"]["Dormant"]["Auto Stop"]:SetVisible(state)
    menu["Global"]["Dormant"]["Auto Scope"]:SetVisible(state)
end

aimbot.update_menu()
menu["Global"]["Dormant"]["Dormant Enable"]:RegisterCallback(aimbot.update_menu)

aimbot.esp_data = {}

--@note: premium autostop
aimbot.auto_stop = function(cmd)
    cmd.forwardmove = cmd.forwardmove - cmd.forwardmove / 1.5
    cmd.sidemove = cmd.sidemove - cmd.sidemove / 1.5
end

aimbot.auto_scope = function(local_player, weapon, cmd)
    local flags = local_player:GetProp("m_fFlags")
    local scoped = local_player:IsScoped()
    
    if (weapon:IsSniper() == true and scoped == false and bit.band(flags, 1) == 1) then
        cmd.buttons = bit.bor(cmd.buttons, 2048)
    end
end

aimbot.on_prediction = function(cmd)
    if not menu["Global"]["Dormant"]["Dormant Enable"]:Get() then
        return
    end

    local local_player = EntityList.GetLocalPlayer()
    if not local_player or not local_player:IsAlive() then
        return
    end

    local local_weapon = local_player:GetActiveWeapon()
    if local_weapon == nil then
        return
    end

    local flags = local_player:GetProp("m_fFlags")
    local on_ground = bit.band(flags, bit.lshift(1, 0)) ~= 0
    if not on_ground then
        return
    end

    local players = EntityList.GetPlayers()
    if #players == 1 then
        return
    end

    local weapon_inaccuracy = 1 / local_weapon:GetInaccuracy(local_weapon)
    local min_damage = menu["Global"]["Dormant"]["Minimum Damage"]:Get()
    local is_autostop = menu["Global"]["Dormant"]["Auto Stop"]:Get()
    local is_autoscope = menu["Global"]["Dormant"]["Auto Scope"]:Get()

    local local_eye = local_player:GetEyePosition()

    local esp_data = {}

    for i, player in ipairs(players) do
        if not player:IsEnemy() or not player:IsAlive() or (player:GetESPAlpha() == 1) then
            goto skip
        end

        local trace_bullet = Cheat.FireBullet(local_player, local_eye, player:GetHitboxCenter(5))

        for i = 0, 18 do
            local trace_bullet_hitbox = Cheat.FireBullet(local_player, local_eye, player:GetHitboxCenter(i))

            if trace_bullet_hitbox.damage >= min_damage then
                trace_bullet = trace_bullet_hitbox
            end
        end


        if trace_bullet.trace.hit_entity and not EntityList.GetPlayer(trace_bullet.trace.hit_entity:EntIndex()):IsEnemy() then
            goto skip
        end

        if trace_bullet.damage >= min_damage and not local_weapon:IsReloading() and local_weapon:IsSniper() then
            esp_data[player:EntIndex()] = true

            if is_autoscope then
                aimbot.auto_scope(local_player, local_weapon, cmd)
            end

            if is_autostop then
                aimbot.auto_stop(cmd)
            end
            
            if weapon_inaccuracy >= 90 and local_player:IsScoped() and local_weapon:GetProp("m_flNextPrimaryAttack") < GlobalVars.curtime then
                local angle = Cheat.VectorToAngle(trace_bullet.trace.endpos - local_eye)

                local m_aimPunchAngle = local_player:GetProp("m_aimPunchAngle")
                local aim_punch = QAngle.new(m_aimPunchAngle.x, m_aimPunchAngle.y, 0.0)

                aim_punch.yaw = aim_punch.yaw * 2
                aim_punch.pitch = aim_punch.pitch * 2

                cmd.viewangles = angle - aim_punch

                cmd.buttons = bit.bor(cmd.buttons, 1)
                break
            end
        end

        ::skip::
    end

    aimbot.esp_data = esp_data
end

ESP.CustomText("Dormant Aimbot", "enemies", "DA", function(ent)
    if aimbot.esp_data[ent:EntIndex()] then
        return 'DA'
    end
end)



local global = {}

menu["Global"]["Custom Hitchances"] = {}

menu["Global"]["Custom Hitchances"]["Custom Hitchance"] = Menu.Switch(tabs.global, "Rage", "Custom Hitchance", false)
menu["Global"]["Custom Hitchances"]["In Air Hitchance"] = Menu.SliderInt(tabs.global, "Rage", "In Air Hitchance", 60, 0, 100)
menu["Global"]["Custom Hitchances"]["No Scope Hitchance"] = Menu.SliderInt(tabs.global, "Rage", "No Scope Hitchance", 60, 0, 100)

global.update_menu = function()
    local state = menu["Global"]["Custom Hitchances"]["Custom Hitchance"]:Get()

    menu["Global"]["Custom Hitchances"]["In Air Hitchance"]:SetVisible(state)
    menu["Global"]["Custom Hitchances"]["No Scope Hitchance"]:SetVisible(state)
end

global.update_menu()

menu["Global"]["Custom Hitchances"]["Custom Hitchance"]:RegisterCallback(global.update_menu)


global.hitchances = function()
    if not menu["Global"]["Custom Hitchances"]["Custom Hitchance"]:Get() then
        return
    end

    local local_player = EntityList.GetLocalPlayer()
    if not local_player  then
        return
    end

    local players = EntityList.GetPlayers()
    if #players < 1 then
        return
    end

    local state = antiaim.GetPlayerState()

    if state and (state == "Air") then
        local in_air_hitchance = menu["Global"]["Custom Hitchances"]["In Air Hitchance"]:Get()

        for i, player in ipairs(players) do   
            RageBot.OverrideHitchance(player:EntIndex(), in_air_hitchance)
        end

        return
    end

    local local_weapon = local_player:GetActiveWeapon()

    if local_weapon and local_weapon:IsSniper() and not local_player:IsScoped() then
        local no_scope_hitchance = menu["Global"]["Custom Hitchances"]["No Scope Hitchance"]:Get()

        for i, player in ipairs(players) do
            RageBot.OverrideHitchance(player:EntIndex(), no_scope_hitchance)
        end
    end
end

local fakelag = {}

menu["Global"]["Fake Lag"] = {}

menu["Global"]["Fake Lag"]["Disable lags on Hide Shots"] = Menu.Switch(tabs.global, "Rage", "Disable lags on Hide Shots", false, 'Disable your Fake Lags in Menu when you use Hide Shots')

fakelag.update_menu = function()
    if menu["Global"]["Fake Lag"]["Disable lags on Hide Shots"]:Get() then
        vars.fakelag_ref:Set(not vars.hs_ref:Get())
    end
end

fakelag.update_menu()

vars.hs_ref:RegisterCallback(fakelag.update_menu)
menu["Global"]["Fake Lag"]["Disable lags on Hide Shots"]:RegisterCallback(fakelag.update_menu)



local clantag = {}

menu["Global"]["ClanTag"] = {}

menu["Global"]["ClanTag"]["ClanTag"] = Menu.Switch(tabs.global, "Other", "ClanTag", false)

clantag.ffi = ffi.cast('int(__fastcall*)(const char*, const char*)', Utils.PatternScan('engine.dll', '53 56 57 8B DA 8B F9 FF 15'))
clantag.last = nil

clantag.set = function(tag)
    if tag == clantag.last then
        return
    end

    clantag.ffi(tag, tag)
    clantag.last = tag
end

clantag.build = function(tag)
    local ret = {}

    for i = 1, #tag do
        table.insert(ret, tag:sub(1, i))
    end

    for i = 1, 4 do
        table.insert(ret, tag)
    end

    for i = 1, #tag do
        table.insert(ret, tag:sub(i, #tag))
    end

    table.insert(ret, '')

    return ret
end

clantag.tag = clantag.build("aarne.club")

clantag.on_draw = function()
    if not menu["Global"]["ClanTag"]["ClanTag"]:Get() then
        return
    end

    if not EngineClient.IsConnected() then
        return
    end

    local net_channel_info = EngineClient.GetNetChannelInfo()

    if not net_channel_info then
        return
    end

    local latency = net_channel_info:GetLatency(0) / GlobalVars.interval_per_tick
    local tickcount_pred = GlobalVars.tickcount + latency
    local iter = math.floor(math.fmod(tickcount_pred / 13, #clantag.tag)) + 1

    clantag.set(clantag.tag[iter])
end

clantag.destroy = function()
    clantag.set("")
end

menu["Global"]["ClanTag"]["ClanTag"]:RegisterCallback(clantag.destroy)



local trashtalk = {}

trashtalk.phrases = {
    "Меф, кокс, героин, гашик, эксзи, амф, лучшие закладки вашего города писать в тг - fipp1337",
    "you are welcome - www.aarne.club",
    "Мы убили долбаёба и положили его в подвал, он там тухнет",
    "Тебя ебут в жопу, ты хочешь быть как Playboi Carti (Да ну нахуй)",
    "У тебя нет девушки, ты ебёшь кошку, ты — зоофил",
    "Благодари Дога то, что я не умер тебя",
    "ХАХАЗВАЗХВЗАХВХА НИЩЕНКА В ЧЕСТЬ ТЕБЯ РЕКУ НАЗВАЛИ",
    "ЗА КЕМ ДОЖРАЛ?!",
    "Почему твоя мать подписана у меня как 'Дроп' ?",
    "Нигга, ты не true",
    "Убил беременную тёлку,у неё была двойня. Триплкилл",
    "Ты гандон, я уеду в тюрьму и выебу там твоего папу",
    "Ты не ебал тёлок — ты день и ночь на PornHub'е",
    "Damn, ебашу налегке",
    "твоя шалава типа гроб, положил в нее лил пипку",
    "А ты ебаный бич",
    "Закопал его живым и он уже в могиле помер",
    "Ты ебаная шлюха, иди нюхай меф с моего хуя",
    "Его башка будто мяч — я пинал пыром",
    "Чё ты мне хочешь сказать? Уебан, помолчи, не давал тебе голос",
    "Он ещё даже тёлку не трахал, но уже убил человека",
    "A МАМЕ? А ПАПЕ??",
    "москаль, в ад",
    'лови чек на сабку хуесос нищий http://t.me/CryptoBot?start=CQzZkcNF3QN',
    "иди с медведями сфоткайся",
    "одной ногой играю (◣◢)",
    "LIFEHACK BITCH!!! (◣◢)",
    "мёда похавай, москаль",
    "hs бомjара",
    "я сейчас начну кое-что про маму говорить и мне будет всё равно, что у меня мама дома",
    "куда слетел тапок?!",
    "ща ебало будет плоским",
    "иди голубей покорми",
    "ебать я твоей матери кормушку расхуячил",
    "иди на алике силиконовые мозги вгетай себе, москаль",
    "я сожрал твою мать нахуй, и её кости хрустели, как чипсы русская картошка",
    "в лобби безмамный бот",
    "нахуя бычок об жопу тушишь?",
    "ты ден? ты наверное себе мозги мамкиными сигами задымил все",
    "Powered by www.aarne.club",
    "Заскамил узбека я думал это был таджик",
    "oh no cringe",
    'Мальчик, блять, остынь...',
    'Aarne.club - чтобы не быть Броук Боем',
    'в гулаг ублюдок',
    'no-life user',
    'и-и-и-иди нахуй шлюха',
    'ОПРАВДАЙСЯ МНЕ В ХУЙ..',
    'уничтожен',
    '1 TON жира в тебе, хуесос...',
    'У сестры знакомый военный говорит завтра ВСУ будут брать Белгород чтобы окружить Донбасс',
    'Слава Белгородской Народной Республике!',
    'где ты был 8 лет хуесос ебучий',
    'сегодня видел как ты бабку за сахар пырнул ха-ха',
    'Zаглотнул хуяку V рот уебан',
    'удобряй землю чмырь',
    'owned by bandera-script',
}


menu["Global"]["Trashtalk"] = {}

menu["Global"]["Trashtalk"]["Enable Trashtalk"] = Menu.Switch(tabs.global, "Other", "Trashtalk", false)

trashtalk.on_kill = function(event)
    if (event:GetName() == "player_death") then
        local local_player = EntityList.GetLocalPlayer()
        if not local_player then
            return
        end

        local userid = EntityList.GetPlayerForUserID(event:GetInt("userid", 0))
        local attacker = EntityList.GetPlayerForUserID(event:GetInt("attacker", 0))

        if (attacker == local_player and local_player ~= userid) then
            local phrase = menu["Global"]["Trashtalk"]["Enable Trashtalk"]:Get() and trashtalk.phrases[Utils.RandomInt(1, #trashtalk.phrases)] or ''

            local userid_name = userid:GetName()

            if playerlist.data[userid_name] and playerlist.data[userid_name]['Override']:Get() and playerlist.data[userid_name]['Trashtalk']:Get() then
                phrase = playerlist.data[userid_name]['Trashtalk Text']:Get()
            end
            
            local to_say = ("say %s"):format(phrase)

            EngineClient.ExecuteClientCmd(to_say)
        end
    end
end



local hitsound = {}

hitsound.data = {
    ["Skeet"] = "buttons\\arena_switch_press_02",
    ["Custom"] = "Custom",
}

hitsound.get_pairs = function()
    local keys = {}

    for key, index in pairs(hitsound.data) do
        table.insert(keys, key)
    end

    return keys
end

hitsound.keys = hitsound.get_pairs()

menu["Global"]["Hitsound"] = {}

menu["Global"]["Hitsound"]["Enable"] = Menu.Switch(tabs.global, "Other", "Hitsound", false)
menu["Global"]["Hitsound"]["Sounds"] = Menu.Combo(tabs.global, "Other", "Sounds", hitsound.keys, 0)
menu["Global"]["Hitsound"]["Custom"] = Menu.TextBox(tabs.global, "Other", "Custom", 64, "", "All csgo sounds\npaste.dy.fi/isy/plain")
menu["Global"]["Hitsound"]["Volume"] = Menu.SliderInt(tabs.global, "Other", "Volume", 100, 0, 100)

hitsound.update_menu = function()
    local state = menu["Global"]["Hitsound"]["Enable"]:Get()
    local main = menu["Global"]["Hitsound"]["Sounds"]:Get()

    menu["Global"]["Hitsound"]["Sounds"]:SetVisible(state)
    menu["Global"]["Hitsound"]["Custom"]:SetVisible(hitsound.data[hitsound.keys[main + 1]] == "Custom" and state)
    menu["Global"]["Hitsound"]["Volume"]:SetVisible(state)
end

hitsound.update_menu()

menu["Global"]["Hitsound"]["Enable"]:RegisterCallback(hitsound.update_menu)
menu["Global"]["Hitsound"]["Sounds"]:RegisterCallback(hitsound.update_menu)

hitsound.on_hurt = function(event)
    if not menu["Global"]["Hitsound"]["Enable"]:Get() then
        return
    end

    if not (event:GetName() == "player_hurt") then
        return
    end

    local local_player = EntityList.GetLocalPlayer()
    local userid = EntityList.GetPlayerForUserID(event:GetInt("userid", 0))
    local attacker = EntityList.GetPlayerForUserID(event:GetInt("attacker", 0))

    if not (attacker == local_player) then
        return
    end

    local hitsound_index = menu["Global"]["Hitsound"]["Sounds"]:Get()
    local hitsound_volume = menu["Global"]["Hitsound"]["Volume"]:Get() / 100
    local hitsound_check = hitsound.data[hitsound.keys[hitsound_index + 1]]

    local hitsound_name = hitsound_check == "Custom" and menu["Global"]["Hitsound"]["Custom"]:Get() or hitsound_check

    local to_execute = ("playvol %s %s"):format(hitsound_name, hitsound_volume)

    EngineClient.ExecuteClientCmd(to_execute)
end

local radar = {}

menu["Global"]["Radar"] = {}

menu["Global"]["Radar"]["Disable Radar"] = Menu.Switch(tabs.global, "Other", "Disable Radar", false)

radar.var = CVar.FindVar("cl_drawhud_force_radar")

radar.on_click = function()
    radar.var:SetInt(menu["Global"]["Radar"]["Disable Radar"]:Get() and -1 or 0)
end

radar.on_click()

menu["Global"]["Radar"]["Disable Radar"]:RegisterCallback(radar.on_click)

local molotov = {}

menu["Global"]["Molotov"] = {}

menu["Global"]["Molotov"]["Molotov Ignore-Z"] = Menu.Switch(tabs.global, "Other", "Molotov Ignore-Z", false)
menu["Global"]["Molotov"]["Molotov Wireframe"] = Menu.Switch(tabs.global, "Other", "Molotov Wireframe", false)

molotov.materials = {
    "particle/fire_burning_character/fire_env_fire_depthblend_oriented",
    "particle/fire_burning_character/fire_burning_character",
    "particle/fire_explosion_1/fire_explosion_1_oriented",
    "particle/fire_explosion_1/fire_explosion_1_bright",
    "particle/fire_burning_character/fire_burning_character_depthblend",
    "particle/fire_burning_character/fire_env_fire_depthblend",
}

molotov.on_draw = function()
    for k, v in ipairs(molotov.materials) do
        local material = MatSystem.FindMaterial(v, "")

        if material ~= nil then
            material:SetMaterialVarFlag(bit.lshift(1, 28), menu["Global"]["Molotov"]["Molotov Wireframe"]:GetBool()) -- Wireframe
            material:SetMaterialVarFlag(bit.lshift(1, 15), menu["Global"]["Molotov"]["Molotov Ignore-Z"]:GetBool()) -- IgnoreZ
        end
    end
end

molotov.on_destroy = function()
    for k, v in pairs(molotov.materials) do
        local material = MatSystem.FindMaterial(v, "")

        if material ~= nil then
            material:SetMaterialVarFlag(bit.lshift(1, 28), false) -- Wireframe
            material:SetMaterialVarFlag(bit.lshift(1, 15), false) -- IgnoreZ
        end
    end
end

local thirdperson = {}

menu["Global"]["Thirdperson"] = {}
thirdperson_menu = menu["Global"]["Thirdperson"]

thirdperson_menu["Disable 3D Person Anim"] = Menu.Switch(tabs.global, "Other", "Disable Thirdperson Anim.", false)
 
thirdperson.on_value = function()
    local state = thirdperson_menu["Disable 3D Person Anim"]:Get()

    Cheat.SetThirdPersonAnim(not state)
end

thirdperson.on_value()

thirdperson_menu["Disable 3D Person Anim"]:RegisterCallback(thirdperson.on_value)







local configs = {}

configs.default = "eyJWaXN1YWwiOnsiSGl0bG9ncyI6eyJEcmF3IFR5cGUiOjV9LCJBcnJvd3MiOnsiQXJyb3dzIjoxLCJTaXplIjo0LCJJbnZlcnRlZCBDb2xvciI6eyIxIjowLjU4ODIzNTMxODY2MDczNjEsIjIiOjAuNTg4MjM1MzE4NjYwNzM2MSwiMyI6MSwiNCI6MX0sIkRpc3RhbmNlIjozMywiQXJyb3cgQ29sb3IiOnsiMSI6MC40OTkxODIwNDU0NTk3NDczLCIyIjowLjU0NzI5OTAyNzQ0MjkzMjEsIjMiOjAuODM1MzY1ODMxODUxOTU5MiwiNCI6MX19LCJCaW5kcyI6eyJNaW4gRGFtYWdlIFgiOjkzMywiRW5hYmxlIGluZGljYXRvcnMiOjcsIkluZGljYXRvcnMgVHlwZSI6MSwiTWluIERhbWFnZSBZIjo1MTcsIkJpbmRzIjo3LCJEZXN5bmMgTGluZSBDb2xvciI6eyIxIjowLjQ5ODAzOTIxNTgwMzE0NjM2LCIyIjowLjU0OTAxOTYzNDcyMzY2MzMsIjMiOjAuODM1Mjk0MTI3NDY0Mjk0NCwiNCI6MX0sIlNjcmlwdCBuYW1lIENvbG9yIjp7IjEiOjAuNDk4MDM5MjE1ODAzMTQ2MzYsIjIiOjAuNTQ5MDE5NjM0NzIzNjYzMywiMyI6MC44MzUyOTQxMjc0NjQyOTQ0LCI0IjoxfX0sIkhpdG1hcmtlciI6eyJFbmFibGUgSGl0bWFya2VyIjoyLCJDb2xvciI6eyIxIjoxLCIyIjoxLCIzIjoxLCI0IjoxfX0sIlZlbG9jaXR5IFJlY292ZXJ5Ijp7IkVuYWJsZSI6ZmFsc2V9LCJTbmFwbGluZXMiOnsiRW5hYmxlIGFuZCBDb2xvciI6ZmFsc2V9LCJDdXN0b20gU2NvcGUiOnsiRW5hYmxlIjp0cnVlLCJPZmZzZXQiOjEwLCJDb2xvciAyIjp7IjEiOjEsIjIiOjEsIjMiOjEsIjQiOjB9LCJMZW5ndGgiOjYwLCJDb2xvciAxIjp7IjEiOjEsIjIiOjEsIjMiOjEsIjQiOjAuMzc4MDQ4Nzc3NTgwMjYxMjN9fX0sIkdsb2JhbCI6eyJDbGFuVGFnIjp7IkNsYW5UYWciOnRydWV9LCJGYWtlIExhZyI6eyJEaXNhYmxlIGxhZ3Mgb24gSGlkZSBTaG90cyI6dHJ1ZX0sIk1vbG90b3YiOnsiTW9sb3RvdiBJZ25vcmUtWiI6ZmFsc2UsIk1vbG90b3YgV2lyZWZyYW1lIjpmYWxzZX0sIlRyYXNodGFsayI6eyJFbmFibGUgVHJhc2h0YWxrIjp0cnVlfSwiRG9ybWFudCI6eyJEb3JtYW50IEVuYWJsZSI6ZmFsc2UsIkF1dG8gU2NvcGUiOmZhbHNlLCJBdXRvIFN0b3AiOmZhbHNlLCJNaW5pbXVtIERhbWFnZSI6NX0sIlJhZGFyIjp7IkRpc2FibGUgUmFkYXIiOnRydWV9LCJUaGlyZHBlcnNvbiI6eyJEaXNhYmxlIDNEIFBlcnNvbiBBbmltIjp0cnVlfSwiSGl0c291bmQiOnsiRW5hYmxlIjp0cnVlLCJTb3VuZHMiOjAsIkN1c3RvbSI6IiIsIlZvbHVtZSI6NTB9LCJUZWxlcG9ydCI6eyJFbmFibGUiOnRydWUsIldlYXBvbnMiOjI2NX0sIkN1c3RvbSBIaXRjaGFuY2VzIjp7IkluIEFpciBIaXRjaGFuY2UiOjEwMCwiQ3VzdG9tIEhpdGNoYW5jZSI6ZmFsc2UsIk5vIFNjb3BlIEhpdGNoYW5jZSI6MTAwfX0sIkFudGktQWltIjp7IkNyb3VjaGluZyI6eyJMZWZ0IExpbWl0Ijo2MCwiRmFrZSBMaW1pdCBUeXBlIjowLCJZYXcgQWRkIFJpZ2h0IjoyMCwiT3ZlcnJpZGUiOnRydWUsIkxCWSBNb2RlIjoxLCJGYWtlIE9wdGlvbnMiOjIsIk1vZGlmaWVyIERlZ3JlZSI6MjIsIkRpc2FibGUgQW50aS1CcnV0ZWZvcmNlIjpmYWxzZSwiWWF3IEFkZCBMZWZ0IjotMjAsIkZyZWVzdGFuZGluZyBEZXN5bmMiOjAsIkRlc3luYyBPbiBTaG90IjoxLCJSaWdodCBMaW1pdCI6NjAsIllhdyBNb2RpZmllciI6MX0sIlN0YW5kaW5nIjp7IkxlZnQgTGltaXQiOjAsIkZha2UgTGltaXQgVHlwZSI6MCwiWWF3IEFkZCBSaWdodCI6MCwiT3ZlcnJpZGUiOmZhbHNlLCJMQlkgTW9kZSI6MCwiRmFrZSBPcHRpb25zIjowLCJNb2RpZmllciBEZWdyZWUiOjAsIkRpc2FibGUgQW50aS1CcnV0ZWZvcmNlIjpmYWxzZSwiWWF3IEFkZCBMZWZ0IjowLCJGcmVlc3RhbmRpbmcgRGVzeW5jIjowLCJEZXN5bmMgT24gU2hvdCI6MCwiUmlnaHQgTGltaXQiOjAsIllhdyBNb2RpZmllciI6MH0sIlNsb3d3YWxrIjp7IkxlZnQgTGltaXQiOjAsIkZha2UgTGltaXQgVHlwZSI6MCwiWWF3IEFkZCBSaWdodCI6MCwiT3ZlcnJpZGUiOmZhbHNlLCJMQlkgTW9kZSI6MCwiRmFrZSBPcHRpb25zIjowLCJNb2RpZmllciBEZWdyZWUiOjAsIkRpc2FibGUgQW50aS1CcnV0ZWZvcmNlIjpmYWxzZSwiWWF3IEFkZCBMZWZ0IjowLCJGcmVlc3RhbmRpbmcgRGVzeW5jIjowLCJEZXN5bmMgT24gU2hvdCI6MCwiUmlnaHQgTGltaXQiOjAsIllhdyBNb2RpZmllciI6MH0sIkFudGktQnJ1dGVmb3JjZSBQaGFzZXMiOnsiMSI6NjAsIjIiOi02MCwiMyI6MCwiNCI6MCwiNSI6MCwiNiI6MCwiNyI6MCwiOCI6MCwiOSI6MCwiMTAiOjB9LCJPbiBVc2UiOnsiTGVmdCBMaW1pdCI6NjAsIkZha2UgTGltaXQgVHlwZSI6MCwiWWF3IEFkZCBSaWdodCI6MCwiT3ZlcnJpZGUiOnRydWUsIkxCWSBNb2RlIjoxLCJGYWtlIE9wdGlvbnMiOjAsIk1vZGlmaWVyIERlZ3JlZSI6MCwiRGlzYWJsZSBBbnRpLUJydXRlZm9yY2UiOmZhbHNlLCJZYXcgQWRkIExlZnQiOjAsIkZyZWVzdGFuZGluZyBEZXN5bmMiOjEsIkRlc3luYyBPbiBTaG90IjoxLCJSaWdodCBMaW1pdCI6NjAsIllhdyBNb2RpZmllciI6MH0sIlNoYXJlZCI6eyJMZWZ0IExpbWl0IjoxOCwiRmFrZSBMaW1pdCBUeXBlIjowLCJZYXcgQWRkIFJpZ2h0IjowLCJPdmVycmlkZSI6ZmFsc2UsIkxCWSBNb2RlIjoxLCJGYWtlIE9wdGlvbnMiOjIsIk1vZGlmaWVyIERlZ3JlZSI6NTQsIkRpc2FibGUgQW50aS1CcnV0ZWZvcmNlIjp0cnVlLCJZYXcgQWRkIExlZnQiOjAsIkZyZWVzdGFuZGluZyBEZXN5bmMiOjAsIkRlc3luYyBPbiBTaG90IjoxLCJSaWdodCBMaW1pdCI6MTgsIllhdyBNb2RpZmllciI6MX0sIkFpciI6eyJMZWZ0IExpbWl0Ijo0NywiRmFrZSBMaW1pdCBUeXBlIjoxLCJZYXcgQWRkIFJpZ2h0IjotNywiT3ZlcnJpZGUiOmZhbHNlLCJMQlkgTW9kZSI6MCwiRmFrZSBPcHRpb25zIjoyLCJNb2RpZmllciBEZWdyZWUiOjEsIkRpc2FibGUgQW50aS1CcnV0ZWZvcmNlIjpmYWxzZSwiWWF3IEFkZCBMZWZ0IjotNywiRnJlZXN0YW5kaW5nIERlc3luYyI6MCwiRGVzeW5jIE9uIFNob3QiOjIsIlJpZ2h0IExpbWl0Ijo0NywiWWF3IE1vZGlmaWVyIjoxfSwiTW92aW5nIjp7IkxlZnQgTGltaXQiOjAsIkZha2UgTGltaXQgVHlwZSI6MCwiWWF3IEFkZCBSaWdodCI6MCwiT3ZlcnJpZGUiOmZhbHNlLCJMQlkgTW9kZSI6MCwiRmFrZSBPcHRpb25zIjowLCJNb2RpZmllciBEZWdyZWUiOjAsIkRpc2FibGUgQW50aS1CcnV0ZWZvcmNlIjpmYWxzZSwiWWF3IEFkZCBMZWZ0IjowLCJGcmVlc3RhbmRpbmcgRGVzeW5jIjowLCJEZXN5bmMgT24gU2hvdCI6MCwiUmlnaHQgTGltaXQiOjAsIllhdyBNb2RpZmllciI6MH0sIkFudGktQWltIjp7IllhdyBCYXNlIjo0LCJSb2xsIG9uIE1hbnVhbHMiOmZhbHNlLCJDb25kaXRpb25zIjp0cnVlLCJBbnRpLUFpbSBvbiBVc2UiOnRydWUsIkFudGktQmFja3N0YWIiOnRydWUsIlJvbGwgTGVmdCI6LTQ1LCJSb2xsIFJpZ2h0Ijo0NSwiRW5hYmxlIEFudGktQWltIjp0cnVlLCJUYWIiOjAsIlJvbGwgQW50aS1BaW0iOmZhbHNlfSwiQW5pbWF0aW9ucyI6eyJTdGF0aWMgQWlyIExlZ3MiOnRydWUsIlBpdGNoIG9uIExhbmQiOmZhbHNlLCJTdGF0aWMgTGFuZGluZyBMZWdzIjp0cnVlfSwiQW50aS1CcnV0ZWZvcmNlIjp7IkVuYWJsZSBBbnRpLUJydXRlZm9yY2UiOnRydWUsIlBoYXNlcyBDb3VudCI6Mn0sIlJvbGwiOnsiTGVmdCBMaW1pdCI6NjAsIkZha2UgTGltaXQgVHlwZSI6MCwiWWF3IEFkZCBSaWdodCI6MCwiT3ZlcnJpZGUiOnRydWUsIkxCWSBNb2RlIjowLCJGYWtlIE9wdGlvbnMiOjAsIk1vZGlmaWVyIERlZ3JlZSI6MCwiRGlzYWJsZSBBbnRpLUJydXRlZm9yY2UiOnRydWUsIllhdyBBZGQgTGVmdCI6MCwiRnJlZXN0YW5kaW5nIERlc3luYyI6MCwiRGVzeW5jIE9uIFNob3QiOjEsIlJpZ2h0IExpbWl0Ijo2MCwiWWF3IE1vZGlmaWVyIjowfX19"

configs.data = {}

configs.update = function()
    for tab_name, tab in pairs(menu) do
        configs.data[tab_name] = {}
        for global_item_name, tab2 in pairs(tab) do
            configs.data[tab_name][global_item_name] = {}
            for item_name, item in pairs(tab2) do
                local value = item:Get()

                -- @note: крутой метод получения макак
                if type(value) == 'userdata' then
                    local color = item:Get()

                    value = {color.r, color.g, color.b, color.a}
                end

                configs.data[tab_name][global_item_name][item_name] = value
            end
        end
    end
end

configs.load = function(values)
    if values == nil then
        Cheat.AddEvent("Something went wrong... Check the config data again")
        uwu.print('{0.54, 0.83, 1}[Aarne.club] {1, 1, 1}Something went wrong... Check the {0.78, 1, 0}config data {1, 1, 1}again \n')
        return
    end

    for tab_name, tab in pairs(menu) do
        for global_item_name, tab2 in pairs(tab) do
            for item_name, item in pairs(tab2) do
                local value = values[tab_name]

                if value == nil then
                    --print('[Error] tab_name ' .. tab_name)
                    goto skip
                end

                value = values[tab_name][global_item_name]

                if value == nil then
                    --print('[Error] global_item_name ' .. global_item_name)
                    goto skip
                end

                value = values[tab_name][global_item_name][item_name]

                if value == nil then
                    local error_log = ('Failed to load config for (%s) children item of (%s) item'):format(item_name, global_item_name)

                    Cheat.AddEvent(error_log)
                    uwu.print(('{0.54, 0.83, 1}[Aarne.club] {1, 1, 1}Failed to load config for {0.78, 1, 0}%s {1, 1, 1}children item of {0.78, 1, 0}%s {1, 1, 1}item \n'):format(item_name, global_item_name))

                    goto skip
                end

                if type(value) == 'table' then
                    value = Color.new(unpack(value))
                end

                --print(tab_name, global_item_name, item_name, value)

                menu[tab_name][global_item_name][item_name]:Set(value)
                ::skip::
            end
        end
    end

    max_misses.update_menu()
    fakelag.update_menu()
    radar.on_click()
    aimbot.update_menu()
    global.update_menu()
    arrows.update_menu()
    antiaim.update_menu()
    scope_line.update_menu()
    hitsound.update_menu()
    hitmarker.update_menu()
    teleport.update_menu()
    antiaim.antibruteforce.MenuVisible()

    Cheat.AddEvent('Config successfully loaded!')
    uwu.print('{0.54, 0.83, 1}[Aarne.club] {1, 1, 1}Config {0.78, 1, 0}successfully {1, 1, 1}loaded!\n')
end





configs.url = 'https://625c894695cd5855d6139e9b.mockapi.io/api/v1/config/'

configs.create_config = function(config_password, config_name, config_data)
    http.request(configs.url, {
        type = 'POST',
        data = {
            config_password = config_password,
            config_name = config_name,
            config_data = config_data,
        }
    })
end

configs.delete_config = function(id)
    http.request(configs.url .. id, {type = 'DELETE'})
end

configs.all_configs = {}
configs.my_configs = {}

configs.parse_configs = function()
    configs.all_configs = {}

    local parse_configs = json.parse(Http.Get(configs.url))

    if type(parse_configs) ~= 'table' or #parse_configs < 1 then
        return
    end

    for i, next_config_data in ipairs(parse_configs) do
        for key, data in pairs(next_config_data) do
            configs.all_configs[tostring(next_config_data.config_name)] = {
                id = next_config_data.id,
                config_data = next_config_data.config_data,
                config_password = next_config_data.config_password,
            }
        end
    end
end

configs.parse_configs()

configs.ui = {}

configs.ui.name = Menu.TextBox(tabs.config, 'Create', 'Config Name', 64, '')
configs.ui.password = Menu.TextBox(tabs.config, 'Create', 'Config Password', 64, '', 'You need to set a password for further access to delete the config.')
configs.ui.upload = Menu.Button(tabs.config, 'Create', 'Upload Config', '')

configs.ui.configs = Menu.Combo(tabs.config, 'Cloud', 'Configs', {'no configs :('}, 0)
configs.ui.access_password = Menu.TextBox(tabs.config, 'Cloud', 'Config Password', 64, '', 'Enter the password for the config to access the delete.')
configs.ui.update_configs = Menu.Button(tabs.config, 'Cloud', 'Update List', '')
configs.ui.load = Menu.Button(tabs.config, 'Cloud', 'Load Config', '')
configs.ui.delete = Menu.Button(tabs.config, 'Cloud', 'Delete Config', '')

configs.update_configs_list = function()
    configs.parse_configs()

    local config_names = table.keys(configs.all_configs)

    if (#config_names < 1) then
        config_names = {'no configs :('}
    end

    configs.ui.configs:UpdateList(config_names)
    Cheat.AddEvent('Config list successfully updated!')
end

configs.update_configs_list()

configs.ui.update_configs:RegisterCallback(configs.update_configs_list)

configs.upload = function()
    local config_names = table.keys(configs.all_configs)

    configs.update()

    local response = json.encode(configs.data)
    local encoded_config = base64.encode(response)

    local config_password = configs.ui.password:Get()
    local config_name = configs.ui.name:Get()
    local config_data = encoded_config

    if table.find(config_names, config_name) then
        Cheat.AddEvent('This name already exists.')
        return
    end

    configs.create_config(config_password, config_name, config_data)
    Cheat.AddEvent('Config successfully uploaded!')

    configs.update_configs_list()
end

configs.ui.upload:RegisterCallback(configs.upload)

configs.delete_my_config = function()
    local config_index = configs.ui.configs:Get()
    local config_names = table.keys(configs.all_configs)
    local config_name = config_names[config_index + 1]
    local config_password = configs.ui.access_password:Get()

    if not configs.all_configs[config_name] then
        Cheat.AddEvent('This config does not exist.')
        return
    end

    local config_data = configs.all_configs[config_name]

    if not (config_data.config_password == config_password) then
        Cheat.AddEvent('Wrong config password.')
        return
    end

    configs.delete_config(config_data.id)
    Cheat.AddEvent('Config successfully deleted!')

    configs.update_configs_list()
end

configs.ui.delete:RegisterCallback(configs.delete_my_config)

configs.load_config = function()
    local config_index = configs.ui.configs:Get()
    local config_names = table.keys(configs.all_configs)
    local config_name = config_names[config_index + 1]

    if not configs.all_configs[config_name] then
        Cheat.AddEvent('This config does not exist.')
        return
    end

    local config_data = configs.all_configs[config_name].config_data
    local decoded_config_data = base64.decode(config_data)
    local json_to_table = json.parse(decoded_config_data)

    configs.load(json_to_table)
end

configs.ui.load:RegisterCallback(configs.load_config)




Menu.Button(tabs.config, 'Recommendations', 'Discord Server', '', function()
    Panorama.Open().SteamOverlayAPI.OpenExternalBrowserURL('https://discord.gg/tSjcsbmMFF')
end)

Menu.Button(tabs.config, 'Recommendations', 'NL Config', '', function()
    Panorama.Open().SteamOverlayAPI.OpenExternalBrowserURL('https://en.neverlose.cc/market/item?id=VKC48g')
end)

Menu.Button(tabs.config, 'Recommendations', 'Solus UI', '', function()
    Panorama.Open().SteamOverlayAPI.OpenExternalBrowserURL('https://en.neverlose.cc/market/item?id=XjP7t5')
end)

local callbacks = {}

callbacks.on_prediction = function(cmd)
    animation_breaker.handle_prediction(cmd)
    aimbot.on_prediction(cmd)
    global hitchance()
    antiaim.on_prediction()
    antiaim.allow_on_use()
    teleport.on_prediction()
    antiaim.roll(cmd)
    playerlist:on_prediction()
    max_misses.on_prediction()
end

callbacks.on_createmove = function(cmd)
    animation_breaker.handle_cmove()
    antiaim.roll_movement(cmd)
end

callbacks.on_evets = function(event)
    antiaim.antibruteforce.on_event(event)
    hitmarker.on_hurt(event)
    trashtalk.on_kill(event)
    hitlogs.on_hurt(event)
    hitlogs reset(event)
    hitsound.on_hurt(event)
    max_misses.reset_data(event)
end

callbacks.on_draw = function()
    scope_line.on_draw()
    hitmarker.on_draw()
    snaplines.on_draw()
    molotov.on_draw()
    hitlogs.on_draw()
    arrows.on_draw()
    binds.on_draw()
    sloweddown.on_draw:update()
    min_damage.on_draw()
    clantag.on_draw()
end

callbacks.on_destroy = function()
    animation_breaker.on_destroy()
    molotov.on_destroy()
    clantag.destroy()
end

callbacks.on_registered_shot = function(shot)
    hitlogs.on_registered_shot(shot)
    max_misses.on_registered_shot(shot)
end

callbacks.on_ragebot = function(shot)
    hitlogs.on_ragebot(shot)
end

Cheat.RegisterCallback("draw", callbacks.on_draw)
Cheat.RegisterCallback("events", callbacks.on_evets)
Cheat.RegisterCallback("destroy", callbacks.on_destroy)
Cheat.RegisterCallback("prediction", callbacks.on_prediction)
Cheat.RegisterCallback("createmove", callbacks.on_createmove)
Cheat.RegisterCallback("ragebot_shot", callbacks.on_ragebot)
Cheat.RegisterCallback("registered_shot", callbacks.on_registered_shot)
 
Олдфаг
Статус
Оффлайн
Регистрация
28 Дек 2018
Сообщения
2,585
Реакции[?]
1,437
Поинты[?]
1K
ну еще несколько тем создайте.
GOVARD добавьте модера уже в раздел скриптинга, они по 5 раз перезаливают скрипты.
 
Нестандартное звание?
Пользователь
Статус
Оффлайн
Регистрация
23 Июл 2021
Сообщения
421
Реакции[?]
81
Поинты[?]
2K
code_language.lua:
local function vtable_entry(instance, index, type)
    return ffi.cast(type, (ffi.cast("void***", instance)[0])[index])
end

local function vtable_thunk(index, typestring)
    local t = ffi.typeof(typestring)
    return function(instance, ...)
        assert(instance ~= nil)
        if instance then
            return vtable_entry(instance, index, t)(instance, ...)
        end
    end
end

local function vtable_bind(module, interface, index, typestring)F
    local instance = Utils.CreateInterface(module, interface) or error("invalid interface")
    local fnptr = vtable_entry(instance, index, ffi.typeof(typestring)) or error("invalid vtable")
    return function(...)
        return fnptr(instance, ...)
    end
end

function table.keys(array) local out = {} for key, k in pairs(array) do table.insert(out, key) end return out end
function table.find(array, to_find) for i, k in ipairs(array) do return k == to_find end end

function table.filter(array, func)
    local filtered = {}

    for i, k in ipairs(array) do
        if func(k) then
            table.insert(filtered, k)
        end
    end

    return filtered
end

local files = {}

ffi.cdef[[
    typedef struct {
        uint8_t r;
        uint8_t g;
        uint8_t b;
        uint8_t a;
    } color_struct_t;

    typedef void (__cdecl* console_color_print)(void*,const color_struct_t&, const char*, ...);

    bool URLDownloadToFileA(void* LPUNKNOWN, const char* LPCSTR, const char* LPCSTR2, int a, int LPBINDSTATUSCALLBACK);
    bool CreateDirectoryA(const char* lpPathName, void* lpSecurityAttributes);
    bool DeleteUrlCacheEntryA(const char* lpszUrlName);
]]

local console = {}

console.interface_type = ffi.typeof("uintptr_t**")
console.cvar_interface = ffi.cast(console.interface_type, Utils.CreateInterface("vstdlib.dll", "VEngineCvar007"))
console._print = ffi.cast("console_color_print", console.cvar_interface[0][25])

console.color_print = function(color, text)
    if color == nil then
        return
    end

    local col = ffi.new("color_struct_t")
    col.r = color.r * 255
    col.g = color.g * 255
    col.b = color.b * 255
    col.a = color.a * 255

    console._print(console.cvar_interface, col, text)
end

console.print = function(...)
    console.color_print(Color.RGBA(118, 200, 232), '[Aarne.club] ')

    for i, v in ipairs({...}) do
        local color = v[2] or Color.RGBA(255, 255, 255)
        local text = v[1] or ''

        console.color_print(color, text)
    end

    print('')
end

--@nope: uwu colored printi :33333
local uwu = {}

uwu.calc_count = function(string, search)
    local count = 0

    for i = 1, #string do
        if string:sub(i, i) == search then
            count = count + 1
        end
    end

    return count
end

--@note: ДА У МЕНЯ ЧУТЬ МАЗГА НАХЪУЙ НЕ ВЗАРВАЛАСЬ ТАКОЕ ДЕЛАТЬ ЕБАНЫЙ РОТ
uwu.print = function(_string, vector, alpha, font, shadow)
    local string = _string
    local old_text_size = 0

    for i = 1, uwu.calc_count(string, "{") do
        local start_prefix = string:find('{')
        local end_prefix = string:find('}')

        local string_color = string:sub(start_prefix, end_prefix)
        local load_color = loadstring('return ' .. string_color)()
        local next_string = string:sub(end_prefix + 1)

        local next_prefix_start = next_string:find('{')
        local new_string = next_prefix_start and next_string:sub(1, next_prefix_start - 1) or next_string

        string = next_string

        if (vector or alpha or font or shadow) then
            local color = Color.new(unpack(load_color))
            color.a = alpha

            Render.ShadowText(new_string, Vector2.new(vector.x + old_text_size, vector.y), color, font, shadow, false)

            old_text_size = old_text_size + Render.CalcTextSize(new_string, font.size, font.init).x

            goto skip
        end

        console.color_print(Color.new(unpack(load_color)), new_string)

        ::skip::
    end
end



files.default_path = 'nl\\aarne.club'

files.UrlMon = ffi.load('UrlMon')
files.WinInet = ffi.load('WinInet')
files.Gdi32 = ffi.load('Gdi32')

files.download = function(self, url, file_name, path)
    path = path and path or self.default_path

    path = path .. '\\' .. file_name

    self.WinInet.DeleteUrlCacheEntryA(url)
    self.UrlMon.URLDownloadToFileA(nil, url, path, 0, 0)
   
    local log = ('Successfully downloaded (%s) to (%s) folder'):format(file_name, self.default_path)
    Cheat.AddEvent(log)
    uwu.print(('{0.54, 0.83, 1}[Aarne.club] {1, 1, 1}Successfully downloaded {0.78, 1, 0}%s {1, 1, 1}to {0.78, 1, 0}%s {1, 1, 1}folder \n'):format(file_name, self.default_path))
end

files.create_directory = function(self, path)
    path = path and path or self.default_path

    ffi.C.CreateDirectoryA(path, NULL)

    local log = ('Successfully created (%s) folder'):format(path)
    Cheat.AddEvent(log)
    uwu.print(('{0.54, 0.83, 1}[Aarne.club] {1, 1, 1}Successfully created {0.78, 1, 0}%s {1, 1, 1}folder \n'):format(path))
end

local http = Panorama.LoadString([[
    return {
        request: function(url, options){
            $.AsyncWebRequest(url, options);
        }
    }
]])()

local json = Panorama.LoadString([[
    return {
        encode: JSON.stringify,
        parse: JSON.parse
    };
]])()

local ffi_handler = {}
local animation_breaker = {}

ffi_handler.sigs = {
    get_pose_params = {"client.dll", "55 8B EC 8B 45 08 57 8B F9 8B 4F 04 85 C9 75 15"} -- https://github.com/perilouswithadollarsign/cstrike15_src/blob/master/public/studio.cpp#L931
}

ffi_handler.offsets = {
    animstate = 0x9960, -- m_bIsScoped - 20
    landing_anim = 0x109, -- аэээ ну из структуры анимстейта просто взять
    m_pStudioHdr = 0x2950, -- https://github.com/frk1/hazedumper/blob/master/csgo.json#L55
}

ffi_handler.bind_argument = function(fn, arg)
    return function(...)
        return fn(arg, ...)
    end
end

ffi_handler.interface_type = ffi.typeof("uintptr_t**")

ffi_handler.i_client_entity_list = ffi.cast(ffi_handler.interface_type, Utils.CreateInterface("client.dll", "VClientEntityList003"))
ffi_handler.get_client_entity = ffi_handler.bind_argument(ffi.cast("void*(__thiscall*)(void*, int)", ffi_handler.i_client_entity_list[0][3]), ffi_handler.i_client_entity_list)

ffi_handler.get_pose_parameters = ffi.cast( "struct {char pad[8]; float m_flStart; float m_flEnd; float m_flState;}*(__thiscall* )( void*, int )", Utils.PatternScan(unpack(ffi_handler.sigs.get_pose_params)))

animation_breaker.cache = {}

local base64 = {}
local b = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'

base64.encode = function(string)
    return ((string:gsub('.', function(x)
        local r, b = '', x:byte()
        for i = 8, 1, -1 do
            r = r .. (b % 2 ^ i - b % 2 ^ (i - 1) > 0 and '1' or '0')
        end

        return r;
    end) .. '0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
        if (#x < 6) then
            return ''
        end

        local c = 0
       
        for i = 1, 6 do
            c = c + (x:sub(i, i) == '1' and 2 ^ (6 - i) or 0)
        end

        return b:sub(c + 1, c + 1)
    end) .. ({ '', '==', '=' })[#string % 3 + 1])
end

base64.decode = function(string)
    string = string.gsub(string, '[^' .. b .. '=]', '')
    return (string:gsub('.', function(x)
        if (x == '=') then
            return ''
        end

        local r, f = '', (b:find(x) - 1)
        for i = 6, 1, -1 do
            r = r .. (f % 2 ^ i -f % 2 ^ (i - 1) > 0 and '1' or '0')
        end

        return r;
    end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x)
        if (#x ~= 8) then
            return ''
        end

        local c = 0
        for i = 1, 8 do
            c = c + (x:sub(i, i) == '1' and 2 ^ (8 - i) or 0)
        end
        return string.char(c)
    end))
end

local defines = {}
local draggables = {
    create_draggable = function(start_position_x, start_position_y, starting_size_x, starting_size_y, name, callback_fn)
    return {
        position_x = start_position_x:GetInt(),
        position_y = start_position_y:GetInt(),
        size_x = starting_size_x,
        size_y = starting_size_y,
        started_dragging = false,
        initial_drag_pos = Vector2.new(0, 0),
        drag_pos = Vector2.new(0, 0),
        callback_function = callback_fn,

        update = function(self)
            if Cheat.IsMenuVisible() then
                local mouse_position = Cheat.GetMousePos()
                local is_in_bounds = (mouse_position.x >= self.position_x and mouse_position.y >= self.position_y and mouse_position.x <= self.position_x + self.size_x and mouse_position.y <= self.position_y + self.size_y)
                if (is_in_bounds or self.started_dragging) and Cheat.IsKeyDown(1) and (defines.mouse_target == 0 or defines.mouse_target == name) then
                    defines.mouse_target = name
                    if not self.started_dragging then          
                        self.started_dragging = true
                        self.initial_drag_pos = Vector2.new(mouse_position.x - self.position_x, mouse_position.y - self.position_y)
                    else
                        self.position_x = mouse_position.x - self.initial_drag_pos.x
                        self.position_y = mouse_position.y - self.initial_drag_pos.y

                        start_position_x:SetInt(math.floor(tonumber(self.position_x)))
                        start_position_y:SetInt(math.floor(tonumber(self.position_y)))
                    end
                    elseif not Cheat.IsKeyDown(1) then
                        defines.mouse_target = 0
                            self.started_dragging = false
                            self.initial_drag_pos = self.drag_pos
                    end
                end
            self.callback_function(self)
        end
    }
    end
}

local clipboard = {}

clipboard.GetClipboardTextCount = vtable_bind("vgui2.dll", "VGUI_System010", 7, "int(__thiscall*)(void*)")
clipboard.SetClipboardText = vtable_bind("vgui2.dll", "VGUI_System010", 9, "void(__thiscall*)(void*, const char*, int)")
clipboard.GetClipboardText = vtable_bind("vgui2.dll", "VGUI_System010", 11, "int(__thiscall*)(void*, int, const char*, int)")

local new_char_arr = ffi.typeof("char[?]")

clipboard.paste = function()
    local len = clipboard.GetClipboardTextCount()

    if len > 0 then
        local char_arr = new_char_arr(len)
        clipboard.GetClipboardText(0, char_arr, len)
        return ffi.string(char_arr, len - 1)
    end
end

clipboard.copy = function(string)
    string = tostring(string)

    clipboard.SetClipboardText(string, string.len(string))

    Cheat.AddEvent('Config successfully copied to clipboard')
    uwu.print('{0.54, 0.83, 1}[Aarne.club] {1, 1, 1}Config successfully copied to clipboard \n')
end

math.pi_divided = math.pi / 180

function math.clamp(value, min, max)
    return math.min(max, math.max(min, value))
end

function math.lerp(start, end_pos, time)
    if time == nil then
        time = 0.095
    end

    time = math.clamp(GlobalVars.frametime * (time * 175), 0, 1)
    if type(start) == "userdata" then
        local r, g, b, a = start.r, start.g, start.b, start.a
        local e_r, e_g, e_b, e_a = end_pos.r, end_pos.g, end_pos.b, end_pos.a
        r = math.lerp(r, e_r, time)
        g = math.lerp(g, e_g, time)
        b = math.lerp(b, e_b, time)
        a = math.lerp(a, e_a, time)
        return Color.new(r, g, b, a)
    end

    local delta = end_pos - start
    delta = delta * time
    delta = delta + start

    if end_pos == 0 and delta < 0.01 and delta > -0.01 then
        delta = 0
    elseif end_pos == 1 and delta < 1.01 and delta > 0.99 then
        delta = 1
    end

    return delta
end

function math.closest_point_on_ray(ray_from, ray_to, desired_point)
    local to = desired_point - ray_from
    local direction = ray_to - ray_from
    local ray_length = direction:Length()

    direction = direction / ray_length

    local direction_along = direction.x * to.x + direction.y * to.y + direction.z * to.z
    if direction_along < 0 then return ray_from end
    if direction_along > ray_length then return ray_to end

    return Vector.new(ray_from.x + direction.x * direction_along, ray_from.y + direction.y * direction_along, ray_from.z + direction.z * direction_along)
end

function math.normalize(ang)
    while (ang > 180.0) do
        ang = ang - 360.0
    end
    while (ang < -180.0) do
        ang = ang + 360.0
    end
    return ang
end

function Render.ShadowText(string, vector, color, font, shadow, centered)
    if not centered then centered = false end
    if shadow then
        Render.Text(string, vector + 1, Color.new(0.0, 0.0, 0.0, color.a), font.size, font.init, false, centered)
    end
    Render.Text(string, vector, color, font.size, font.init, false, centered)
end

function Render.HorizontalGradient(x, y, w, h, color_1, color_2)
    Render.GradientBoxFilled(Vector2.new(x, y), Vector2.new(x + w / 2, y + h), color_2, color_1, color_2, color_1)
    Render.GradientBoxFilled(Vector2.new(x + w / 2, y), Vector2.new(x + w, y + h), color_1, color_2, color_1, color_2)
end

function Render.FilledBox(x, y, w, h, color)
    Render.BoxFilled(Vector2.new(x, y), Vector2.new(x, y) + Vector2.new(w, h), color)
end

function C_BasePlayer:IsEnemy()
    return EntityList.GetLocalPlayer() and self:IsTeamMate() == false
end

function C_BasePlayer:IsScoped()
    return self:GetProp("m_bIsScoped")
end











uwu.print(('{0.54, 0.83, 1}[Aarne.club] {1, 1, 1}Welcome back, {0.78, 1, 0}%s \n'):format(Cheat.GetCheatUserName()))

local tabs = {
    global = "Global",
    antiaim = "Anti-Aim",
    antibruteforce = "Anti-Bruteforce",
    visual = "Visuals",
    config = "Config",
    playerlist = "Player List"
}



local vars = {}

vars.screen = EngineClient:GetScreenSize()
vars.thirdperson = Menu.FindVar("Visuals", "View", "Thirdperson", "Enable Thirdperson")
vars.minimum_damage = Menu.FindVar("Aimbot", "Ragebot", "Accuracy", "Minimum Damage")



local font = {}

-- @note: uwu?
--[[ files:create_directory()
files:download('https://fontsforyou.com/downloads/99851-smallestpixel7', 'smallest_pixel-7.ttf') ]]

font.verdana = {}
font.verdana.size = 12
font.verdana.init = Render.InitFont("Verdana", font.verdana.size)

font.arrow = {}
font.arrow.size = 15
font.arrow.init = Render.InitFont("Verdana", font.arrow.size, {"b"})

font.verdana_r = {}
font.verdana_r.size = 12
font.verdana_r.init = Render.InitFont("Verdana", font.verdana_r.size, {'r'})

font.slow = {}
font.slow.size = 14
font.slow.init = Render.InitFont("Verdana", font.slow.size, {"b"})

font.slow2 = {}
font.slow2.size = 27
font.slow2.init = Render.InitFont("Verdana", font.slow.size, {"b"})

font.pixel = {}
font.pixel.size = 10
font.pixel.init = Render.InitFont('smallest pixel-7', font.pixel.size, {"r"})

font.prediction = {}
font.prediction.size = 12
font.prediction.init = Render.InitFont("Verdana", font.prediction.size, {"b"})


vars.dt_ref = Menu.FindVar("Aimbot", "Ragebot", "Exploits", "Double Tap")
vars.hs_ref = Menu.FindVar("Aimbot", "Ragebot", "Exploits", "Hide Shots")
vars.slowmo_ref = Menu.FindVar("Aimbot", "Anti Aim", "Misc", "Slow Walk")
vars.fakelag_ref = Menu.FindVar("Aimbot", "Anti Aim", "Fake Lag", "Enable Fake Lag")




local menu = {}




local playerlist = {}

playerlist.data = {}

playerlist.hitboxes = { 'head', 'neck', 'pelvis', 'stomach', 'lower chest', 'chest', 'upper chest', 'right thigh', 'left thigh', 'right calf',
    'left calf', 'right foot', 'left foot', 'right hand', 'left hand', 'right upper arm', 'right forearm', 'left upper arm', 'left forearm' }

playerlist.ClearData = function(self)
    for player_name, menu_items in pairs(self.data) do
        for menu_item_name, menu_item in pairs(menu_items) do
            Menu.DestroyItem(menu_item)
        end
    end

    self.data = {}
end

playerlist.UpdateData = function(self)
    self:ClearData()

    local players = EntityList.GetPlayers()

    if not players or #players < 1 then
        return
    end

    for i, player in ipairs(players) do

        if player:IsEnemy() then

            local player_name = player:GetName()

            self.data[player_name] = {
                ['Override'] = Menu.Switch(tabs.playerlist, player_name, ('Override %s'):format(player_name), false),
                ['Ignore Target'] = Menu.Switch(tabs.playerlist, player_name, 'Ignore Target', false),
                ['High Priority'] = Menu.Switch(tabs.playerlist, player_name, 'High Priority', false),
                ['Force Safety'] = Menu.Switch(tabs.playerlist, player_name, 'Force Safety', false),
                ['Hitbox System'] = Menu.Switch(tabs.playerlist, player_name, 'Hitbox System', false, 'For "Disable Hitbox" and "Disable Multipoint" work you need to enable this switch.'),
                ['Disable Hitbox'] = Menu.MultiCombo(tabs.playerlist, player_name, 'Disable Hitbox', self.hitboxes, 0, 'Enable "Hitbox System" for this feature to work.'),
                ['Disable Multipoint'] = Menu.MultiCombo(tabs.playerlist, player_name, 'Disable Multipoint', self.hitboxes, 0, 'Enable "Hitbox System" for this feature to work.'),
                ['Trashtalk'] = Menu.Switch(tabs.playerlist, player_name, 'Trashtalk', false),
                ['Trashtalk Text'] = Menu.TextBox(tabs.playerlist, player_name, 'Trashtalk Text', 64, ''),
            }

        end

    end

end

playerlist:UpdateData()

playerlist.menu_keys_update = function() if #table.keys(playerlist.data) < 1 then return {'No Enemies'} end return table.keys(playerlist.data) end
playerlist.menu_keys = playerlist.menu_keys_update()

playerlist.menu_target = Menu.Combo(tabs.playerlist, 'Player List', 'Target', playerlist.menu_keys, 0)

playerlist.MenuVisible = function(self)
    local taget_index = self.menu_target:Get()
    local target_name = self.menu_keys[taget_index + 1]

    for name, k in pairs(self.data) do
        local state = (name == target_name)
       
        for menu_name, menu_item in pairs(self.data[name]) do
            self.data[name][menu_name]:SetVisible(state)
        end
    end
end

playerlist:MenuVisible()

playerlist.menu_target:RegisterCallback(function()
    playerlist:MenuVisible()
end)

playerlist.menu_update_targets = Menu.Button(tabs.playerlist, 'Player List', 'Update Targets', '', function()
    playerlist:UpdateData()
    playerlist.menu_keys = playerlist.menu_keys_update()
    playerlist.menu_target:UpdateList(playerlist.menu_keys)
    playerlist:MenuVisible()
end)



playerlist.on_prediction = function(self)
    local players = EntityList.GetPlayers()

    if not players or #players < 1 then
        return
    end

    for i, player in ipairs(players) do

        if player:IsEnemy() then

            local player_name = player:GetName()

            if playerlist.data[player_name] then

                local data = playerlist.data[player_name]

                if data['Override']:Get() then

                    local player_index = player:EntIndex()

                    if data['Ignore Target']:Get() then

                        RageBot.IgnoreTarget(player_index)

                    end

                    if data['Force Safety']:Get() then

                        RageBot.ForceSafety(player_index)

                    end

                    if data['High Priority']:Get() then

                        RageBot.SetTargetPriority(player_index, 100)

                    end

                    if data['Hitbox System']:Get() then

                        for i = 0, 18 do

                            if data['Disable Hitbox']:Get(i + 1) then
                                RageBot.EnableHitbox(player_index, i, false)
                            end

                            if data['Disable Multipoint']:Get(i + 1) then
                                RageBot.EnableMultipoints(player_index, i, false)
                            end

                        end

                    end

                end

            end

        end

    end

end



local antiaim = {}

antiaim.state_list = {"Shared", "Standing", "Moving", "Crouching", "Slowwalk", "Air", "On Use", "Roll"}
antiaim.features_list = {"Override", "Disable Anti-Bruteforce", "Yaw Add Left", "Yaw Add Right", "Yaw Modifier", "Modifier Degree", "Fake Limit Type", "Left Limit", "Right Limit", "Fake Options", "LBY Mode", "Freestanding Desync", "Desync On Shot"}


menu["Anti-Aim"] = {}


menu["Anti-Aim"]["Anti-Aim"] = {}
antiaim_menu = menu["Anti-Aim"]["Anti-Aim"]
conditions_menu = menu["Anti-Aim"]

antiaim_menu["Enable Anti-Aim"] = Menu.Switch(tabs.antiaim, "Main", "Enable Anti-Aim", false)
antiaim_menu["Anti-Aim on Use"] = Menu.Switch(tabs.antiaim, "Main", "Anti-Aim on Use", false)
antiaim_menu["Anti-Backstab"] = Menu.Switch(tabs.antiaim, "Main", "Anti-Backstab", false)
antiaim_menu["Roll Anti-Aim"] = Menu.Switch(tabs.antiaim, "Main", "Roll Anti-Aim", false)
antiaim_menu["Roll on Manuals"] = Menu.Switch(tabs.antiaim, "Main", "Roll on Manuals", false, 'Will work only if u enable any manual (left, rigth)')
antiaim_menu["Roll Left"] = Menu.SliderInt(tabs.antiaim, "Main", "Roll Left", 45, -45, 45)
antiaim_menu["Roll Right"] = Menu.SliderInt(tabs.antiaim, "Main", "Roll Right", -45, -45, 45)
antiaim_menu["Conditions"] = Menu.Switch(tabs.antiaim, "Main", "Conditions", false)
antiaim_menu["Yaw Base"] = Menu.Combo(tabs.antiaim, "Main", "Yaw Base", {"Forward", "Backward", "Right", "Left", "At Target", "Freestanding"}, 0)
antiaim_menu["Tab"] = Menu.Combo(tabs.antiaim, "Main", "Condition", antiaim.state_list, 0)

for i, state in pairs(antiaim.state_list) do
    conditions_menu[state] = {
        ["Override"] = Menu.Switch(tabs.antiaim, state, ("Override %s"):format(state), false),
        ["Disable Anti-Bruteforce"] = Menu.Switch(tabs.antiaim, state, "Disable Anti-Bruteforce", false),
        ["Yaw Add Left"] = Menu.SliderInt(tabs.antiaim, state, "Yaw Left", 0, -180, 180),
        ["Yaw Add Right"] = Menu.SliderInt(tabs.antiaim, state, "Yaw Right", 0, -180, 180),
        ["Yaw Modifier"] = Menu.Combo(tabs.antiaim, state, "Yaw Modifier", {"Disable", "Center", "Offset", "Random", "Spin"}, 0),
        ["Modifier Degree"] = Menu.SliderInt(tabs.antiaim, state, "Modifier Degree", 0, -180, 180),
        ["Fake Limit Type"] = Menu.Combo(tabs.antiaim, state, "Fake Limit Type", {"Static", "Jitter"}, 0),
        ["Left Limit"] = Menu.SliderInt(tabs.antiaim, state, "Fake Limit Left", 0, 0, 60),
        ["Right Limit"] = Menu.SliderInt(tabs.antiaim, state, "Fake Limit Right", 0, 0, 60),
        ["Fake Options"] = Menu.MultiCombo(tabs.antiaim, state, "Fake Options", {"Avoid Overlap", "Jitter", "Randomize Jitter"}, 0),
        ["LBY Mode"] = Menu.Combo(tabs.antiaim, state, "LBY Mode", {"Disable", "Opposite", "Sway"}, 0),
        ["Freestanding Desync"] = Menu.Combo(tabs.antiaim, state, "Freestanding Desync", {"Off", "Peek Fake", "Peek Real"}, 0),
        ["Desync On Shot"] = Menu.Combo(tabs.antiaim, state, "Desync On Shot", {"Disable", "Opposite", "Freestanding", "Switch"}, 0),
    }
end

antiaim.update_menu = function()
    local is_conditions = antiaim_menu["Conditions"]:Get()
    antiaim_menu["Tab"]:SetVisible(is_conditions)

    if not is_conditions then
        antiaim_menu["Tab"]:Set(0)
    end

    antiaim_menu["Roll Right"]:SetVisible(antiaim_menu["Roll Anti-Aim"]:Get())
    antiaim_menu["Roll Left"]:SetVisible(antiaim_menu["Roll Anti-Aim"]:Get())
    antiaim_menu["Roll on Manuals"]:SetVisible(antiaim_menu["Roll Anti-Aim"]:Get())

    for i, state in pairs(antiaim.state_list) do
        local tab_index = (antiaim_menu["Tab"]:Get() + 1)
        local tab_name = antiaim.state_list[tab_index]

        local menu_antiaim = conditions_menu[state]
        local menu_state = (tab_name == state)

        for i, feature in pairs(antiaim.features_list) do
            menu_antiaim[feature]:SetVisible(menu_state)
        end
       
        conditions_menu["Shared"]["Override"]:SetVisible(false)
    end
end

antiaim.update_menu()

antiaim_menu["Tab"]:RegisterCallback(antiaim.update_menu)
antiaim_menu["Conditions"]:RegisterCallback(antiaim.update_menu)
antiaim_menu["Roll Anti-Aim"]:RegisterCallback(antiaim.update_menu)



antiaim.hostage_distance = function()
    local local_player = EntityList.GetLocalPlayer()
    if not local_player then
        return false
    end

    local host_ent = EntityList.GetEntitiesByClassID(97)
    local multi_hosts_dist = {}

    for i, host in pairs(host_ent) do
        local host_origin = host:GetRenderOrigin()
        local local_origin = local_player:GetRenderOrigin()
        local dist = host_origin:DistTo(local_origin)

        table.insert(multi_hosts_dist, dist)
    end

    local min_dist = math.floor(math.min(unpack(multi_hosts_dist)))

    if math.floor(min_dist) < 70 and not (math.floor(min_dist) == 0) then
        return false
    end

    return true
end

antiaim.defuse_bomb_distance = function()
    local local_player = EntityList.GetLocalPlayer()
    if not local_player then
        return false
    end

    local curr_team = local_player:GetProp("m_iTeamNum")
    local bomb_ent = EntityList.GetEntitiesByClassID(129)

    if table.getn(bomb_ent) > 0 then
        local bomb_origin = bomb_ent[1]:GetRenderOrigin()
        local local_origin = local_player:GetRenderOrigin()
        local dist = bomb_origin:DistTo(local_origin)
       
        if dist <= 90 and curr_team ~= 2 then  
            return false
        end
    end

    return true
end

antiaim.legit_aa_time = GlobalVars.realtime
antiaim.in_use = false

antiaim.allow_on_use = function()
    if not antiaim_menu["Enable Anti-Aim"]:Get() then
        return
    end

    if not antiaim_menu["Anti-Aim on Use"]:Get() then
        return
    end

    if Cheat.IsKeyDown(0x45) and antiaim.defuse_bomb_distance() and antiaim.hostage_distance() then
        antiaim.in_use = false

        if (GlobalVars.realtime >= antiaim.legit_aa_time + 0.2) then
            if (antiaim.in_use == false) then
                EngineClient.ExecuteClientCmd("+use")
                antiaim.in_use = true
            end
            if (antiaim.in_use == true) then
                EngineClient.ExecuteClientCmd("-use")
            end
        else
            if (antiaim.in_use == true) then
                EngineClient.ExecuteClientCmd("-use")
                antiaim.in_use = false
            end
            antiaim.legit_aa_time = GlobalVars.realtime
        end
    else
        antiaim.in_use = false
    end
end

antiaim.GetManuals = function()
    local get_yaw_base = antiaim.refs["Yaw Base"]:Get()

    local freestand = (get_yaw_base == 5)
    local right = (get_yaw_base == 2)
    local left = (get_yaw_base == 3)
    local any = (left or right or freestand)

    return {
        any = any,
        left = left,
        right = right,
    }
end

antiaim.get_roll_state = function()
    if not antiaim_menu["Enable Anti-Aim"]:Get() then
        return false
    end

    if not antiaim_menu["Roll Anti-Aim"]:Get() then
        return false
    end
   
    if antiaim_menu["Roll on Manuals"]:Get() and not (antiaim.GetManuals().right or antiaim.GetManuals().left) then
        return false
    end

    return true
end

antiaim.GetPlayerState = function()
    local local_player = EntityList.GetLocalPlayer()
    if not local_player then
        return nil
    end

    local flags = local_player:GetProp("m_fFlags")
    local velocity = local_player:GetProp("m_vecVelocity"):Length2D()

    local is_in_air = bit.band(flags, 1)
    local is_crouching = bit.band(flags, 6)

    if antiaim.get_roll_state() then return 'Roll' end

    if antiaim.in_use then return "On Use" end

    if (is_in_air == 0) or Cheat.IsKeyDown(0x20) then return "Air" end

    if (is_crouching == 6) then return "Crouching" end

    if vars.slowmo_ref:Get() and velocity > 3 then return "Slowwalk" end

    if velocity > 3 then return "Moving" end

    return "Standing"
end

antiaim.GetDesync = function()
    local local_player = EntityList.GetLocalPlayer()
    if not local_player then
        return 0
    end

    local degree = math.normalize(AntiAim.GetCurrentRealRotation() - local_player:GetProp("m_angEyeAngles[1]"))
    return math.abs(math.floor(tonumber(string.format("%.2f", (math.clamp(degree, AntiAim.GetMinDesyncDelta(), AntiAim.GetMaxDesyncDelta()))))))
end


antiaim.refs = {}

antiaim.refs["Pitch"] =                 Menu.FindVar("Aimbot", "Anti Aim", "Main", "Pitch")
antiaim.refs["Yaw Base"] =              Menu.FindVar("Aimbot", "Anti Aim", "Main", "Yaw Base")
antiaim.refs["Yaw Add"] =               Menu.FindVar("Aimbot", "Anti Aim", "Main", "Yaw Add")
antiaim.refs["Yaw Modifier"] =          Menu.FindVar("Aimbot", "Anti Aim", "Main", "Yaw Modifier")
antiaim.refs["Modifier Degree"] =       Menu.FindVar("Aimbot", "Anti Aim", "Main", "Modifier Degree")
antiaim.refs["Left Limit"] =            Menu.FindVar("Aimbot", "Anti Aim", "Fake Angle", "Left Limit")
antiaim.refs["Right Limit"] =           Menu.FindVar("Aimbot", "Anti Aim", "Fake Angle", "Right Limit")
antiaim.refs["Fake Options"] =          Menu.FindVar("Aimbot", "Anti Aim", "Fake Angle", "Fake Options")
antiaim.refs["LBY Mode"] =              Menu.FindVar("Aimbot", "Anti Aim", "Fake Angle", "LBY Mode")
antiaim.refs["Freestanding Desync"] =   Menu.FindVar("Aimbot", "Anti Aim", "Fake Angle", "Freestanding Desync")
antiaim.refs["Desync On Shot"] =        Menu.FindVar("Aimbot", "Anti Aim", "Fake Angle", "Desync On Shot")




antiaim.antibruteforce = {}

antiaim.antibruteforce.limits = {
    min = 2,
    max = 10,
}

menu["Anti-Aim"]["Anti-Bruteforce"] = {}

menu["Anti-Aim"]["Anti-Bruteforce"]["Enable Anti-Bruteforce"] = Menu.Switch(tabs.antibruteforce, "Anti-Bruteforce", "Enable", false)

menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"] = Menu.SliderInt(tabs.antibruteforce, 'Anti-Bruteforce', 'Phases Count', antiaim.antibruteforce.limits.min, antiaim.antibruteforce.limits.min, antiaim.antibruteforce.limits.max)
menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:SetVisible(false)

antiaim.antibruteforce.create_phase = Menu.Button(tabs.antibruteforce, 'Anti-Bruteforce', 'Create new phase', '', function()
    if menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Get() < antiaim.antibruteforce.limits.max then
        menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Set(menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Get() + 1)
    end
end)

antiaim.antibruteforce.remove_phase = Menu.Button(tabs.antibruteforce, 'Anti-Bruteforce', 'Remove last phase', '', function()
    if menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Get() > antiaim.antibruteforce.limits.min then
        menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Set(menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Get() - 1)
    end
end)


menu["Anti-Aim"]["Anti-Bruteforce Phases"] = {}

for i = 1, antiaim.antibruteforce.limits.max do
    menu["Anti-Aim"]["Anti-Bruteforce Phases"][i] = Menu.SliderInt(tabs.antibruteforce, 'Phases', ('[Phase %i] Fake Limit'):format(i), 0, -60, 60)
end

antiaim.antibruteforce.MenuVisible = function()

    local global_state = menu["Anti-Aim"]["Anti-Bruteforce"]["Enable Anti-Bruteforce"]:Get()

    antiaim.antibruteforce.create_phase:SetVisible(global_state)
    antiaim.antibruteforce.remove_phase:SetVisible(global_state)

    for i = 1, #menu["Anti-Aim"]["Anti-Bruteforce Phases"] do

        if menu["Anti-Aim"]["Anti-Bruteforce Phases"][i] then

            menu["Anti-Aim"]["Anti-Bruteforce Phases"][i]:SetVisible(i <= menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Get() and global_state)

        end

    end
end

antiaim.antibruteforce.MenuVisible()

menu["Anti-Aim"]["Anti-Bruteforce"]["Enable Anti-Bruteforce"]:RegisterCallback(antiaim.antibruteforce.MenuVisible)
antiaim.antibruteforce.create_phase:RegisterCallback(antiaim.antibruteforce.MenuVisible)
antiaim.antibruteforce.remove_phase:RegisterCallback(antiaim.antibruteforce.MenuVisible)






antiaim.antibruteforce.work_blyad = true
antiaim.antibruteforce.distance = 150 -- дистанция при которой он работает
antiaim.antibruteforce.last_handled_tick = -1 -- последний тик когда сработал антибрут
antiaim.antibruteforce.current_phase = 0 -- текущая фаза -- 0 = выключено
antiaim.antibruteforce.update_time = 0 -- время последнего срабатывания
antiaim.antibruteforce.active_time = 5 -- seconds

antiaim.antibruteforce.on_event = function(event)
    if not menu["Anti-Aim"]["Anti-Bruteforce"]["Enable Anti-Bruteforce"]:Get() then
        return
    end

    if event:GetName() ~= "bullet_impact" then
        return
    end

    if not antiaim.antibruteforce.work_blyad then
        return
    end

    if antiaim.antibruteforce.last_handled_tick == GlobalVars.tickcount then
        return
    end

    local localplayer = EntityList.GetLocalPlayer()
    if not localplayer or not localplayer:IsAlive() then
        return
    end

    local userid = event:GetInt("userid")
    local player_object = EntityList.GetPlayerForUserID(userid)
    if not player_object or player_object:IsDormant() or player_object:IsTeamMate() then
        return
    end

    local eye_position = localplayer:GetEyePosition()
    if not eye_position then
        return
    end

    local enemy_eye_position = player_object:GetEyePosition()
    if not enemy_eye_position then
        return
    end

    local impact_vector = Vector.new(event:GetFloat("x"), event:GetFloat("y"), event:GetFloat("z"))
   
    local distance_to_local = math.closest_point_on_ray(enemy_eye_position, impact_vector, eye_position):DistTo(eye_position)

    if distance_to_local > antiaim.antibruteforce.distance then
        return
    end

    antiaim.antibruteforce.last_handled_tick = GlobalVars.tickcount
   
    -- это сделано что бы начинать антибрут с фазы которая противоположна текущему углу
    if antiaim.antibruteforce.current_phase ~= 0 then
        antiaim.antibruteforce.current_phase = antiaim.antibruteforce.current_phase + 1
        if antiaim.antibruteforce.current_phase > menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Get() then
            antiaim.antibruteforce.current_phase = 1
        end
    else
        local inverter = AntiAim.GetInverterState() and 1 or -1

        antiaim.antibruteforce.current_phase = 1

        for i = 1, menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Get() do
            local angle = menu["Anti-Aim"]["Anti-Bruteforce Phases"][i]:Get()

            if angle * inverter > 0 then
                antiaim.antibruteforce.current_phase = i
                break
            end
        end

    end

    antiaim.antibruteforce.update_time = GlobalVars.realtime + antiaim.antibruteforce.active_time
end

local antibackstab = {}

antibackstab.update = function()
    if not antiaim_menu["Anti-Backstab"]:Get() then
        return false
    end

    local local_player = EntityList.GetLocalPlayer()
    if not local_player or not local_player:IsAlive() then
        return false
    end

    local players = EntityList.GetPlayers()
    if not players or #players < 0 then
        return false
    end

    local local_origin = local_player:GetRenderOrigin()

    local enemy_w_knife = table.filter(players, function(player)
        return (not player:IsDormant() and player:IsEnemy() and player:IsAlive() and player:GetActiveWeapon() and player:GetActiveWeapon():IsKnife())
    end)

    local dist_to_local_enemy = table.filter(enemy_w_knife, function(player)
        return (local_origin:DistTo(player:GetRenderOrigin()) < 150)
    end)

    if #dist_to_local_enemy > 0 then
        return true
    end

    return false
end

antiaim.angle_vec = function(angles)
    local forward, right = Vector.new(), Vector.new()

    local pitch, yaw, roll = angles.pitch * math.pi_divided, angles.yaw * math.pi_divided, angles.roll * math.pi_divided
    local cp = math.cos(pitch)
    local sp = math.sin(pitch)

    local cy = math.cos(yaw)
    local sy = math.sin(yaw)

    local cr = math.cos(roll)
    local sr = math.sin(roll)

    forward.x = cp * cy
    forward.y = cp * sy
    forward.z = -sp

    right.x = -1 * sr * sp * cy + -1 * cr * -sy
    right.y = -1 * sr * sp * sy + -1 * cr * cy
    right.z = -1 * sr * cp

    return forward, right
end

antiaim.actual_mov = Vector2.new(0, 0)
antiaim.mov_fix = function(cmd)
    local frL, riL = antiaim.angle_vec(QAngle.new(0, cmd.viewangles.yaw, 0))
    local frC, riC = antiaim.angle_vec(cmd.viewangles)

    frL.z = 0
    riL.z = 0
    frC.z = 0
    riC.z = 0

    frL = frL / frL:Length()
    riL = riL / riL:Length()
    frC = frC / frC:Length()
    riC = riC / riC:Length()

    local worldCoords = frL * actual_mov.x + riL * actual_mov.y;

    cmd.sidemove = (frC.x * worldCoords.y - frC.y * worldCoords.x) / (riC.y * frC.x - riC.x * frC.y)
    cmd.forwardmove = (riC.y * worldCoords.x - riC.x * worldCoords.y) / (riC.y * frC.x - riC.x * frC.y)
end

antiaim.roll = function(cmd)
    if not antiaim.get_roll_state() then
        return
    end

    cmd.viewangles.roll = AntiAim.GetInverterState() and antiaim_menu["Roll Left"]:Get() or antiaim_menu["Roll Right"]:Get()
end

antiaim.roll_movement = function(cmd)
    if not antiaim.get_roll_state() then
        return
    end

    actual_mov = Vector2.new(cmd.forwardmove, cmd.sidemove)
    antiaim.mov_fix(cmd)
end


antiaim.on_prediction = function()
    if not antiaim_menu["Enable Anti-Aim"]:Get() then
        return
    end
   
    local player_state = antiaim.GetPlayerState()
    if not player_state then
        return
    end

    local is_inverted = AntiAim.GetInverterState()
    local data = conditions_menu[player_state]

    if not (data["Override"]:Get() and antiaim_menu["Conditions"]:Get()) then
        data = conditions_menu["Shared"]
    end

    for key, aa_ref in pairs(antiaim.refs) do
        local get_value = function()
            if (key == "Pitch") then
                return antiaim.in_use and 0 or 1
            end

            if (key == "Yaw Base") then
                return antiaim.in_use and 0 or antiaim_menu["Yaw Base"]:Get()
            end

            if antiaim.antibruteforce.current_phase ~= 0 and key == "Yaw Modifier" then
                return 0
            end

            if (key == "Yaw Add") then
                return is_inverted and data["Yaw Add Left"]:Get() or data["Yaw Add Right"]:Get()
            end

            if (data["Fake Limit Type"]:Get() == 1) then
                local tickcount = GlobalVars.tickcount % 4 > 1

                if (key == "Left Limit") then
                    return tickcount and data["Left Limit"]:Get() or 18
                end

                if (key == "Right Limit") then
                    return tickcount and data["Right Limit"]:Get() or 18
                end
            end

            return data[key]:Get()
        end

        local value = get_value()

        antiaim.refs[key]:Set(value)
    end

    if antibackstab.update() and not antiaim.in_use then
        antiaim.refs["Yaw Base"]:Set(4)
        antiaim.refs["Yaw Add"]:Set(180)
    end

    antiaim.antibruteforce.work_blyad = not data["Disable Anti-Bruteforce"]:Get()

    if not antiaim.antibruteforce.work_blyad or antiaim.antibruteforce.current_phase == 0 or antiaim.antibruteforce.update_time < GlobalVars.realtime then
        antiaim.antibruteforce.current_phase = 0
        return
    end


    local menu_item = menu["Anti-Aim"]["Anti-Bruteforce Phases"][antiaim.antibruteforce.current_phase]
    if not menu_item then
        return
    end

    local angle = menu_item:Get()

    AntiAim.OverrideInverter(angle < 0)
    AntiAim.OverrideLimit(math.abs(angle))
end




menu["Anti-Aim"]["Animations"] = {}

menu["Anti-Aim"]["Animations"]["Pitch on Land"] = Menu.Switch(tabs.antiaim, "Misc", "Pitch on Land", false)
menu["Anti-Aim"]["Animations"]["Static Air Legs"] = Menu.Switch(tabs.antiaim, "Misc", "Static Air Legs", false)
menu["Anti-Aim"]["Animations"]["Static Landing Legs"] = Menu.Switch(tabs.antiaim, "Misc", "Static Landing Legs", false)

animation_breaker.set_params = function(player_ptr, layer, start_val, end_val)

    player_ptr = ffi.cast("unsigned int", player_ptr)

    if player_ptr == 0x0 then
        return false
    end

    local studio_hdr = ffi.cast("void**", player_ptr + ffi_handler.offsets.m_pStudioHdr)[0]

    if studio_hdr == nil then
        return false
    end

    local pose_params = ffi_handler.get_pose_parameters(studio_hdr, layer)

    if pose_params == nil then
        return
    end

    if animation_breaker.cache[layer] == nil then
        animation_breaker.cache[layer] = {}

        animation_breaker.cache[layer].m_flStart = pose_params.m_flStart
        animation_breaker.cache[layer].m_flEnd = pose_params.m_flEnd

        animation_breaker.cache[layer].m_flState = pose_params.m_flState

        animation_breaker.cache[layer].installed = false
        return true
    end

    if start_val ~= nil and not animation_breaker.cache[layer].installed then

        pose_params.m_flStart   = start_val
        pose_params.m_flEnd     = end_val

        pose_params.m_flState   = (pose_params.m_flStart + pose_params.m_flEnd) / 2

        animation_breaker.cache[layer].installed = true
        return true
    end
   
    if animation_breaker.cache[layer].installed then

        pose_params.m_flStart   = animation_breaker.cache[layer].m_flStart
        pose_params.m_flEnd     = animation_breaker.cache[layer].m_flEnd

        pose_params.m_flState   = animation_breaker.cache[layer].m_flState

        animation_breaker.cache[layer].installed = false

        return true
    end

    return false
end

animation_breaker.handle_prediction = function(cmd)

    local local_player = ffi_handler.get_client_entity(EngineClient.GetLocalPlayer())

    if local_player == nil then
        return
    end

    local local_player_addr = ffi.cast("unsigned int", local_player)

    if local_player_addr == 0x0 then
        return
    end

    local animstate = ffi.cast( "void**", local_player_addr + ffi_handler.offsets.animstate)[0]

    if animstate == nil then
        return
    end

    animstate = ffi.cast("unsigned int", animstate)

    if animstate == 0x0 then
        return
    end
   
    local landing_anim = ffi.cast("bool*", animstate + ffi_handler.offsets.landing_anim)[0]

    if landing_anim == nil then
        return
    end

    if menu["Anti-Aim"]["Animations"]["Static Landing Legs"]:Get() then
        animation_breaker.set_params(local_player, 0, -180, -179)
    end

    if menu["Anti-Aim"]["Animations"]["Static Air Legs"]:Get() then
        animation_breaker.set_params(local_player, 6, 0.9, 1)
    end
   
    if menu["Anti-Aim"]["Animations"]["Pitch on Land"]:Get() and landing_anim and bit.band(cmd.buttons, 2) == 0 then
        animation_breaker.set_params(local_player, 12, 0.999, 1)
    end

end

animation_breaker.handle_cmove = function()

    local local_player = ffi_handler.get_client_entity(EngineClient.GetLocalPlayer())

    if local_player == nil then
        return
    end

    for k, v in pairs(animation_breaker.cache) do
        animation_breaker.set_params(local_player, k)
    end

end

animation_breaker.on_destroy = function()

    local local_player = ffi_handler.get_client_entity(EngineClient.GetLocalPlayer())

    if local_player == nil then
        return
    end

    for k, v in pairs(animation_breaker.cache) do
        animation_breaker.set_params(local_player, k)
    end

end





menu["Visual"] = {}



local binds = {}

menu["Visual"]["Binds"] = {}
binds_menu = menu["Visual"]["Binds"]

binds_menu["Enable indicators"] = Menu.MultiCombo(tabs.visual, "Visual", "Indicators", {"Desync & Line / State", "Script name", "Binds", "Min. Damage"}, 0)
binds_menu["Binds"] = Menu.MultiCombo(tabs.visual, "Visual", "Binds", {"Double Tap", "Hide Shots", "Minimum Damage"}, 0)
binds_menu["Indicators Type"]   = Menu.Combo(tabs.visual, "Visual", "Indicators type", {"Default", "Pixel"}, 0)

binds_menu["Min Damage X"] = Menu.SliderInt(tabs.visual, "Colors", "[Min. Damage] X", math.floor(vars.screen.x / 2), 0, math.floor(vars.screen.x))
binds_menu["Min Damage Y"] = Menu.SliderInt(tabs.visual, "Colors", "[Min. Damage] Y", math.floor(vars.screen.y / 2), 0, math.floor(vars.screen.y))

binds_menu["Script name Color"] = Menu.ColorEdit(tabs.visual, "Colors", "[Indicators] Script name", Color.RGBA(150, 150, 255))
binds_menu["Desync Line Color"] = Menu.ColorEdit(tabs.visual, "Colors", "[Indicators] Desync", Color.RGBA(150, 150, 255))

binds.menu_update = function()
    local state = binds_menu["Enable indicators"]

    binds_menu["Script name Color"]:SetVisible(state:Get(2))
    binds_menu["Desync Line Color"]:SetVisible(state:Get(1))
    binds_menu["Min Damage X"]:SetVisible(state:Get(4))
    binds_menu["Min Damage Y"]:SetVisible(state:Get(4))
    binds_menu["Binds"]:SetVisible(state:Get(3))
end

binds.menu_update()

binds_menu["Enable indicators"]:RegisterCallback(binds.menu_update)

local min_damage = {}

min_damage.on_draw = function()
    if not binds_menu["Enable indicators"]:Get(4) then
        return
    end

    local local_player = EntityList.GetLocalPlayer()

    if not local_player or not local_player:IsAlive() then
        return
    end

    local x, y = binds_menu["Min Damage X"]:Get(), binds_menu["Min Damage Y"]:Get()

    Render.Text(tostring(vars.minimum_damage:Get()), Vector2.new(x, y), Color.new(1.0, 1.0, 1.0), font.pixel.size, font.pixel.init, true)
end


local mt = {
    name = "",
    alpha = 0,
    add_y = 13,
    color = Color.RGBA(0, 255, 0),

    GetName = function(self)
        return self.name
    end,

    GetColor = function(self)
        return self.color
    end,

    GetBool = function()
        return true
    end,

    CustomRender = function(name, vector, color)
        Render.ShadowText(name, vector, color, font.verdana, true, true)
    end,
}

binds.data = {}

binds.data.CreateObject = function(self, array)
    table.insert(self, setmetatable(array, {__index = mt}))
end


-- @type: default

binds.data:CreateObject({
    name = "0°",

    GetName = function(self)
        local desync = antiaim.GetDesync()
        self.name = ("%s°"):format(desync)

        return self.name
    end,

    GetColor = function()
        local color = binds_menu["Desync Line Color"]:Get()
        color.a = 1.0
       
        return color
    end,

    GetBool = function()
        return binds_menu["Enable indicators"]:Get(1) and binds_menu["Indicators Type"]:Get() == 0 and antiaim.antibruteforce.current_phase == 0
    end,

    CustomRender = function(name, vector, color)
        local w = (90 / 60 * antiaim.GetDesync())

        Render.ShadowText(name, Vector2.new(vector.x, vector.y - 10), Color.new(1.0, 1.0, 1.0, color.a), font.verdana, true, true)
        Render.HorizontalGradient(vector.x - w / 2, vector.y, w, 1, color, Color.new(color.r, color.g, color.b, 0))
    end,
})

binds.data:CreateObject({
    name = "",

    GetName = function(self)
        local desync = antiaim.GetDesync()
        self.name = ("%s°"):format(desync)

        return self.name
    end,

    GetColor = function()
        local color = binds_menu["Desync Line Color"]:Get()
        color.a = 1.0
       
        return color
    end,

    GetBool = function()
        return binds_menu["Enable indicators"]:Get(1) and binds_menu["Indicators Type"]:Get() == 0 and antiaim.antibruteforce.current_phase ~= 0
    end,

    CustomRender = function(name, vector, color)
        local w = 90 / 5 * (antiaim.antibruteforce.update_time - GlobalVars.realtime)
        name = ('Phase: %s'):format(antiaim.antibruteforce.current_phase)
       
        Render.ShadowText(name, Vector2.new(vector.x, vector.y - 10), Color.new(1.0, 1.0, 1.0, color.a), font.verdana, true, true)
        Render.HorizontalGradient(vector.x - w / 2, vector.y, w, 1, color, Color.new(color.r, color.g, color.b, 0))
    end,
})

binds.data:CreateObject({
    name = "AARNE YAW",

    GetName = function(self)
        if antiaim.in_use then
            return "LEGIT AA"
        end

        if antiaim.GetManuals().any then
            return "MANUAL AA"
        end

        return self.name
    end,

    GetColor = function()
        local color = binds_menu["Script name Color"]:Get()
        color.a = 1.0
       
        return color
    end,

    GetBool = function()
        return binds_menu["Enable indicators"]:Get(2) and binds_menu["Indicators Type"]:Get() == 0
    end,
})

binds.data:CreateObject({
    name = "DT",

    GetColor = function()
        local dt_charge = Exploits.GetCharge()

        return Color.new(1.0 - (1.0 * dt_charge), dt_charge, 0.0)
    end,
   
    GetBool = function()
        if vars.dt_ref:Get() and binds_menu["Enable indicators"]:Get(3) and binds_menu["Indicators Type"]:Get() == 0 and binds_menu["Binds"]:Get(1) then
            return true
        end

        return false
    end,

    CustomRender = function(name, vector, color)
        local dt_charge = Exploits.GetCharge()

        Render.ShadowText(name, vector, color, font.verdana, true, true)
        Render.Circle(Vector2.new(vector.x - 13, vector.y), 4, 30, color, 1.6, 0, 360 * dt_charge)
    end,
})

binds.data:CreateObject({
    name = "ON-SHOT",

    GetBool = function()
        if vars.hs_ref:Get() and not vars.dt_ref:Get() and binds_menu["Enable indicators"]:Get(3) and binds_menu["Indicators Type"]:Get() == 0 and binds_menu["Binds"]:Get(2) then
            return true
        end

        return false
    end,
})

binds.data:CreateObject({
    name = "DMG",

    GetBool = function()
        local CheatBinds = Cheat.GetBinds()

        for i, bind in ipairs(CheatBinds) do
            local bind_name = bind:GetName()
            local bind_is_active = bind:IsActive()

            if (bind_name == "Minimum Damage") and bind_is_active and binds_menu["Enable indicators"]:Get(3) and binds_menu["Indicators Type"]:Get() == 0 and binds_menu["Binds"]:Get(3) then
                return true
            end
        end

        return false
    end
})



-- @type: pixel

local pixel_color_1 = Color.new(1.0, 1.0, 1.0)
local pixel_color_2 = Color.new(1.0, 1.0, 1.0)

binds.data:CreateObject({
    name = "AARNE-YAW",
    add_y = 10,

    GetName = function(self)
        return self.name
    end,

    GetColor = function()
        local color = binds_menu["Script name Color"]:Get()
        color.a = 1.0
       
        return color
    end,

    GetBool = function()
        return binds_menu["Enable indicators"]:Get(2) and binds_menu["Indicators Type"]:Get() == 1
    end,

    CustomRender = function(name, vector, color)
        local is_inverted = AntiAim.GetInverterState()

        pixel_color_1 = math.lerp(pixel_color_1, is_inverted and Color.new(1.0, 1.0, 1.0, color.a) or color)
        pixel_color_2 = math.lerp(pixel_color_2, is_inverted and color or Color.new(1.0, 1.0, 1.0, color.a))

        Render.Text("AARNE-\x20\x20\x20", vector, pixel_color_1, font.pixel.size, font.pixel.init, true, true)

        local text_size = Render.CalcTextSize("AARNE-", font.pixel.size, font.pixel.init) - Render.CalcTextSize("\x20\x20\x20", font.pixel.size, font.pixel.init)

        vector.x = vector.x + text_size.x
        Render.Text("YAW", vector, pixel_color_2, font.pixel.size, font.pixel.init, true, true)
    end,
})

binds.data:CreateObject({
    name = '',
    add_y = 10,

    GetName = function()
        return ('PHASE: %s'):format(antiaim.antibruteforce.current_phase)
    end,

    GetColor = function()
        return Color.new(1.0, 1.0, 1.0)
    end,

    GetBool = function()
        return binds_menu["Enable indicators"]:Get(1) and binds_menu["Indicators Type"]:Get() == 1 and antiaim.antibruteforce.current_phase ~= 0
    end,

    CustomRender = function(name, vector, color)
        Render.Text(name, vector, color, font.pixel.size, font.pixel.init, true, true)

        local name_size = Render.CalcTextSize(name, font.pixel.size, font.pixel.init)
        local val = antiaim.antibruteforce.update_time - GlobalVars.realtime
        Render.Circle(Vector2.new(vector.x - name_size.x / 2 - 6, vector.y), 3, 30, color, 1, 0, 360 / 5 * val)
    end,
})

binds.data:CreateObject({
    name = "",
    add_y = 10,

    GetName = function(self)
        local state = antiaim.GetPlayerState()

        if state then
            return ("%s"):format(state)
        end

        return self.name
    end,

    GetColor = function()
        return Color.new(1.0, 1.0, 1.0)
    end,

    GetBool = function()
        return binds_menu["Enable indicators"]:Get(1) and binds_menu["Indicators Type"]:Get() == 1 and antiaim.antibruteforce.current_phase == 0
    end,

    CustomRender = function(name, vector, color)
        Render.Text(name, vector, color, font.pixel.size, font.pixel.init, true, true)
    end,
})

binds.data:CreateObject({
    name = "DT",
    add_y = 10,

    GetColor = function()
        local dt_charge = Exploits.GetCharge()

        return Color.new(1.0 - (1.0 * dt_charge), dt_charge, 0.0)
    end,
   
    GetBool = function()
        if vars.dt_ref:Get() and binds_menu["Enable indicators"]:Get(3) and binds_menu["Indicators Type"]:Get() == 1 and binds_menu["Binds"]:Get(1) then
            return true
        end

        return false
    end,

    CustomRender = function(name, vector, color)
        Render.Text(name, vector, color, font.pixel.size, font.pixel.init, true, true)
    end,
})

binds.data:CreateObject({
    name = "HS",
    add_y = 10,

    GetBool = function()
        if vars.hs_ref:Get() and not vars.dt_ref:Get() and binds_menu["Enable indicators"]:Get(3) and binds_menu["Indicators Type"]:Get() == 1 and binds_menu["Binds"]:Get(2) then
            return true
        end

        return false
    end,

    CustomRender = function(name, vector, color)
        Render.Text(name, vector, color, font.pixel.size, font.pixel.init, true, true)
    end,
})

binds.data:CreateObject({
    name = "DMG",
    add_y = 10,

    GetColor = function()
        return Color.RGBA(204, 183, 106)
    end,

    GetBool = function()
        local CheatBinds = Cheat.GetBinds()

        for i, bind in ipairs(CheatBinds) do
            local bind_name = bind:GetName()
            local bind_is_active = bind:IsActive()

            if (bind_name == "Minimum Damage") and bind_is_active and binds_menu["Enable indicators"]:Get(3) and binds_menu["Indicators Type"]:Get() == 1 and binds_menu["Binds"]:Get(3) then
                return true
            end
        end

        return false
    end,

    CustomRender = function(name, vector, color)
        Render.Text(name, vector, color, font.pixel.size, font.pixel.init, true, true)
    end,
})




binds.GetActiveBinds = function(self)
    local active_binds = {}

    for i, data in ipairs(self.data) do
        data.alpha = math.lerp(data.alpha, data:GetBool() and 255 or 0, 0.095)

        if data.alpha > 1 then
            table.insert(active_binds, data)
        end
    end

    return active_binds
end

binds.on_draw = function()
    local local_player = EntityList.GetLocalPlayer()
    if not local_player or not local_player:IsAlive() then
        return
    end

    local x, y, plus = vars.screen.x / 2, vars.screen.y / 2, 0

    local active_data = binds:GetActiveBinds()
    for i, data in pairs(active_data) do
        local alpha = data.alpha / 255
        local color = data:GetColor()
        local name = data:GetName()

        color.a = alpha

        local off = y + (plus * data.add_y) + 30
        data.CustomRender(name, Vector2.new(x, off), color)

        plus = plus + alpha
    end
end



local arrows = {}

menu["Visual"]["Arrows"] = {}
arrows_menu = menu["Visual"]["Arrows"]

arrows_menu["Arrows"] = Menu.Combo(tabs.visual, "Visual", "Arrows", {"Disable", "Default", "TeamSkeet"}, 0)
arrows_menu["Size"] =  Menu.SliderInt(tabs.visual, "Visual", "[Arrow] Size", 9, 0, 50)
arrows_menu["Distance"] =  Menu.SliderInt(tabs.visual, "Visual", "[Arrow] Distance", 43, 0, 60)
arrows_menu["Arrow Color"] = Menu.ColorEdit(tabs.visual, "Colors", "[Arrows] Color", Color.RGBA(150, 150, 255))
arrows_menu["Inverted Color"] = Menu.ColorEdit(tabs.visual, "Colors", "[Arrows] Inverted Color", Color.RGBA(150, 150, 255))

arrows.update_menu = function()
    local state = arrows_menu["Arrows"]:Get()

    arrows_menu["Size"]:SetVisible(state == 2)
    arrows_menu["Distance"]:SetVisible(state == 1 or state == 2)
    arrows_menu["Arrow Color"]:SetVisible(state == 1 or state == 2)
    arrows_menu["Inverted Color"]:SetVisible(state == 2)
end

arrows.update_menu()

arrows_menu["Arrows"]:RegisterCallback(arrows.update_menu)

arrows.by_text = function(x, y, arr_col, is_manual)
    local distance = arrows_menu["Distance"]:Get()

    local arrow = ""
    local dist = 0

    if is_manual.left then
        arrow = "<"
        dist = -distance
    end

    if is_manual.right then
        arrow = ">"
        dist = distance
    end

    Render.ShadowText(arrow, Vector2.new(x + dist, y), arr_col, font.arrow, true, true)
end

arrows.by_poly = function(x, y, arr_col, inv_col, is_manual)
    local distance, height, size = arrows_menu["Distance"]:Get(), arrows_menu["Size"]:Get(), 5 + arrows_menu["Size"]:Get()

    local m_left = is_manual.left and arr_col or Color.RGBA(17, 17, 17, 130)
    local m_right = is_manual.right and arr_col or Color.RGBA(17, 17, 17, 130)

    local s_right = AntiAim.GetInverterState() and Color.RGBA(17, 17, 17, 130) or inv_col
    local s_left = AntiAim.GetInverterState() and inv_col or Color.RGBA(17, 17, 17, 130)

    Render.PolyFilled(m_left, Vector2.new(x - distance, y - height), Vector2.new(x - (distance + size), y), Vector2.new(x - distance, y + height))
    Render.PolyFilled(m_right, Vector2.new(x + distance, y - height), Vector2.new(x + (distance + size), y), Vector2.new(x + distance, y + height))

    Render.BoxFilled(Vector2.new(x - (distance - 2), y - height), Vector2.new(x - (distance - 2) + 2, y + height), s_left)
    Render.BoxFilled(Vector2.new(x + (distance - 2), y - height), Vector2.new(x + (distance - 2) - 2, y + height), s_right)
end

arrows.on_draw = function()
    local local_player = EntityList.GetLocalPlayer()
    if not local_player or not local_player:IsAlive() then
        return
    end

    local state = arrows_menu["Arrows"]:Get()
    if state == 0 then
        return
    end

    local x, y = vars.screen.x / 2, vars.screen.y / 2
    local is_manual = antiaim.GetManuals()
    local arr_col = arrows_menu["Arrow Color"]:Get()
    local inv_col = arrows_menu["Inverted Color"]:Get()

    arr_col.a = 1.0
    inv_col.a = 1.0

    if state == 1 then
        arrows.by_text(x, y, arr_col, is_manual)
    end
    if state == 2 then
        arrows.by_poly(x, y, arr_col, inv_col, is_manual)
    end
end



menu["Visual"]["Hitlogs"] = {}

menu["Visual"]["Hitlogs"]["Draw Type"] = Menu.MultiCombo(tabs.visual, "Visual", "Hitlogs", {"Custom Render", "Under Crosshair", "Console Print", }, 0)

local hitlogs = {}

hitlogs.data = {}

hitlogs.count = {
    "st",
    "nd",
    "rd"
}

hitlogs.shots = 0

hitlogs.hitgroup_names = {'head', 'chest', 'stomach', 'left arm', 'right arm', 'left leg', 'right leg', 'neck', '?', 'gear' }

hitlogs.reasons = { "hit", "resolver", "spread", "occlusion",  "prediction error" }

hitlogs.reset = function(event)
    if event:GetName() == "round_start" then
        hitlogs.shots = 0
    end
end

hitlogs.shot_data = {}

hitlogs.on_ragebot = function(shot)
    hitlogs.shot_data = {
        backtrack = shot.backtrack,
        hitchance = shot.hitchance,
        damage = shot.damage,
        angle = shot.angle,
    }
end


hitlogs.on_registered_shot = function(shot)
    local reason = hitlogs.reasons[shot.reason + 1]
    local name = EntityList.GetPlayer(shot.target_index):GetName() or "?"
    local hitchance = math.floor(shot.hitchance + 0.5)

    hitlogs.shots = hitlogs.shots + 1

    local count_shot = ("%i%s"):format(hitlogs.shots, hitlogs.count[hitlogs.shots] or "th")
   
    local log = nil
    local print_log = nil

    if reason == "hit" then
        print_log = ("{1, 1, 1}Registered {0.78, 1, 0}%s {1, 1, 1}shot in {0.78, 1, 0}%s's %s {1, 1, 1}[damage: {0.78, 1, 0}%s{1, 1, 1}/{0.78, 1, 0}%s {1, 1, 1}| hitchance: {0.78, 1, 0}%s{1, 1, 1}/{0.78, 1, 0}%s {1, 1, 1}| history: {0.78, 1, 0}%s{1, 1, 1}]"):format(count_shot, name, hitlogs.hitgroup_names[shot.hitgroup], shot.damage, hitlogs.shot_data.damage, hitchance, hitlogs.shot_data.hitchance, shot.backtrack)
        log = ("Registered %s shot in %s's %s [damage: %s/%s | hitchance: %s/%s | history: %s]"):format(count_shot, name, hitlogs.hitgroup_names[shot.hitgroup], shot.damage, hitlogs.shot_data.damage, hitchance, hitlogs.shot_data.hitchance, shot.backtrack)
    else
        print_log = ("{1, 1, 1}Missed {1, 0, 0}%s {1, 1, 1}shot in {1, 0, 0}%s's %s {1, 1, 1}due to {1, 0, 0}%s {1, 1, 1}[damage: {1, 0, 0}%s{1, 1, 1}/{1, 0, 0}%s {1, 1, 1}| hitchance: {1, 0, 0}%s{1, 1, 1}/{1, 0, 0}%s {1, 1, 1}| history: {1, 0, 0}%s{1, 1, 1}]"):format(count_shot, name, hitlogs.hitgroup_names[shot.hitgroup + 1], reason, shot.damage, hitlogs.shot_data.damage, hitchance, hitlogs.shot_data.hitchance, shot.backtrack)
        log = ("Missed %s shot in %s's %s due to %s [damage: %s/%s | hitchance: %s/%s | history: %s]"):format(count_shot, name, hitlogs.hitgroup_names[shot.hitgroup + 1], reason, shot.damage, hitlogs.shot_data.damage, hitchance, hitlogs.shot_data.hitchance, shot.backtrack)
    end

    if menu["Visual"]["Hitlogs"]["Draw Type"]:GetBool(3) then
        uwu.print('{0.54, 0.83, 1}[Aarne.club] ' .. print_log .. '\n')
    end

    if log and menu["Visual"]["Hitlogs"]["Draw Type"]:GetBool(1) then
        table.insert(hitlogs.data, {
            log = print_log,
            alpha = 1,
            realtime = GlobalVars.realtime,
        })
    end
end

hitlogs.on_draw = function()
    if not menu["Visual"]["Hitlogs"]["Draw Type"]:GetBool(1) then
        return
    end

    local x, y, plus = 5, 5, 0

    for i, data in ipairs(hitlogs.data) do

        data.alpha = math.lerp(data.alpha, (data.realtime + 5 < GlobalVars.realtime) and 0 or 255, 0.095)

        local alpha = data.alpha / 255

        local off = y + 13 * plus
        uwu.print(data.log, Vector2.new(x, off), alpha, font.verdana_r, false)
        --Render.ShadowText(data.log, Vector2.new(x, off), Color.new(1.0, 1.0, 1.0, alpha), font.verdana_r, true)

        plus = plus + alpha

        if data.alpha <= 0 then
            table.remove(hitlogs.data, i)
        end
    end
end


hitlogs.on_hurt = function(event)
    if not (event:GetName() == "player_hurt") then
        return
    end

    if not menu["Visual"]["Hitlogs"]["Draw Type"]:GetBool(2) then
        return
    end

    local local_player = EntityList.GetLocalPlayer()
    local userid = EntityList.GetPlayerForUserID(event:GetInt("userid", 0))
    local attacker = EntityList.GetPlayerForUserID(event:GetInt("attacker", 0))

    if not (local_player == attacker) then
        return
    end

    local target_name = userid:GetName()
    local health = event:GetInt("health", 0)
    local damage = event:GetInt("dmg_health", 0)
    local hitgroup = event:GetInt("hitgroup", 0)
    local hitgroup_name = hitlogs.hitgroup_names[hitgroup] or "?"

    local log = ("%s %s -%s (%s)"):format(target_name, hitgroup_name, damage, health)

    binds.data:CreateObject({
        name = log,
        time = GlobalVars.realtime,

        GetBool = function(self)
            if self.time + 5 < GlobalVars.realtime then
                return false
            end
            return true
        end,

        GetColor = function()
            if health <= 0 then
                return Color.new(0.5, 0.2, 0.2)
            end

            return Color.new(1.0, 1.0, 1.0)
        end,

        CustomRender = function(name, vector, color)
            vector.y = vector.y + 20
            Render.ShadowText(name, vector, color, font.verdana, true, true)
        end
    })
end



local snaplines = {}

menu["Visual"]["Snaplines"] = {}

menu["Visual"]["Snaplines"]["Enable and Color"] = Menu.SwitchColor(tabs.visual, "Visual", "Snaplines", false, Color.RGBA(255, 255, 255, 100))

snaplines.on_draw = function()
    if not menu["Visual"]["Snaplines"]["Enable and Color"]:GetBool() then
        return
    end

    local snap_color = menu["Visual"]["Snaplines"]["Enable and Color"]:GetColor()

    local hitbox = 4
    local players = EntityList.GetPlayers()
    local local_player = EntityList.GetLocalPlayer()

    if not local_player or not local_player:IsAlive() or not players or #players < 1 then
        return
    end
   
    local local_hitbox = local_player:GetHitboxCenter(hitbox)
    local local_hitbox_2d = Render.WorldToScreen(local_hitbox)

    if not vars.thirdperson:Get() then
        local_hitbox_2d = Vector2.new(vars.screen.x / 2, vars.screen.y)
    end

    for i, player in ipairs(players) do
        if player:IsEnemy() and player:IsAlive() and not player:IsDormant() then
            local player_hitbox = player:GetHitboxCenter(hitbox)
            local player_hitbox_2d = Render.WorldToScreen(player_hitbox)

            Render.Line(local_hitbox_2d, player_hitbox_2d, snap_color)
        end
    end
end




local hitmarker = {}

menu["Visual"]["Hitmarker"] = {}
menu["Visual"]["Hitmarker"]["Enable Hitmarker"] = Menu.MultiCombo(tabs.visual, "Visual", "Hitmarker", {'Damage', 'Сross'}, 0)

menu["Visual"]["Hitmarker"]['Color'] = Menu.ColorEdit(tabs.visual, 'Colors', '[Hitmarker] Color', Color.RGBA(255, 255, 255))

hitmarker.update_menu = function()
    local state = menu["Visual"]["Hitmarker"]["Enable Hitmarker"]:Get(1) or menu["Visual"]["Hitmarker"]["Enable Hitmarker"]:Get(2)
    menu["Visual"]["Hitmarker"]['Color']:SetVisible(state)
end

hitmarker.update_menu()

menu["Visual"]["Hitmarker"]["Enable Hitmarker"]:RegisterCallback(hitmarker.update_menu)

hitmarker.data = {}

hitmarker.on_hurt = function(event)
    if not menu["Visual"]["Hitmarker"]["Enable Hitmarker"]:Get(1) and not menu["Visual"]["Hitmarker"]["Enable Hitmarker"]:Get(2) then
        return
    end

    if not (event:GetName() == "player_hurt") then
        return
    end

    local local_player = EntityList.GetLocalPlayer()
    if not local_player then
        return
    end

    local userid = EntityList.GetPlayerForUserID(event:GetInt("userid", 0))
    local attacker = EntityList.GetPlayerForUserID(event:GetInt("attacker", 0))

    if not (local_player == attacker) then
        return
    end

    local local_weapon = local_player:GetActiveWeapon()
    if not local_weapon or not local_weapon:IsGun() then
        return
    end

    local damage = event:GetInt("dmg_health", 0)
    local hitgroup = event:GetInt("hitgroup", 0)

    local userid_hitbox = userid:GetHitboxCenter(hitgroup)

    local color = menu["Visual"]["Hitmarker"]['Color']:Get()

    table.insert(hitmarker.data, {
        alpha = 1,
        move = 1,
        color = color,
        damage = damage,
        hitgroup = hitgroup,
        userid_hitbox = userid_hitbox,

        realtime = GlobalVars.realtime,
    })
end

hitmarker.on_draw = function()
    for i, data in ipairs(hitmarker.data) do
        local hitgroup = data.hitgroup
        local userid_hitbox = data.userid_hitbox

        if not userid_hitbox or not userid_hitbox.x then
            return
        end

        local userid_hitbox_2d = Render.WorldToScreen(userid_hitbox)

        local damage = tostring(data.damage)

        data.alpha = math.lerp(data.alpha, data.move >= 200 and 0 or 255, 0.095)
        local alpha = data.alpha / 255

        data.color.a = alpha

        if menu["Visual"]["Hitmarker"]["Enable Hitmarker"]:Get(2) then
            Render.FilledBox(userid_hitbox_2d.x - 4.5, userid_hitbox_2d.y, 10, 1, data.color)
            Render.FilledBox(userid_hitbox_2d.x, userid_hitbox_2d.y - 4.5, 1, 10, data.color)
        end

        data.move = math.lerp(data.move, 255, 0.005)

        userid_hitbox_2d.y = userid_hitbox_2d.y - (70 * data.move / 255)

        if menu["Visual"]["Hitmarker"]["Enable Hitmarker"]:Get(1) then
            Render.ShadowText(damage, userid_hitbox_2d, data.color, font.verdana_r, true, true)
        end

        if data.move >= 200 then
            if data.alpha < 1 then
                table.remove(hitmarker.data, i)
            end
        end
    end
end

local scope_line = {}

scope_line.var = Menu.FindVar("Visuals", "View", "Camera", "Remove Scope")

menu["Visual"]["Custom Scope"] = {}

scope_line_menu = menu["Visual"]["Custom Scope"]

scope_line_menu["Enable"] = Menu.Switch(tabs.visual, "Visual", "Custom Scope", false)
scope_line_menu["Offset"] = Menu.SliderInt(tabs.visual, "Visual", "Offset", 10, 0, 500)
scope_line_menu["Length"] = Menu.SliderInt(tabs.visual, "Visual", "Length", 60, 0, 1000)
scope_line_menu["Color 1"] = Menu.ColorEdit(tabs.visual, "Colors", "[Custom Scope] Start", Color.RGBA(255, 255, 255))
scope_line_menu["Color 2"] = Menu.ColorEdit(tabs.visual, "Colors", "[Custom Scope] End", Color.RGBA(255, 255, 255, 0))

scope_line.update_menu = function()
    for key, menu in pairs(scope_line_menu) do
        local state = scope_line_menu["Enable"]:Get()

        if not (key == "Enable") then
            menu:SetVisible(state)
        end
    end
end

scope_line.update_menu()

scope_line_menu["Enable"]:RegisterCallback(scope_line.update_menu)

scope_line.anim_num = 0

scope_line.on_draw = function()
    if not scope_line_menu["Enable"]:Get() then
        return
    end

    scope_line.var:SetInt(2)

    local local_player = EntityList.GetLocalPlayer()

    local state = (not local_player or not local_player:IsAlive() or not local_player:GetProp("m_bIsScoped"))

    scope_line.anim_num = math.lerp(scope_line.anim_num, state and 0 or 255, 0.095)

    local alpha = scope_line.anim_num / 255

    scope_line.offset = scope_line_menu["Offset"] :Get() * alpha
    scope_line.length = scope_line_menu["Length"]:Get() * alpha
    scope_line.col_1 = scope_line_menu["Color 1"]:Get()
    scope_line.col_2 = scope_line_menu["Color 2"]:Get()
    scope_line.width = 1

    scope_line.col_1.a = scope_line.col_1.a * alpha
    scope_line.col_2.a = scope_line.col_2.a * alpha
   
    scope_line.start_x = vars.screen.x / 2
    scope_line.start_y = vars.screen.y / 2

    --Left
    Render.GradientBoxFilled(Vector2.new(scope_line.start_x - scope_line.offset, scope_line.start_y), Vector2.new(scope_line.start_x - scope_line.offset - scope_line.length, scope_line.start_y + scope_line.width), scope_line.col_1, scope_line.col_2, scope_line.col_1, scope_line.col_2)

    --Right
    Render.GradientBoxFilled(Vector2.new(scope_line.start_x + scope_line.offset, scope_line.start_y), Vector2.new(scope_line.start_x + scope_line.offset + scope_line.length, scope_line.start_y + scope_line.width), scope_line.col_1, scope_line.col_2, scope_line.col_1, scope_line.col_2)

    --Up
    Render.GradientBoxFilled(Vector2.new(scope_line.start_x, scope_line.start_y + scope_line.offset), Vector2.new(scope_line.start_x + scope_line.width, scope_line.start_y + scope_line.offset + scope_line.length), scope_line.col_1, scope_line.col_1, scope_line.col_2, scope_line.col_2)

    --Down
    Render.GradientBoxFilled(Vector2.new(scope_line.start_x, scope_line.start_y - scope_line.offset), Vector2.new(scope_line.start_x + scope_line.width, scope_line.start_y - scope_line.offset - scope_line.length), scope_line.col_1, scope_line.col_1, scope_line.col_2, scope_line.col_2)
end



local sloweddown = {}

menu["Visual"]["Velocity Recovery"] = {}

menu["Visual"]["Velocity Recovery"]["Enable"] = Menu.Switch(tabs.visual, "Visual", "Velocity Recovery", false)
menu["Visual"]["Velocity Recovery"]["X"] = Menu.SliderInt(tabs.visual, 'Visual', 'Velocity Recovery X', math.floor(vars.screen.x / 2), 0, math.floor(vars.screen.x))
menu["Visual"]["Velocity Recovery"]["Y"] = Menu.SliderInt(tabs.visual, 'Visual', 'Velocity Recovery Y', 300, 0, math.floor(vars.screen.y))

menu["Visual"]["Velocity Recovery"]["X"]:SetVisible(false)
menu["Visual"]["Velocity Recovery"]["Y"]:SetVisible(false)

sloweddown.anim_line = 0

sloweddown.on_draw = draggables.create_draggable(menu["Visual"]["Velocity Recovery"]["X"], menu["Visual"]["Velocity Recovery"]["Y"], 160, 40, 3, function(self)
    if not menu["Visual"]["Velocity Recovery"]["Enable"]:Get() then
        return
    end

    local local_player = EntityList.GetLocalPlayer()
    if not local_player or not local_player:IsAlive() then
        return
    end

    local vel = local_player:GetProp("m_flVelocityModifier")
    if vel == 1 and not Cheat.IsMenuVisible() then
        return
    end

    local color = Color.new(1.0 - (1.0 * vel), vel / 2, 0.0)
    local alpha = math.abs(GlobalVars.curtime * 2 % 2 - 1)

    local text = ("Recovery: %s%%"):format(math.floor(vel * 100))

    local text_width = 105
    sloweddown.anim_line = math.lerp(sloweddown.anim_line, math.floor((text_width - 2) * vel), 0.095)

    local x, y = self.position_x, self.position_y

    Render.PolyFilled(Color.new(0, 0, 0, 0.2 * alpha), Vector2.new(x + 20, y - 4), Vector2.new(x - 3, y + 42), Vector2.new(x + 43, y + 42))
    Render.PolyFilled(Color.new(color.r, color.g, color.b, alpha), Vector2.new(x + 20, y + 0), Vector2.new(x + 0, y + 40), Vector2.new(x + 40, y + 40))
    Render.ShadowText("!", Vector2.new(x + 15, y + 10), Color.new(0.0, 0.0, 0.0, 0.7 * alpha), font.slow2)

    Render.ShadowText(text, Vector2.new(x + 50, y + 5), Color.new(1.0, 1.0, 1.0), font.slow, true)

    Render.Box(Vector2.new(x + 50, y + 25), Vector2.new(x + 55 + text_width, y + 40), Color.new(0.0, 0.0, 0.0))
    Render.BoxFilled(Vector2.new(x + 51, y + 26), Vector2.new(x + 54 + text_width, y + 39), Color.new(0.0, 0.0, 0.0, 0.3))
    Render.BoxFilled(Vector2.new(x + 51, y + 26), Vector2.new(x + 56 + sloweddown.anim_line, y + 39), color)
end)




menu["Global"] = {}


local max_misses = {}

menu["Global"]['Max Misses'] = {
    ['Enable'] = Menu.Switch(tabs.global, 'Rage', 'Max. Misses', false, 'After Х misses, script disable head for ragebot.'),
    ['Max'] = Menu.SliderInt(tabs.global, 'Rage', 'Max.', 2, 1, 10)
}

max_misses.update_menu = function()
    local val = menu["Global"]['Max Misses']['Enable']:Get()
    menu["Global"]['Max Misses']['Max']:SetVisible(val)
end

max_misses.update_menu()
menu["Global"]['Max Misses']['Enable']:RegisterCallback(max_misses.update_menu)

max_misses.data = {}

max_misses.on_registered_shot = function(shot)
    if shot.reason ~= 1 then
        return
    end
   
    if not max_misses.data[shot.target_index] then
        max_misses.data[shot.target_index] = {
            esp_bool = false,
            shots = 0,
        }
    end

    max_misses.data[shot.target_index].shots = max_misses.data[shot.target_index].shots + 1
end

max_misses.on_prediction = function()
    if not menu["Global"]['Max Misses']['Enable']:Get() then
        return
    end
   
    for player_index, data in pairs(max_misses.data) do
        if data.shots >= menu["Global"]['Max Misses']['Max']:Get() then
            data.esp_bool = true

            RageBot.EnableHitbox(player_index, 0, false)
        end
    end
end

max_misses.reset_data = function(event)
    if event:GetName() ~= 'round_start' then
        return
    end

    max_misses.data = {}
end

ESP.CustomText("Body", "enemies", "BODY", function(ent)
    local data = max_misses.data[ent:EntIndex()]

    if data and data.esp_bool then
        return 'BODY'
    end
end)



local teleport = {}

menu['Global']['Teleport'] = {}

teleport.csgo_weapons = { [1] = "Deagle", [2] = "Pistols", [3] = "Pistols", [4] = "Pistols", [5] = "Pistols", [6] = "Pistols", [7] = "Rifle/LMG", [8] = "Rifle/LMG", [9] = "AWP", [10] = "Rifle/LMG", [11] = "AutoSnipers", [12] = "Rifle/LMG", [13] = "Rifle/LMG", [14] = "Rifle/LMG", [15] = "Rifle/LMG", [16] = "Rifle/LMG", [17] = "SMG", [18] = "SMG", [19] = "SMG", [20] = "Scout", [21] = "Rifle/LMG", [22] = "Rifle/LMG", [23] = "SMG", [24] = "SMG", [25] = "Shotgun", [26] = "SMG", [27] = "Shotgun", [28] = "Rifle/LMG", [29] = "Shotgun", [30] = "Pistols", [31] = "Taser", [32] = "Pistols", [33] = "SMG", [34] = "SMG", [35] = "Shotgun", [36] = "Pistols", [37] = "AutoSnipers", [38] = "AutoSnipers", [39] = "Rifle/LMG", [40] = "Scout", [41] = "Other", [42] = "Other", [43] = "Nades", [44] = "Nades", [45] = "Nades", [46] = "Nades", [47] = "Nades", [48] = "Nades", [49] = "Other", [59] = "Other", [60] = "Rifle/LMG", [61] = "Pistols", [63] = "Pistols", [64] = "Pistols", [500] = "Other", [505] = "Other", [506] = "Other", [507] = "Other", [508] = "Other", [509] = "Other", [512] = "Other", [514] = "Other", [515] = "Other", [516] = "Other", [197108] = "Other", [197113] = "Other", [197114] = "Other", [197115] = "Other", [197116] = "Other", [197123] = "Other", [197120] = "Other", [197128] = "Other", [197124] = "Other", [197130] = "Other", [197122] = "Other", [197117] = "Other", [197131] = "Other", [197127] = "Other", [197111] = "Other", [197125] = "Other", [197126] = "Other", [197129] = "Other", [197133] = "Other", [262205] = "Pistols", [262208] = "Pistols" }

teleport.weapons_list = {}
teleport.weapon_list_names = {}

for k, v in pairs(teleport.csgo_weapons) do
    if teleport.weapons_list[v] == nil then
        teleport.weapons_list[v] = {}
        table.insert(teleport.weapon_list_names, v)
    end

    table.insert(teleport.weapons_list[v], k)
end

table.sort(teleport.weapon_list_names)

teleport.combo_weapon_ids = {}

menu['Global']['Teleport']['Enable'] = Menu.Switch(tabs.global, 'Rage', 'Teleport In Air', false)
menu['Global']['Teleport']['Weapons'] = Menu.MultiCombo(tabs.global, 'Rage', 'Weapons', (function()
    local tbl = {}

    for k, v in pairs(teleport.weapon_list_names) do
        table.insert(tbl, v)
        teleport.combo_weapon_ids[v] = k
    end

    return tbl
end)(), 0)

teleport.update_menu = function()
    menu['Global']['Teleport']['Weapons']:SetVisible(menu['Global']['Teleport']['Enable']:Get())
end

teleport.update_menu()

menu['Global']['Teleport']['Enable']:RegisterCallback(teleport.update_menu)

teleport.min_penetrate_damage = 10

teleport.on_prediction = function()
    if not menu['Global']['Teleport']['Enable']:Get() then
        return
    end

    if not vars.dt_ref:Get() then
        return
    end

    if Exploits.GetCharge() ~= 1 then
        return
    end

    local localplayer = EntityList.GetLocalPlayer()
    if localplayer == nil or not localplayer:IsAlive() then
        return
    end

    local active_weapon = localplayer:GetActiveWeapon()
    if active_weapon == nil then
        return
    end

    active_weapon = active_weapon:GetWeaponID()

    local group_name = teleport.csgo_weapons[active_weapon]
    if group_name == nil then
        return
    end

    local is_allowed_by_combo = bit.band(menu['Global']['Teleport']['Weapons']:Get(), bit.lshift(1, teleport.combo_weapon_ids[group_name] - 1)) ~= 0
    if not is_allowed_by_combo then
        return
    end

    local flags = localplayer:GetProp("m_fFlags")
    local on_ground = bit.band(flags, bit.lshift(1, 0)) ~= 0
    if on_ground then
        return
    end

    local players = EntityList.GetPlayers()

    if #players == 1 then
        return
    end

    local local_player_hitbox = localplayer:GetHitboxCenter(6)

    for k, current_player in ipairs(players) do
        if current_player == local_player or current_player:IsDormant() or current_player:IsTeamMate() or not current_player:IsAlive() then
            goto skip
        end

        local player_eye = current_player:GetEyePosition()
       
        local penetrated_bullet = Cheat.FireBullet(current_player, player_eye, local_player_hitbox)

        if penetrated_bullet.trace.hit_entity ~= nil and penetrated_bullet.damage > teleport.min_penetrate_damage and penetrated_bullet.trace.hit_entity:EntIndex() == localplayer:EntIndex() then
            Exploits.ForceTeleport()
            break
        end

        ::skip::
    end
end

local aimbot = {}

menu["Global"]["Dormant"] = {}

menu["Global"]["Dormant"]["Dormant Enable"] = Menu.Switch(tabs.global, "Rage", "Dormant Aimbot", false, 'shit like russian army')
menu["Global"]["Dormant"]["Auto Stop"] = Menu.Switch(tabs.global, "Rage", "Auto Stop", false)
menu["Global"]["Dormant"]["Auto Scope"] = Menu.Switch(tabs.global, "Rage", "Auto Scope", false)
menu["Global"]["Dormant"]["Minimum Damage"] = Menu.SliderInt(tabs.global, "Rage", "Minimum Damage", 5, 1, 100)

aimbot.update_menu = function()
    local state = menu["Global"]["Dormant"]["Dormant Enable"]:Get()

    menu["Global"]["Dormant"]["Minimum Damage"]:SetVisible(state)
    menu["Global"]["Dormant"]["Auto Stop"]:SetVisible(state)
    menu["Global"]["Dormant"]["Auto Scope"]:SetVisible(state)
end

aimbot.update_menu()
menu["Global"]["Dormant"]["Dormant Enable"]:RegisterCallback(aimbot.update_menu)

aimbot.esp_data = {}

--@note: premium autostop
aimbot.auto_stop = function(cmd)
    cmd.forwardmove = cmd.forwardmove - cmd.forwardmove / 1.5
    cmd.sidemove = cmd.sidemove - cmd.sidemove / 1.5
end

aimbot.auto_scope = function(local_player, weapon, cmd)
    local flags = local_player:GetProp("m_fFlags")
    local scoped = local_player:IsScoped()
   
    if (weapon:IsSniper() == true and scoped == false and bit.band(flags, 1) == 1) then
        cmd.buttons = bit.bor(cmd.buttons, 2048)
    end
end

aimbot.on_prediction = function(cmd)
    if not menu["Global"]["Dormant"]["Dormant Enable"]:Get() then
        return
    end

    local local_player = EntityList.GetLocalPlayer()
    if not local_player or not local_player:IsAlive() then
        return
    end

    local local_weapon = local_player:GetActiveWeapon()
    if local_weapon == nil then
        return
    end

    local flags = local_player:GetProp("m_fFlags")
    local on_ground = bit.band(flags, bit.lshift(1, 0)) ~= 0
    if not on_ground then
        return
    end

    local players = EntityList.GetPlayers()
    if #players == 1 then
        return
    end

    local weapon_inaccuracy = 1 / local_weapon:GetInaccuracy(local_weapon)
    local min_damage = menu["Global"]["Dormant"]["Minimum Damage"]:Get()
    local is_autostop = menu["Global"]["Dormant"]["Auto Stop"]:Get()
    local is_autoscope = menu["Global"]["Dormant"]["Auto Scope"]:Get()

    local local_eye = local_player:GetEyePosition()

    local esp_data = {}

    for i, player in ipairs(players) do
        if not player:IsEnemy() or not player:IsAlive() or (player:GetESPAlpha() == 1) then
            goto skip
        end

        local trace_bullet = Cheat.FireBullet(local_player, local_eye, player:GetHitboxCenter(5))

        for i = 0, 18 do
            local trace_bullet_hitbox = Cheat.FireBullet(local_player, local_eye, player:GetHitboxCenter(i))

            if trace_bullet_hitbox.damage >= min_damage then
                trace_bullet = trace_bullet_hitbox
            end
        end


        if trace_bullet.trace.hit_entity and not EntityList.GetPlayer(trace_bullet.trace.hit_entity:EntIndex()):IsEnemy() then
            goto skip
        end

        if trace_bullet.damage >= min_damage and not local_weapon:IsReloading() and local_weapon:IsSniper() then
            esp_data[player:EntIndex()] = true

            if is_autoscope then
                aimbot.auto_scope(local_player, local_weapon, cmd)
            end

            if is_autostop then
                aimbot.auto_stop(cmd)
            end
           
            if weapon_inaccuracy >= 90 and local_player:IsScoped() and local_weapon:GetProp("m_flNextPrimaryAttack") < GlobalVars.curtime then
                local angle = Cheat.VectorToAngle(trace_bullet.trace.endpos - local_eye)

                local m_aimPunchAngle = local_player:GetProp("m_aimPunchAngle")
                local aim_punch = QAngle.new(m_aimPunchAngle.x, m_aimPunchAngle.y, 0.0)

                aim_punch.yaw = aim_punch.yaw * 2
                aim_punch.pitch = aim_punch.pitch * 2

                cmd.viewangles = angle - aim_punch

                cmd.buttons = bit.bor(cmd.buttons, 1)
                break
            end
        end

        ::skip::
    end

    aimbot.esp_data = esp_data
end

ESP.CustomText("Dormant Aimbot", "enemies", "DA", function(ent)
    if aimbot.esp_data[ent:EntIndex()] then
        return 'DA'
    end
end)



local global = {}

menu["Global"]["Custom Hitchances"] = {}

menu["Global"]["Custom Hitchances"]["Custom Hitchance"] = Menu.Switch(tabs.global, "Rage", "Custom Hitchance", false)
menu["Global"]["Custom Hitchances"]["In Air Hitchance"] = Menu.SliderInt(tabs.global, "Rage", "In Air Hitchance", 60, 0, 100)
menu["Global"]["Custom Hitchances"]["No Scope Hitchance"] = Menu.SliderInt(tabs.global, "Rage", "No Scope Hitchance", 60, 0, 100)

global.update_menu = function()
    local state = menu["Global"]["Custom Hitchances"]["Custom Hitchance"]:Get()

    menu["Global"]["Custom Hitchances"]["In Air Hitchance"]:SetVisible(state)
    menu["Global"]["Custom Hitchances"]["No Scope Hitchance"]:SetVisible(state)
end

global.update_menu()

menu["Global"]["Custom Hitchances"]["Custom Hitchance"]:RegisterCallback(global.update_menu)


global.hitchances = function()
    if not menu["Global"]["Custom Hitchances"]["Custom Hitchance"]:Get() then
        return
    end

    local local_player = EntityList.GetLocalPlayer()
    if not local_player  then
        return
    end

    local players = EntityList.GetPlayers()
    if #players < 1 then
        return
    end

    local state = antiaim.GetPlayerState()

    if state and (state == "Air") then
        local in_air_hitchance = menu["Global"]["Custom Hitchances"]["In Air Hitchance"]:Get()

        for i, player in ipairs(players) do  
            RageBot.OverrideHitchance(player:EntIndex(), in_air_hitchance)
        end

        return
    end

    local local_weapon = local_player:GetActiveWeapon()

    if local_weapon and local_weapon:IsSniper() and not local_player:IsScoped() then
        local no_scope_hitchance = menu["Global"]["Custom Hitchances"]["No Scope Hitchance"]:Get()

        for i, player in ipairs(players) do
            RageBot.OverrideHitchance(player:EntIndex(), no_scope_hitchance)
        end
    end
end

local fakelag = {}

menu["Global"]["Fake Lag"] = {}

menu["Global"]["Fake Lag"]["Disable lags on Hide Shots"] = Menu.Switch(tabs.global, "Rage", "Disable lags on Hide Shots", false, 'Disable your Fake Lags in Menu when you use Hide Shots')

fakelag.update_menu = function()
    if menu["Global"]["Fake Lag"]["Disable lags on Hide Shots"]:Get() then
        vars.fakelag_ref:Set(not vars.hs_ref:Get())
    end
end

fakelag.update_menu()

vars.hs_ref:RegisterCallback(fakelag.update_menu)
menu["Global"]["Fake Lag"]["Disable lags on Hide Shots"]:RegisterCallback(fakelag.update_menu)



local clantag = {}

menu["Global"]["ClanTag"] = {}

menu["Global"]["ClanTag"]["ClanTag"] = Menu.Switch(tabs.global, "Other", "ClanTag", false)

clantag.ffi = ffi.cast('int(__fastcall*)(const char*, const char*)', Utils.PatternScan('engine.dll', '53 56 57 8B DA 8B F9 FF 15'))
clantag.last = nil

clantag.set = function(tag)
    if tag == clantag.last then
        return
    end

    clantag.ffi(tag, tag)
    clantag.last = tag
end

clantag.build = function(tag)
    local ret = {}

    for i = 1, #tag do
        table.insert(ret, tag:sub(1, i))
    end

    for i = 1, 4 do
        table.insert(ret, tag)
    end

    for i = 1, #tag do
        table.insert(ret, tag:sub(i, #tag))
    end

    table.insert(ret, '')

    return ret
end

clantag.tag = clantag.build("aarne.club")

clantag.on_draw = function()
    if not menu["Global"]["ClanTag"]["ClanTag"]:Get() then
        return
    end

    if not EngineClient.IsConnected() then
        return
    end

    local net_channel_info = EngineClient.GetNetChannelInfo()

    if not net_channel_info then
        return
    end

    local latency = net_channel_info:GetLatency(0) / GlobalVars.interval_per_tick
    local tickcount_pred = GlobalVars.tickcount + latency
    local iter = math.floor(math.fmod(tickcount_pred / 13, #clantag.tag)) + 1

    clantag.set(clantag.tag[iter])
end

clantag.destroy = function()
    clantag.set("")
end

menu["Global"]["ClanTag"]["ClanTag"]:RegisterCallback(clantag.destroy)



local trashtalk = {}

trashtalk.phrases = {
    "Меф, кокс, героин, гашик, эксзи, амф, лучшие закладки вашего города писать в тг - fipp1337",
    "you are welcome - www.aarne.club",
    "Мы убили долбаёба и положили его в подвал, он там тухнет",
    "Тебя ебут в жопу, ты хочешь быть как Playboi Carti (Да ну нахуй)",
    "У тебя нет девушки, ты ебёшь кошку, ты — зоофил",
    "Благодари Дога то, что я не умер тебя",
    "ХАХАЗВАЗХВЗАХВХА НИЩЕНКА В ЧЕСТЬ ТЕБЯ РЕКУ НАЗВАЛИ",
    "ЗА КЕМ ДОЖРАЛ?!",
    "Почему твоя мать подписана у меня как 'Дроп' ?",
    "Нигга, ты не true",
    "Убил беременную тёлку,у неё была двойня. Триплкилл",
    "Ты гандон, я уеду в тюрьму и выебу там твоего папу",
    "Ты не ебал тёлок — ты день и ночь на PornHub'е",
    "Damn, ебашу налегке",
    "твоя шалава типа гроб, положил в нее лил пипку",
    "А ты ебаный бич",
    "Закопал его живым и он уже в могиле помер",
    "Ты ебаная шлюха, иди нюхай меф с моего хуя",
    "Его башка будто мяч — я пинал пыром",
    "Чё ты мне хочешь сказать? Уебан, помолчи, не давал тебе голос",
    "Он ещё даже тёлку не трахал, но уже убил человека",
    "A МАМЕ? А ПАПЕ??",
    "москаль, в ад",
    'лови чек на сабку хуесос нищий http://t.me/CryptoBot?start=CQzZkcNF3QN',
    "иди с медведями сфоткайся",
    "одной ногой играю (◣◢)",
    "LIFEHACK BITCH!!! (◣◢)",
    "мёда похавай, москаль",
    "hs бомjара",
    "я сейчас начну кое-что про маму говорить и мне будет всё равно, что у меня мама дома",
    "куда слетел тапок?!",
    "ща ебало будет плоским",
    "иди голубей покорми",
    "ебать я твоей матери кормушку расхуячил",
    "иди на алике силиконовые мозги вгетай себе, москаль",
    "я сожрал твою мать нахуй, и её кости хрустели, как чипсы русская картошка",
    "в лобби безмамный бот",
    "нахуя бычок об жопу тушишь?",
    "ты ден? ты наверное себе мозги мамкиными сигами задымил все",
    "Powered by www.aarne.club",
    "Заскамил узбека я думал это был таджик",
    "oh no cringe",
    'Мальчик, блять, остынь...',
    'Aarne.club - чтобы не быть Броук Боем',
    'в гулаг ублюдок',
    'no-life user',
    'и-и-и-иди нахуй шлюха',
    'ОПРАВДАЙСЯ МНЕ В ХУЙ..',
    'уничтожен',
    '1 TON жира в тебе, хуесос...',
    'У сестры знакомый военный говорит завтра ВСУ будут брать Белгород чтобы окружить Донбасс',
    'Слава Белгородской Народной Республике!',
    'где ты был 8 лет хуесос ебучий',
    'сегодня видел как ты бабку за сахар пырнул ха-ха',
    'Zаглотнул хуяку V рот уебан',
    'удобряй землю чмырь',
    'owned by bandera-script',
}


menu["Global"]["Trashtalk"] = {}

menu["Global"]["Trashtalk"]["Enable Trashtalk"] = Menu.Switch(tabs.global, "Other", "Trashtalk", false)

trashtalk.on_kill = function(event)
    if (event:GetName() == "player_death") then
        local local_player = EntityList.GetLocalPlayer()
        if not local_player then
            return
        end

        local userid = EntityList.GetPlayerForUserID(event:GetInt("userid", 0))
        local attacker = EntityList.GetPlayerForUserID(event:GetInt("attacker", 0))

        if (attacker == local_player and local_player ~= userid) then
            local phrase = menu["Global"]["Trashtalk"]["Enable Trashtalk"]:Get() and trashtalk.phrases[Utils.RandomInt(1, #trashtalk.phrases)] or ''

            local userid_name = userid:GetName()

            if playerlist.data[userid_name] and playerlist.data[userid_name]['Override']:Get() and playerlist.data[userid_name]['Trashtalk']:Get() then
                phrase = playerlist.data[userid_name]['Trashtalk Text']:Get()
            end
           
            local to_say = ("say %s"):format(phrase)

            EngineClient.ExecuteClientCmd(to_say)
        end
    end
end



local hitsound = {}

hitsound.data = {
    ["Skeet"] = "buttons\\arena_switch_press_02",
    ["Custom"] = "Custom",
}

hitsound.get_pairs = function()
    local keys = {}

    for key, index in pairs(hitsound.data) do
        table.insert(keys, key)
    end

    return keys
end

hitsound.keys = hitsound.get_pairs()

menu["Global"]["Hitsound"] = {}

menu["Global"]["Hitsound"]["Enable"] = Menu.Switch(tabs.global, "Other", "Hitsound", false)
menu["Global"]["Hitsound"]["Sounds"] = Menu.Combo(tabs.global, "Other", "Sounds", hitsound.keys, 0)
menu["Global"]["Hitsound"]["Custom"] = Menu.TextBox(tabs.global, "Other", "Custom", 64, "", "All csgo sounds\npaste.dy.fi/isy/plain")
menu["Global"]["Hitsound"]["Volume"] = Menu.SliderInt(tabs.global, "Other", "Volume", 100, 0, 100)

hitsound.update_menu = function()
    local state = menu["Global"]["Hitsound"]["Enable"]:Get()
    local main = menu["Global"]["Hitsound"]["Sounds"]:Get()

    menu["Global"]["Hitsound"]["Sounds"]:SetVisible(state)
    menu["Global"]["Hitsound"]["Custom"]:SetVisible(hitsound.data[hitsound.keys[main + 1]] == "Custom" and state)
    menu["Global"]["Hitsound"]["Volume"]:SetVisible(state)
end

hitsound.update_menu()

menu["Global"]["Hitsound"]["Enable"]:RegisterCallback(hitsound.update_menu)
menu["Global"]["Hitsound"]["Sounds"]:RegisterCallback(hitsound.update_menu)

hitsound.on_hurt = function(event)
    if not menu["Global"]["Hitsound"]["Enable"]:Get() then
        return
    end

    if not (event:GetName() == "player_hurt") then
        return
    end

    local local_player = EntityList.GetLocalPlayer()
    local userid = EntityList.GetPlayerForUserID(event:GetInt("userid", 0))
    local attacker = EntityList.GetPlayerForUserID(event:GetInt("attacker", 0))

    if not (attacker == local_player) then
        return
    end

    local hitsound_index = menu["Global"]["Hitsound"]["Sounds"]:Get()
    local hitsound_volume = menu["Global"]["Hitsound"]["Volume"]:Get() / 100
    local hitsound_check = hitsound.data[hitsound.keys[hitsound_index + 1]]

    local hitsound_name = hitsound_check == "Custom" and menu["Global"]["Hitsound"]["Custom"]:Get() or hitsound_check

    local to_execute = ("playvol %s %s"):format(hitsound_name, hitsound_volume)

    EngineClient.ExecuteClientCmd(to_execute)
end

local radar = {}

menu["Global"]["Radar"] = {}

menu["Global"]["Radar"]["Disable Radar"] = Menu.Switch(tabs.global, "Other", "Disable Radar", false)

radar.var = CVar.FindVar("cl_drawhud_force_radar")

radar.on_click = function()
    radar.var:SetInt(menu["Global"]["Radar"]["Disable Radar"]:Get() and -1 or 0)
end

radar.on_click()

menu["Global"]["Radar"]["Disable Radar"]:RegisterCallback(radar.on_click)

local molotov = {}

menu["Global"]["Molotov"] = {}

menu["Global"]["Molotov"]["Molotov Ignore-Z"] = Menu.Switch(tabs.global, "Other", "Molotov Ignore-Z", false)
menu["Global"]["Molotov"]["Molotov Wireframe"] = Menu.Switch(tabs.global, "Other", "Molotov Wireframe", false)

molotov.materials = {
    "particle/fire_burning_character/fire_env_fire_depthblend_oriented",
    "particle/fire_burning_character/fire_burning_character",
    "particle/fire_explosion_1/fire_explosion_1_oriented",
    "particle/fire_explosion_1/fire_explosion_1_bright",
    "particle/fire_burning_character/fire_burning_character_depthblend",
    "particle/fire_burning_character/fire_env_fire_depthblend",
}

molotov.on_draw = function()
    for k, v in ipairs(molotov.materials) do
        local material = MatSystem.FindMaterial(v, "")

        if material ~= nil then
            material:SetMaterialVarFlag(bit.lshift(1, 28), menu["Global"]["Molotov"]["Molotov Wireframe"]:GetBool()) -- Wireframe
            material:SetMaterialVarFlag(bit.lshift(1, 15), menu["Global"]["Molotov"]["Molotov Ignore-Z"]:GetBool()) -- IgnoreZ
        end
    end
end

molotov.on_destroy = function()
    for k, v in pairs(molotov.materials) do
        local material = MatSystem.FindMaterial(v, "")

        if material ~= nil then
            material:SetMaterialVarFlag(bit.lshift(1, 28), false) -- Wireframe
            material:SetMaterialVarFlag(bit.lshift(1, 15), false) -- IgnoreZ
        end
    end
end

local thirdperson = {}

menu["Global"]["Thirdperson"] = {}
thirdperson_menu = menu["Global"]["Thirdperson"]

thirdperson_menu["Disable 3D Person Anim"] = Menu.Switch(tabs.global, "Other", "Disable Thirdperson Anim.", false)

thirdperson.on_value = function()
    local state = thirdperson_menu["Disable 3D Person Anim"]:Get()

    Cheat.SetThirdPersonAnim(not state)
end

thirdperson.on_value()

thirdperson_menu["Disable 3D Person Anim"]:RegisterCallback(thirdperson.on_value)







local configs = {}

configs.default = "eyJWaXN1YWwiOnsiSGl0bG9ncyI6eyJEcmF3IFR5cGUiOjV9LCJBcnJvd3MiOnsiQXJyb3dzIjoxLCJTaXplIjo0LCJJbnZlcnRlZCBDb2xvciI6eyIxIjowLjU4ODIzNTMxODY2MDczNjEsIjIiOjAuNTg4MjM1MzE4NjYwNzM2MSwiMyI6MSwiNCI6MX0sIkRpc3RhbmNlIjozMywiQXJyb3cgQ29sb3IiOnsiMSI6MC40OTkxODIwNDU0NTk3NDczLCIyIjowLjU0NzI5OTAyNzQ0MjkzMjEsIjMiOjAuODM1MzY1ODMxODUxOTU5MiwiNCI6MX19LCJCaW5kcyI6eyJNaW4gRGFtYWdlIFgiOjkzMywiRW5hYmxlIGluZGljYXRvcnMiOjcsIkluZGljYXRvcnMgVHlwZSI6MSwiTWluIERhbWFnZSBZIjo1MTcsIkJpbmRzIjo3LCJEZXN5bmMgTGluZSBDb2xvciI6eyIxIjowLjQ5ODAzOTIxNTgwMzE0NjM2LCIyIjowLjU0OTAxOTYzNDcyMzY2MzMsIjMiOjAuODM1Mjk0MTI3NDY0Mjk0NCwiNCI6MX0sIlNjcmlwdCBuYW1lIENvbG9yIjp7IjEiOjAuNDk4MDM5MjE1ODAzMTQ2MzYsIjIiOjAuNTQ5MDE5NjM0NzIzNjYzMywiMyI6MC44MzUyOTQxMjc0NjQyOTQ0LCI0IjoxfX0sIkhpdG1hcmtlciI6eyJFbmFibGUgSGl0bWFya2VyIjoyLCJDb2xvciI6eyIxIjoxLCIyIjoxLCIzIjoxLCI0IjoxfX0sIlZlbG9jaXR5IFJlY292ZXJ5Ijp7IkVuYWJsZSI6ZmFsc2V9LCJTbmFwbGluZXMiOnsiRW5hYmxlIGFuZCBDb2xvciI6ZmFsc2V9LCJDdXN0b20gU2NvcGUiOnsiRW5hYmxlIjp0cnVlLCJPZmZzZXQiOjEwLCJDb2xvciAyIjp7IjEiOjEsIjIiOjEsIjMiOjEsIjQiOjB9LCJMZW5ndGgiOjYwLCJDb2xvciAxIjp7IjEiOjEsIjIiOjEsIjMiOjEsIjQiOjAuMzc4MDQ4Nzc3NTgwMjYxMjN9fX0sIkdsb2JhbCI6eyJDbGFuVGFnIjp7IkNsYW5UYWciOnRydWV9LCJGYWtlIExhZyI6eyJEaXNhYmxlIGxhZ3Mgb24gSGlkZSBTaG90cyI6dHJ1ZX0sIk1vbG90b3YiOnsiTW9sb3RvdiBJZ25vcmUtWiI6ZmFsc2UsIk1vbG90b3YgV2lyZWZyYW1lIjpmYWxzZX0sIlRyYXNodGFsayI6eyJFbmFibGUgVHJhc2h0YWxrIjp0cnVlfSwiRG9ybWFudCI6eyJEb3JtYW50IEVuYWJsZSI6ZmFsc2UsIkF1dG8gU2NvcGUiOmZhbHNlLCJBdXRvIFN0b3AiOmZhbHNlLCJNaW5pbXVtIERhbWFnZSI6NX0sIlJhZGFyIjp7IkRpc2FibGUgUmFkYXIiOnRydWV9LCJUaGlyZHBlcnNvbiI6eyJEaXNhYmxlIDNEIFBlcnNvbiBBbmltIjp0cnVlfSwiSGl0c291bmQiOnsiRW5hYmxlIjp0cnVlLCJTb3VuZHMiOjAsIkN1c3RvbSI6IiIsIlZvbHVtZSI6NTB9LCJUZWxlcG9ydCI6eyJFbmFibGUiOnRydWUsIldlYXBvbnMiOjI2NX0sIkN1c3RvbSBIaXRjaGFuY2VzIjp7IkluIEFpciBIaXRjaGFuY2UiOjEwMCwiQ3VzdG9tIEhpdGNoYW5jZSI6ZmFsc2UsIk5vIFNjb3BlIEhpdGNoYW5jZSI6MTAwfX0sIkFudGktQWltIjp7IkNyb3VjaGluZyI6eyJMZWZ0IExpbWl0Ijo2MCwiRmFrZSBMaW1pdCBUeXBlIjowLCJZYXcgQWRkIFJpZ2h0IjoyMCwiT3ZlcnJpZGUiOnRydWUsIkxCWSBNb2RlIjoxLCJGYWtlIE9wdGlvbnMiOjIsIk1vZGlmaWVyIERlZ3JlZSI6MjIsIkRpc2FibGUgQW50aS1CcnV0ZWZvcmNlIjpmYWxzZSwiWWF3IEFkZCBMZWZ0IjotMjAsIkZyZWVzdGFuZGluZyBEZXN5bmMiOjAsIkRlc3luYyBPbiBTaG90IjoxLCJSaWdodCBMaW1pdCI6NjAsIllhdyBNb2RpZmllciI6MX0sIlN0YW5kaW5nIjp7IkxlZnQgTGltaXQiOjAsIkZha2UgTGltaXQgVHlwZSI6MCwiWWF3IEFkZCBSaWdodCI6MCwiT3ZlcnJpZGUiOmZhbHNlLCJMQlkgTW9kZSI6MCwiRmFrZSBPcHRpb25zIjowLCJNb2RpZmllciBEZWdyZWUiOjAsIkRpc2FibGUgQW50aS1CcnV0ZWZvcmNlIjpmYWxzZSwiWWF3IEFkZCBMZWZ0IjowLCJGcmVlc3RhbmRpbmcgRGVzeW5jIjowLCJEZXN5bmMgT24gU2hvdCI6MCwiUmlnaHQgTGltaXQiOjAsIllhdyBNb2RpZmllciI6MH0sIlNsb3d3YWxrIjp7IkxlZnQgTGltaXQiOjAsIkZha2UgTGltaXQgVHlwZSI6MCwiWWF3IEFkZCBSaWdodCI6MCwiT3ZlcnJpZGUiOmZhbHNlLCJMQlkgTW9kZSI6MCwiRmFrZSBPcHRpb25zIjowLCJNb2RpZmllciBEZWdyZWUiOjAsIkRpc2FibGUgQW50aS1CcnV0ZWZvcmNlIjpmYWxzZSwiWWF3IEFkZCBMZWZ0IjowLCJGcmVlc3RhbmRpbmcgRGVzeW5jIjowLCJEZXN5bmMgT24gU2hvdCI6MCwiUmlnaHQgTGltaXQiOjAsIllhdyBNb2RpZmllciI6MH0sIkFudGktQnJ1dGVmb3JjZSBQaGFzZXMiOnsiMSI6NjAsIjIiOi02MCwiMyI6MCwiNCI6MCwiNSI6MCwiNiI6MCwiNyI6MCwiOCI6MCwiOSI6MCwiMTAiOjB9LCJPbiBVc2UiOnsiTGVmdCBMaW1pdCI6NjAsIkZha2UgTGltaXQgVHlwZSI6MCwiWWF3IEFkZCBSaWdodCI6MCwiT3ZlcnJpZGUiOnRydWUsIkxCWSBNb2RlIjoxLCJGYWtlIE9wdGlvbnMiOjAsIk1vZGlmaWVyIERlZ3JlZSI6MCwiRGlzYWJsZSBBbnRpLUJydXRlZm9yY2UiOmZhbHNlLCJZYXcgQWRkIExlZnQiOjAsIkZyZWVzdGFuZGluZyBEZXN5bmMiOjEsIkRlc3luYyBPbiBTaG90IjoxLCJSaWdodCBMaW1pdCI6NjAsIllhdyBNb2RpZmllciI6MH0sIlNoYXJlZCI6eyJMZWZ0IExpbWl0IjoxOCwiRmFrZSBMaW1pdCBUeXBlIjowLCJZYXcgQWRkIFJpZ2h0IjowLCJPdmVycmlkZSI6ZmFsc2UsIkxCWSBNb2RlIjoxLCJGYWtlIE9wdGlvbnMiOjIsIk1vZGlmaWVyIERlZ3JlZSI6NTQsIkRpc2FibGUgQW50aS1CcnV0ZWZvcmNlIjp0cnVlLCJZYXcgQWRkIExlZnQiOjAsIkZyZWVzdGFuZGluZyBEZXN5bmMiOjAsIkRlc3luYyBPbiBTaG90IjoxLCJSaWdodCBMaW1pdCI6MTgsIllhdyBNb2RpZmllciI6MX0sIkFpciI6eyJMZWZ0IExpbWl0Ijo0NywiRmFrZSBMaW1pdCBUeXBlIjoxLCJZYXcgQWRkIFJpZ2h0IjotNywiT3ZlcnJpZGUiOmZhbHNlLCJMQlkgTW9kZSI6MCwiRmFrZSBPcHRpb25zIjoyLCJNb2RpZmllciBEZWdyZWUiOjEsIkRpc2FibGUgQW50aS1CcnV0ZWZvcmNlIjpmYWxzZSwiWWF3IEFkZCBMZWZ0IjotNywiRnJlZXN0YW5kaW5nIERlc3luYyI6MCwiRGVzeW5jIE9uIFNob3QiOjIsIlJpZ2h0IExpbWl0Ijo0NywiWWF3IE1vZGlmaWVyIjoxfSwiTW92aW5nIjp7IkxlZnQgTGltaXQiOjAsIkZha2UgTGltaXQgVHlwZSI6MCwiWWF3IEFkZCBSaWdodCI6MCwiT3ZlcnJpZGUiOmZhbHNlLCJMQlkgTW9kZSI6MCwiRmFrZSBPcHRpb25zIjowLCJNb2RpZmllciBEZWdyZWUiOjAsIkRpc2FibGUgQW50aS1CcnV0ZWZvcmNlIjpmYWxzZSwiWWF3IEFkZCBMZWZ0IjowLCJGcmVlc3RhbmRpbmcgRGVzeW5jIjowLCJEZXN5bmMgT24gU2hvdCI6MCwiUmlnaHQgTGltaXQiOjAsIllhdyBNb2RpZmllciI6MH0sIkFudGktQWltIjp7IllhdyBCYXNlIjo0LCJSb2xsIG9uIE1hbnVhbHMiOmZhbHNlLCJDb25kaXRpb25zIjp0cnVlLCJBbnRpLUFpbSBvbiBVc2UiOnRydWUsIkFudGktQmFja3N0YWIiOnRydWUsIlJvbGwgTGVmdCI6LTQ1LCJSb2xsIFJpZ2h0Ijo0NSwiRW5hYmxlIEFudGktQWltIjp0cnVlLCJUYWIiOjAsIlJvbGwgQW50aS1BaW0iOmZhbHNlfSwiQW5pbWF0aW9ucyI6eyJTdGF0aWMgQWlyIExlZ3MiOnRydWUsIlBpdGNoIG9uIExhbmQiOmZhbHNlLCJTdGF0aWMgTGFuZGluZyBMZWdzIjp0cnVlfSwiQW50aS1CcnV0ZWZvcmNlIjp7IkVuYWJsZSBBbnRpLUJydXRlZm9yY2UiOnRydWUsIlBoYXNlcyBDb3VudCI6Mn0sIlJvbGwiOnsiTGVmdCBMaW1pdCI6NjAsIkZha2UgTGltaXQgVHlwZSI6MCwiWWF3IEFkZCBSaWdodCI6MCwiT3ZlcnJpZGUiOnRydWUsIkxCWSBNb2RlIjowLCJGYWtlIE9wdGlvbnMiOjAsIk1vZGlmaWVyIERlZ3JlZSI6MCwiRGlzYWJsZSBBbnRpLUJydXRlZm9yY2UiOnRydWUsIllhdyBBZGQgTGVmdCI6MCwiRnJlZXN0YW5kaW5nIERlc3luYyI6MCwiRGVzeW5jIE9uIFNob3QiOjEsIlJpZ2h0IExpbWl0Ijo2MCwiWWF3IE1vZGlmaWVyIjowfX19"

configs.data = {}

configs.update = function()
    for tab_name, tab in pairs(menu) do
        configs.data[tab_name] = {}
        for global_item_name, tab2 in pairs(tab) do
            configs.data[tab_name][global_item_name] = {}
            for item_name, item in pairs(tab2) do
                local value = item:Get()

                -- @note: крутой метод получения макак
                if type(value) == 'userdata' then
                    local color = item:Get()

                    value = {color.r, color.g, color.b, color.a}
                end

                configs.data[tab_name][global_item_name][item_name] = value
            end
        end
    end
end

configs.load = function(values)
    if values == nil then
        Cheat.AddEvent("Something went wrong... Check the config data again")
        uwu.print('{0.54, 0.83, 1}[Aarne.club] {1, 1, 1}Something went wrong... Check the {0.78, 1, 0}config data {1, 1, 1}again \n')
        return
    end

    for tab_name, tab in pairs(menu) do
        for global_item_name, tab2 in pairs(tab) do
            for item_name, item in pairs(tab2) do
                local value = values[tab_name]

                if value == nil then
                    --print('[Error] tab_name ' .. tab_name)
                    goto skip
                end

                value = values[tab_name][global_item_name]

                if value == nil then
                    --print('[Error] global_item_name ' .. global_item_name)
                    goto skip
                end

                value = values[tab_name][global_item_name][item_name]

                if value == nil then
                    local error_log = ('Failed to load config for (%s) children item of (%s) item'):format(item_name, global_item_name)

                    Cheat.AddEvent(error_log)
                    uwu.print(('{0.54, 0.83, 1}[Aarne.club] {1, 1, 1}Failed to load config for {0.78, 1, 0}%s {1, 1, 1}children item of {0.78, 1, 0}%s {1, 1, 1}item \n'):format(item_name, global_item_name))

                    goto skip
                end

                if type(value) == 'table' then
                    value = Color.new(unpack(value))
                end

                --print(tab_name, global_item_name, item_name, value)

                menu[tab_name][global_item_name][item_name]:Set(value)
                ::skip::
            end
        end
    end

    max_misses.update_menu()
    fakelag.update_menu()
    radar.on_click()
    aimbot.update_menu()
    global.update_menu()
    arrows.update_menu()
    antiaim.update_menu()
    scope_line.update_menu()
    hitsound.update_menu()
    hitmarker.update_menu()
    teleport.update_menu()
    antiaim.antibruteforce.MenuVisible()

    Cheat.AddEvent('Config successfully loaded!')
    uwu.print('{0.54, 0.83, 1}[Aarne.club] {1, 1, 1}Config {0.78, 1, 0}successfully {1, 1, 1}loaded!\n')
end





configs.url = 'https://625c894695cd5855d6139e9b.mockapi.io/api/v1/config/'

configs.create_config = function(config_password, config_name, config_data)
    http.request(configs.url, {
        type = 'POST',
        data = {
            config_password = config_password,
            config_name = config_name,
            config_data = config_data,
        }
    })
end

configs.delete_config = function(id)
    http.request(configs.url .. id, {type = 'DELETE'})
end

configs.all_configs = {}
configs.my_configs = {}

configs.parse_configs = function()
    configs.all_configs = {}

    local parse_configs = json.parse(Http.Get(configs.url))

    if type(parse_configs) ~= 'table' or #parse_configs < 1 then
        return
    end

    for i, next_config_data in ipairs(parse_configs) do
        for key, data in pairs(next_config_data) do
            configs.all_configs[tostring(next_config_data.config_name)] = {
                id = next_config_data.id,
                config_data = next_config_data.config_data,
                config_password = next_config_data.config_password,
            }
        end
    end
end

configs.parse_configs()

configs.ui = {}

configs.ui.name = Menu.TextBox(tabs.config, 'Create', 'Config Name', 64, '')
configs.ui.password = Menu.TextBox(tabs.config, 'Create', 'Config Password', 64, '', 'You need to set a password for further access to delete the config.')
configs.ui.upload = Menu.Button(tabs.config, 'Create', 'Upload Config', '')

configs.ui.configs = Menu.Combo(tabs.config, 'Cloud', 'Configs', {'no configs :('}, 0)
configs.ui.access_password = Menu.TextBox(tabs.config, 'Cloud', 'Config Password', 64, '', 'Enter the password for the config to access the delete.')
configs.ui.update_configs = Menu.Button(tabs.config, 'Cloud', 'Update List', '')
configs.ui.load = Menu.Button(tabs.config, 'Cloud', 'Load Config', '')
configs.ui.delete = Menu.Button(tabs.config, 'Cloud', 'Delete Config', '')

configs.update_configs_list = function()
    configs.parse_configs()

    local config_names = table.keys(configs.all_configs)

    if (#config_names < 1) then
        config_names = {'no configs :('}
    end

    configs.ui.configs:UpdateList(config_names)
    Cheat.AddEvent('Config list successfully updated!')
end

configs.update_configs_list()

configs.ui.update_configs:RegisterCallback(configs.update_configs_list)

configs.upload = function()
    local config_names = table.keys(configs.all_configs)

    configs.update()

    local response = json.encode(configs.data)
    local encoded_config = base64.encode(response)

    local config_password = configs.ui.password:Get()
    local config_name = configs.ui.name:Get()
    local config_data = encoded_config

    if table.find(config_names, config_name) then
        Cheat.AddEvent('This name already exists.')
        return
    end

    configs.create_config(config_password, config_name, config_data)
    Cheat.AddEvent('Config successfully uploaded!')

    configs.update_configs_list()
end

configs.ui.upload:RegisterCallback(configs.upload)

configs.delete_my_config = function()
    local config_index = configs.ui.configs:Get()
    local config_names = table.keys(configs.all_configs)
    local config_name = config_names[config_index + 1]
    local config_password = configs.ui.access_password:Get()

    if not configs.all_configs[config_name] then
        Cheat.AddEvent('This config does not exist.')
        return
    end

    local config_data = configs.all_configs[config_name]

    if not (config_data.config_password == config_password) then
        Cheat.AddEvent('Wrong config password.')
        return
    end

    configs.delete_config(config_data.id)
    Cheat.AddEvent('Config successfully deleted!')

    configs.update_configs_list()
end

configs.ui.delete:RegisterCallback(configs.delete_my_config)

configs.load_config = function()
    local config_index = configs.ui.configs:Get()
    local config_names = table.keys(configs.all_configs)
    local config_name = config_names[config_index + 1]

    if not configs.all_configs[config_name] then
        Cheat.AddEvent('This config does not exist.')
        return
    end

    local config_data = configs.all_configs[config_name].config_data
    local decoded_config_data = base64.decode(config_data)
    local json_to_table = json.parse(decoded_config_data)

    configs.load(json_to_table)
end

configs.ui.load:RegisterCallback(configs.load_config)




Menu.Button(tabs.config, 'Recommendations', 'Discord Server', '', function()
    Panorama.Open().SteamOverlayAPI.OpenExternalBrowserURL('https://discord.gg/tSjcsbmMFF')
end)

Menu.Button(tabs.config, 'Recommendations', 'NL Config', '', function()
    Panorama.Open().SteamOverlayAPI.OpenExternalBrowserURL('https://en.neverlose.cc/market/item?id=VKC48g')
end)

Menu.Button(tabs.config, 'Recommendations', 'Solus UI', '', function()
    Panorama.Open().SteamOverlayAPI.OpenExternalBrowserURL('https://en.neverlose.cc/market/item?id=XjP7t5')
end)

local callbacks = {}

callbacks.on_prediction = function(cmd)
    animation_breaker.handle_prediction(cmd)
    aimbot.on_prediction(cmd)
    global hitchance()
    antiaim.on_prediction()
    antiaim.allow_on_use()
    teleport.on_prediction()
    antiaim.roll(cmd)
    playerlist:on_prediction()
    max_misses.on_prediction()
end

callbacks.on_createmove = function(cmd)
    animation_breaker.handle_cmove()
    antiaim.roll_movement(cmd)
end

callbacks.on_evets = function(event)
    antiaim.antibruteforce.on_event(event)
    hitmarker.on_hurt(event)
    trashtalk.on_kill(event)
    hitlogs.on_hurt(event)
    hitlogs reset(event)
    hitsound.on_hurt(event)
    max_misses.reset_data(event)
end

callbacks.on_draw = function()
    scope_line.on_draw()
    hitmarker.on_draw()
    snaplines.on_draw()
    molotov.on_draw()
    hitlogs.on_draw()
    arrows.on_draw()
    binds.on_draw()
    sloweddown.on_draw:update()
    min_damage.on_draw()
    clantag.on_draw()
end

callbacks.on_destroy = function()
    animation_breaker.on_destroy()
    molotov.on_destroy()
    clantag.destroy()
end

callbacks.on_registered_shot = function(shot)
    hitlogs.on_registered_shot(shot)
    max_misses.on_registered_shot(shot)
end

callbacks.on_ragebot = function(shot)
    hitlogs.on_ragebot(shot)
end

Cheat.RegisterCallback("draw", callbacks.on_draw)
Cheat.RegisterCallback("events", callbacks.on_evets)
Cheat.RegisterCallback("destroy", callbacks.on_destroy)
Cheat.RegisterCallback("prediction", callbacks.on_prediction)
Cheat.RegisterCallback("createmove", callbacks.on_createmove)
Cheat.RegisterCallback("ragebot_shot", callbacks.on_ragebot)
Cheat.RegisterCallback("registered_shot", callbacks.on_registered_shot)
configs.url = '
Пожалуйста, авторизуйтесь для просмотра ссылки.
' lol, xd открой и ослепни
 
Nike.lua
Олдфаг
Статус
Оффлайн
Регистрация
13 Окт 2020
Сообщения
2,747
Реакции[?]
1,465
Поинты[?]
2K
Пользователь
Статус
Оффлайн
Регистрация
15 Апр 2020
Сообщения
236
Реакции[?]
104
Поинты[?]
0
code_language.lua:
local function vtable_entry(instance, index, type)
    return ffi.cast(type, (ffi.cast("void***", instance)[0])[index])
end

local function vtable_thunk(index, typestring)
    local t = ffi.typeof(typestring)
    return function(instance, ...)
        assert(instance ~= nil)
        if instance then
            return vtable_entry(instance, index, t)(instance, ...)
        end
    end
end

local function vtable_bind(module, interface, index, typestring)F
    local instance = Utils.CreateInterface(module, interface) or error("invalid interface")
    local fnptr = vtable_entry(instance, index, ffi.typeof(typestring)) or error("invalid vtable")
    return function(...)
        return fnptr(instance, ...)
    end
end

function table.keys(array) local out = {} for key, k in pairs(array) do table.insert(out, key) end return out end
function table.find(array, to_find) for i, k in ipairs(array) do return k == to_find end end

function table.filter(array, func)
    local filtered = {}

    for i, k in ipairs(array) do
        if func(k) then
            table.insert(filtered, k)
        end
    end

    return filtered
end

local files = {}

ffi.cdef[[
    typedef struct {
        uint8_t r;
        uint8_t g;
        uint8_t b;
        uint8_t a;
    } color_struct_t;

    typedef void (__cdecl* console_color_print)(void*,const color_struct_t&, const char*, ...);

    bool URLDownloadToFileA(void* LPUNKNOWN, const char* LPCSTR, const char* LPCSTR2, int a, int LPBINDSTATUSCALLBACK);
    bool CreateDirectoryA(const char* lpPathName, void* lpSecurityAttributes);
    bool DeleteUrlCacheEntryA(const char* lpszUrlName);
]]

local console = {}

console.interface_type = ffi.typeof("uintptr_t**")
console.cvar_interface = ffi.cast(console.interface_type, Utils.CreateInterface("vstdlib.dll", "VEngineCvar007"))
console._print = ffi.cast("console_color_print", console.cvar_interface[0][25])

console.color_print = function(color, text)
    if color == nil then
        return
    end

    local col = ffi.new("color_struct_t")
    col.r = color.r * 255
    col.g = color.g * 255
    col.b = color.b * 255
    col.a = color.a * 255

    console._print(console.cvar_interface, col, text)
end

console.print = function(...)
    console.color_print(Color.RGBA(118, 200, 232), '[Aarne.club] ')

    for i, v in ipairs({...}) do
        local color = v[2] or Color.RGBA(255, 255, 255)
        local text = v[1] or ''

        console.color_print(color, text)
    end

    print('')
end

--@nope: uwu colored printi :33333
local uwu = {}

uwu.calc_count = function(string, search)
    local count = 0

    for i = 1, #string do
        if string:sub(i, i) == search then
            count = count + 1
        end
    end

    return count
end

--@note: ДА У МЕНЯ ЧУТЬ МАЗГА НАХЪУЙ НЕ ВЗАРВАЛАСЬ ТАКОЕ ДЕЛАТЬ ЕБАНЫЙ РОТ
uwu.print = function(_string, vector, alpha, font, shadow)
    local string = _string
    local old_text_size = 0

    for i = 1, uwu.calc_count(string, "{") do
        local start_prefix = string:find('{')
        local end_prefix = string:find('}')

        local string_color = string:sub(start_prefix, end_prefix)
        local load_color = loadstring('return ' .. string_color)()
        local next_string = string:sub(end_prefix + 1)

        local next_prefix_start = next_string:find('{')
        local new_string = next_prefix_start and next_string:sub(1, next_prefix_start - 1) or next_string

        string = next_string

        if (vector or alpha or font or shadow) then
            local color = Color.new(unpack(load_color))
            color.a = alpha

            Render.ShadowText(new_string, Vector2.new(vector.x + old_text_size, vector.y), color, font, shadow, false)

            old_text_size = old_text_size + Render.CalcTextSize(new_string, font.size, font.init).x

            goto skip
        end

        console.color_print(Color.new(unpack(load_color)), new_string)

        ::skip::
    end
end



files.default_path = 'nl\\aarne.club'

files.UrlMon = ffi.load('UrlMon')
files.WinInet = ffi.load('WinInet')
files.Gdi32 = ffi.load('Gdi32')

files.download = function(self, url, file_name, path)
    path = path and path or self.default_path

    path = path .. '\\' .. file_name

    self.WinInet.DeleteUrlCacheEntryA(url)
    self.UrlMon.URLDownloadToFileA(nil, url, path, 0, 0)
   
    local log = ('Successfully downloaded (%s) to (%s) folder'):format(file_name, self.default_path)
    Cheat.AddEvent(log)
    uwu.print(('{0.54, 0.83, 1}[Aarne.club] {1, 1, 1}Successfully downloaded {0.78, 1, 0}%s {1, 1, 1}to {0.78, 1, 0}%s {1, 1, 1}folder \n'):format(file_name, self.default_path))
end

files.create_directory = function(self, path)
    path = path and path or self.default_path

    ffi.C.CreateDirectoryA(path, NULL)

    local log = ('Successfully created (%s) folder'):format(path)
    Cheat.AddEvent(log)
    uwu.print(('{0.54, 0.83, 1}[Aarne.club] {1, 1, 1}Successfully created {0.78, 1, 0}%s {1, 1, 1}folder \n'):format(path))
end

local http = Panorama.LoadString([[
    return {
        request: function(url, options){
            $.AsyncWebRequest(url, options);
        }
    }
]])()

local json = Panorama.LoadString([[
    return {
        encode: JSON.stringify,
        parse: JSON.parse
    };
]])()

local ffi_handler = {}
local animation_breaker = {}

ffi_handler.sigs = {
    get_pose_params = {"client.dll", "55 8B EC 8B 45 08 57 8B F9 8B 4F 04 85 C9 75 15"} -- https://github.com/perilouswithadollarsign/cstrike15_src/blob/master/public/studio.cpp#L931
}

ffi_handler.offsets = {
    animstate = 0x9960, -- m_bIsScoped - 20
    landing_anim = 0x109, -- аэээ ну из структуры анимстейта просто взять
    m_pStudioHdr = 0x2950, -- https://github.com/frk1/hazedumper/blob/master/csgo.json#L55
}

ffi_handler.bind_argument = function(fn, arg)
    return function(...)
        return fn(arg, ...)
    end
end

ffi_handler.interface_type = ffi.typeof("uintptr_t**")

ffi_handler.i_client_entity_list = ffi.cast(ffi_handler.interface_type, Utils.CreateInterface("client.dll", "VClientEntityList003"))
ffi_handler.get_client_entity = ffi_handler.bind_argument(ffi.cast("void*(__thiscall*)(void*, int)", ffi_handler.i_client_entity_list[0][3]), ffi_handler.i_client_entity_list)

ffi_handler.get_pose_parameters = ffi.cast( "struct {char pad[8]; float m_flStart; float m_flEnd; float m_flState;}*(__thiscall* )( void*, int )", Utils.PatternScan(unpack(ffi_handler.sigs.get_pose_params)))

animation_breaker.cache = {}

local base64 = {}
local b = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'

base64.encode = function(string)
    return ((string:gsub('.', function(x)
        local r, b = '', x:byte()
        for i = 8, 1, -1 do
            r = r .. (b % 2 ^ i - b % 2 ^ (i - 1) > 0 and '1' or '0')
        end

        return r;
    end) .. '0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
        if (#x < 6) then
            return ''
        end

        local c = 0
       
        for i = 1, 6 do
            c = c + (x:sub(i, i) == '1' and 2 ^ (6 - i) or 0)
        end

        return b:sub(c + 1, c + 1)
    end) .. ({ '', '==', '=' })[#string % 3 + 1])
end

base64.decode = function(string)
    string = string.gsub(string, '[^' .. b .. '=]', '')
    return (string:gsub('.', function(x)
        if (x == '=') then
            return ''
        end

        local r, f = '', (b:find(x) - 1)
        for i = 6, 1, -1 do
            r = r .. (f % 2 ^ i -f % 2 ^ (i - 1) > 0 and '1' or '0')
        end

        return r;
    end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x)
        if (#x ~= 8) then
            return ''
        end

        local c = 0
        for i = 1, 8 do
            c = c + (x:sub(i, i) == '1' and 2 ^ (8 - i) or 0)
        end
        return string.char(c)
    end))
end

local defines = {}
local draggables = {
    create_draggable = function(start_position_x, start_position_y, starting_size_x, starting_size_y, name, callback_fn)
    return {
        position_x = start_position_x:GetInt(),
        position_y = start_position_y:GetInt(),
        size_x = starting_size_x,
        size_y = starting_size_y,
        started_dragging = false,
        initial_drag_pos = Vector2.new(0, 0),
        drag_pos = Vector2.new(0, 0),
        callback_function = callback_fn,

        update = function(self)
            if Cheat.IsMenuVisible() then
                local mouse_position = Cheat.GetMousePos()
                local is_in_bounds = (mouse_position.x >= self.position_x and mouse_position.y >= self.position_y and mouse_position.x <= self.position_x + self.size_x and mouse_position.y <= self.position_y + self.size_y)
                if (is_in_bounds or self.started_dragging) and Cheat.IsKeyDown(1) and (defines.mouse_target == 0 or defines.mouse_target == name) then
                    defines.mouse_target = name
                    if not self.started_dragging then          
                        self.started_dragging = true
                        self.initial_drag_pos = Vector2.new(mouse_position.x - self.position_x, mouse_position.y - self.position_y)
                    else
                        self.position_x = mouse_position.x - self.initial_drag_pos.x
                        self.position_y = mouse_position.y - self.initial_drag_pos.y

                        start_position_x:SetInt(math.floor(tonumber(self.position_x)))
                        start_position_y:SetInt(math.floor(tonumber(self.position_y)))
                    end
                    elseif not Cheat.IsKeyDown(1) then
                        defines.mouse_target = 0
                            self.started_dragging = false
                            self.initial_drag_pos = self.drag_pos
                    end
                end
            self.callback_function(self)
        end
    }
    end
}

local clipboard = {}

clipboard.GetClipboardTextCount = vtable_bind("vgui2.dll", "VGUI_System010", 7, "int(__thiscall*)(void*)")
clipboard.SetClipboardText = vtable_bind("vgui2.dll", "VGUI_System010", 9, "void(__thiscall*)(void*, const char*, int)")
clipboard.GetClipboardText = vtable_bind("vgui2.dll", "VGUI_System010", 11, "int(__thiscall*)(void*, int, const char*, int)")

local new_char_arr = ffi.typeof("char[?]")

clipboard.paste = function()
    local len = clipboard.GetClipboardTextCount()

    if len > 0 then
        local char_arr = new_char_arr(len)
        clipboard.GetClipboardText(0, char_arr, len)
        return ffi.string(char_arr, len - 1)
    end
end

clipboard.copy = function(string)
    string = tostring(string)

    clipboard.SetClipboardText(string, string.len(string))

    Cheat.AddEvent('Config successfully copied to clipboard')
    uwu.print('{0.54, 0.83, 1}[Aarne.club] {1, 1, 1}Config successfully copied to clipboard \n')
end

math.pi_divided = math.pi / 180

function math.clamp(value, min, max)
    return math.min(max, math.max(min, value))
end

function math.lerp(start, end_pos, time)
    if time == nil then
        time = 0.095
    end

    time = math.clamp(GlobalVars.frametime * (time * 175), 0, 1)
    if type(start) == "userdata" then
        local r, g, b, a = start.r, start.g, start.b, start.a
        local e_r, e_g, e_b, e_a = end_pos.r, end_pos.g, end_pos.b, end_pos.a
        r = math.lerp(r, e_r, time)
        g = math.lerp(g, e_g, time)
        b = math.lerp(b, e_b, time)
        a = math.lerp(a, e_a, time)
        return Color.new(r, g, b, a)
    end

    local delta = end_pos - start
    delta = delta * time
    delta = delta + start

    if end_pos == 0 and delta < 0.01 and delta > -0.01 then
        delta = 0
    elseif end_pos == 1 and delta < 1.01 and delta > 0.99 then
        delta = 1
    end

    return delta
end

function math.closest_point_on_ray(ray_from, ray_to, desired_point)
    local to = desired_point - ray_from
    local direction = ray_to - ray_from
    local ray_length = direction:Length()

    direction = direction / ray_length

    local direction_along = direction.x * to.x + direction.y * to.y + direction.z * to.z
    if direction_along < 0 then return ray_from end
    if direction_along > ray_length then return ray_to end

    return Vector.new(ray_from.x + direction.x * direction_along, ray_from.y + direction.y * direction_along, ray_from.z + direction.z * direction_along)
end

function math.normalize(ang)
    while (ang > 180.0) do
        ang = ang - 360.0
    end
    while (ang < -180.0) do
        ang = ang + 360.0
    end
    return ang
end

function Render.ShadowText(string, vector, color, font, shadow, centered)
    if not centered then centered = false end
    if shadow then
        Render.Text(string, vector + 1, Color.new(0.0, 0.0, 0.0, color.a), font.size, font.init, false, centered)
    end
    Render.Text(string, vector, color, font.size, font.init, false, centered)
end

function Render.HorizontalGradient(x, y, w, h, color_1, color_2)
    Render.GradientBoxFilled(Vector2.new(x, y), Vector2.new(x + w / 2, y + h), color_2, color_1, color_2, color_1)
    Render.GradientBoxFilled(Vector2.new(x + w / 2, y), Vector2.new(x + w, y + h), color_1, color_2, color_1, color_2)
end

function Render.FilledBox(x, y, w, h, color)
    Render.BoxFilled(Vector2.new(x, y), Vector2.new(x, y) + Vector2.new(w, h), color)
end

function C_BasePlayer:IsEnemy()
    return EntityList.GetLocalPlayer() and self:IsTeamMate() == false
end

function C_BasePlayer:IsScoped()
    return self:GetProp("m_bIsScoped")
end











uwu.print(('{0.54, 0.83, 1}[Aarne.club] {1, 1, 1}Welcome back, {0.78, 1, 0}%s \n'):format(Cheat.GetCheatUserName()))

local tabs = {
    global = "Global",
    antiaim = "Anti-Aim",
    antibruteforce = "Anti-Bruteforce",
    visual = "Visuals",
    config = "Config",
    playerlist = "Player List"
}



local vars = {}

vars.screen = EngineClient:GetScreenSize()
vars.thirdperson = Menu.FindVar("Visuals", "View", "Thirdperson", "Enable Thirdperson")
vars.minimum_damage = Menu.FindVar("Aimbot", "Ragebot", "Accuracy", "Minimum Damage")



local font = {}

-- @note: uwu?
--[[ files:create_directory()
files:download('https://fontsforyou.com/downloads/99851-smallestpixel7', 'smallest_pixel-7.ttf') ]]

font.verdana = {}
font.verdana.size = 12
font.verdana.init = Render.InitFont("Verdana", font.verdana.size)

font.arrow = {}
font.arrow.size = 15
font.arrow.init = Render.InitFont("Verdana", font.arrow.size, {"b"})

font.verdana_r = {}
font.verdana_r.size = 12
font.verdana_r.init = Render.InitFont("Verdana", font.verdana_r.size, {'r'})

font.slow = {}
font.slow.size = 14
font.slow.init = Render.InitFont("Verdana", font.slow.size, {"b"})

font.slow2 = {}
font.slow2.size = 27
font.slow2.init = Render.InitFont("Verdana", font.slow.size, {"b"})

font.pixel = {}
font.pixel.size = 10
font.pixel.init = Render.InitFont('smallest pixel-7', font.pixel.size, {"r"})

font.prediction = {}
font.prediction.size = 12
font.prediction.init = Render.InitFont("Verdana", font.prediction.size, {"b"})


vars.dt_ref = Menu.FindVar("Aimbot", "Ragebot", "Exploits", "Double Tap")
vars.hs_ref = Menu.FindVar("Aimbot", "Ragebot", "Exploits", "Hide Shots")
vars.slowmo_ref = Menu.FindVar("Aimbot", "Anti Aim", "Misc", "Slow Walk")
vars.fakelag_ref = Menu.FindVar("Aimbot", "Anti Aim", "Fake Lag", "Enable Fake Lag")




local menu = {}




local playerlist = {}

playerlist.data = {}

playerlist.hitboxes = { 'head', 'neck', 'pelvis', 'stomach', 'lower chest', 'chest', 'upper chest', 'right thigh', 'left thigh', 'right calf',
    'left calf', 'right foot', 'left foot', 'right hand', 'left hand', 'right upper arm', 'right forearm', 'left upper arm', 'left forearm' }

playerlist.ClearData = function(self)
    for player_name, menu_items in pairs(self.data) do
        for menu_item_name, menu_item in pairs(menu_items) do
            Menu.DestroyItem(menu_item)
        end
    end

    self.data = {}
end

playerlist.UpdateData = function(self)
    self:ClearData()

    local players = EntityList.GetPlayers()

    if not players or #players < 1 then
        return
    end

    for i, player in ipairs(players) do

        if player:IsEnemy() then

            local player_name = player:GetName()

            self.data[player_name] = {
                ['Override'] = Menu.Switch(tabs.playerlist, player_name, ('Override %s'):format(player_name), false),
                ['Ignore Target'] = Menu.Switch(tabs.playerlist, player_name, 'Ignore Target', false),
                ['High Priority'] = Menu.Switch(tabs.playerlist, player_name, 'High Priority', false),
                ['Force Safety'] = Menu.Switch(tabs.playerlist, player_name, 'Force Safety', false),
                ['Hitbox System'] = Menu.Switch(tabs.playerlist, player_name, 'Hitbox System', false, 'For "Disable Hitbox" and "Disable Multipoint" work you need to enable this switch.'),
                ['Disable Hitbox'] = Menu.MultiCombo(tabs.playerlist, player_name, 'Disable Hitbox', self.hitboxes, 0, 'Enable "Hitbox System" for this feature to work.'),
                ['Disable Multipoint'] = Menu.MultiCombo(tabs.playerlist, player_name, 'Disable Multipoint', self.hitboxes, 0, 'Enable "Hitbox System" for this feature to work.'),
                ['Trashtalk'] = Menu.Switch(tabs.playerlist, player_name, 'Trashtalk', false),
                ['Trashtalk Text'] = Menu.TextBox(tabs.playerlist, player_name, 'Trashtalk Text', 64, ''),
            }

        end

    end

end

playerlist:UpdateData()

playerlist.menu_keys_update = function() if #table.keys(playerlist.data) < 1 then return {'No Enemies'} end return table.keys(playerlist.data) end
playerlist.menu_keys = playerlist.menu_keys_update()

playerlist.menu_target = Menu.Combo(tabs.playerlist, 'Player List', 'Target', playerlist.menu_keys, 0)

playerlist.MenuVisible = function(self)
    local taget_index = self.menu_target:Get()
    local target_name = self.menu_keys[taget_index + 1]

    for name, k in pairs(self.data) do
        local state = (name == target_name)
       
        for menu_name, menu_item in pairs(self.data[name]) do
            self.data[name][menu_name]:SetVisible(state)
        end
    end
end

playerlist:MenuVisible()

playerlist.menu_target:RegisterCallback(function()
    playerlist:MenuVisible()
end)

playerlist.menu_update_targets = Menu.Button(tabs.playerlist, 'Player List', 'Update Targets', '', function()
    playerlist:UpdateData()
    playerlist.menu_keys = playerlist.menu_keys_update()
    playerlist.menu_target:UpdateList(playerlist.menu_keys)
    playerlist:MenuVisible()
end)



playerlist.on_prediction = function(self)
    local players = EntityList.GetPlayers()

    if not players or #players < 1 then
        return
    end

    for i, player in ipairs(players) do

        if player:IsEnemy() then

            local player_name = player:GetName()

            if playerlist.data[player_name] then

                local data = playerlist.data[player_name]

                if data['Override']:Get() then

                    local player_index = player:EntIndex()

                    if data['Ignore Target']:Get() then

                        RageBot.IgnoreTarget(player_index)

                    end

                    if data['Force Safety']:Get() then

                        RageBot.ForceSafety(player_index)

                    end

                    if data['High Priority']:Get() then

                        RageBot.SetTargetPriority(player_index, 100)

                    end

                    if data['Hitbox System']:Get() then

                        for i = 0, 18 do

                            if data['Disable Hitbox']:Get(i + 1) then
                                RageBot.EnableHitbox(player_index, i, false)
                            end

                            if data['Disable Multipoint']:Get(i + 1) then
                                RageBot.EnableMultipoints(player_index, i, false)
                            end

                        end

                    end

                end

            end

        end

    end

end



local antiaim = {}

antiaim.state_list = {"Shared", "Standing", "Moving", "Crouching", "Slowwalk", "Air", "On Use", "Roll"}
antiaim.features_list = {"Override", "Disable Anti-Bruteforce", "Yaw Add Left", "Yaw Add Right", "Yaw Modifier", "Modifier Degree", "Fake Limit Type", "Left Limit", "Right Limit", "Fake Options", "LBY Mode", "Freestanding Desync", "Desync On Shot"}


menu["Anti-Aim"] = {}


menu["Anti-Aim"]["Anti-Aim"] = {}
antiaim_menu = menu["Anti-Aim"]["Anti-Aim"]
conditions_menu = menu["Anti-Aim"]

antiaim_menu["Enable Anti-Aim"] = Menu.Switch(tabs.antiaim, "Main", "Enable Anti-Aim", false)
antiaim_menu["Anti-Aim on Use"] = Menu.Switch(tabs.antiaim, "Main", "Anti-Aim on Use", false)
antiaim_menu["Anti-Backstab"] = Menu.Switch(tabs.antiaim, "Main", "Anti-Backstab", false)
antiaim_menu["Roll Anti-Aim"] = Menu.Switch(tabs.antiaim, "Main", "Roll Anti-Aim", false)
antiaim_menu["Roll on Manuals"] = Menu.Switch(tabs.antiaim, "Main", "Roll on Manuals", false, 'Will work only if u enable any manual (left, rigth)')
antiaim_menu["Roll Left"] = Menu.SliderInt(tabs.antiaim, "Main", "Roll Left", 45, -45, 45)
antiaim_menu["Roll Right"] = Menu.SliderInt(tabs.antiaim, "Main", "Roll Right", -45, -45, 45)
antiaim_menu["Conditions"] = Menu.Switch(tabs.antiaim, "Main", "Conditions", false)
antiaim_menu["Yaw Base"] = Menu.Combo(tabs.antiaim, "Main", "Yaw Base", {"Forward", "Backward", "Right", "Left", "At Target", "Freestanding"}, 0)
antiaim_menu["Tab"] = Menu.Combo(tabs.antiaim, "Main", "Condition", antiaim.state_list, 0)

for i, state in pairs(antiaim.state_list) do
    conditions_menu[state] = {
        ["Override"] = Menu.Switch(tabs.antiaim, state, ("Override %s"):format(state), false),
        ["Disable Anti-Bruteforce"] = Menu.Switch(tabs.antiaim, state, "Disable Anti-Bruteforce", false),
        ["Yaw Add Left"] = Menu.SliderInt(tabs.antiaim, state, "Yaw Left", 0, -180, 180),
        ["Yaw Add Right"] = Menu.SliderInt(tabs.antiaim, state, "Yaw Right", 0, -180, 180),
        ["Yaw Modifier"] = Menu.Combo(tabs.antiaim, state, "Yaw Modifier", {"Disable", "Center", "Offset", "Random", "Spin"}, 0),
        ["Modifier Degree"] = Menu.SliderInt(tabs.antiaim, state, "Modifier Degree", 0, -180, 180),
        ["Fake Limit Type"] = Menu.Combo(tabs.antiaim, state, "Fake Limit Type", {"Static", "Jitter"}, 0),
        ["Left Limit"] = Menu.SliderInt(tabs.antiaim, state, "Fake Limit Left", 0, 0, 60),
        ["Right Limit"] = Menu.SliderInt(tabs.antiaim, state, "Fake Limit Right", 0, 0, 60),
        ["Fake Options"] = Menu.MultiCombo(tabs.antiaim, state, "Fake Options", {"Avoid Overlap", "Jitter", "Randomize Jitter"}, 0),
        ["LBY Mode"] = Menu.Combo(tabs.antiaim, state, "LBY Mode", {"Disable", "Opposite", "Sway"}, 0),
        ["Freestanding Desync"] = Menu.Combo(tabs.antiaim, state, "Freestanding Desync", {"Off", "Peek Fake", "Peek Real"}, 0),
        ["Desync On Shot"] = Menu.Combo(tabs.antiaim, state, "Desync On Shot", {"Disable", "Opposite", "Freestanding", "Switch"}, 0),
    }
end

antiaim.update_menu = function()
    local is_conditions = antiaim_menu["Conditions"]:Get()
    antiaim_menu["Tab"]:SetVisible(is_conditions)

    if not is_conditions then
        antiaim_menu["Tab"]:Set(0)
    end

    antiaim_menu["Roll Right"]:SetVisible(antiaim_menu["Roll Anti-Aim"]:Get())
    antiaim_menu["Roll Left"]:SetVisible(antiaim_menu["Roll Anti-Aim"]:Get())
    antiaim_menu["Roll on Manuals"]:SetVisible(antiaim_menu["Roll Anti-Aim"]:Get())

    for i, state in pairs(antiaim.state_list) do
        local tab_index = (antiaim_menu["Tab"]:Get() + 1)
        local tab_name = antiaim.state_list[tab_index]

        local menu_antiaim = conditions_menu[state]
        local menu_state = (tab_name == state)

        for i, feature in pairs(antiaim.features_list) do
            menu_antiaim[feature]:SetVisible(menu_state)
        end
       
        conditions_menu["Shared"]["Override"]:SetVisible(false)
    end
end

antiaim.update_menu()

antiaim_menu["Tab"]:RegisterCallback(antiaim.update_menu)
antiaim_menu["Conditions"]:RegisterCallback(antiaim.update_menu)
antiaim_menu["Roll Anti-Aim"]:RegisterCallback(antiaim.update_menu)



antiaim.hostage_distance = function()
    local local_player = EntityList.GetLocalPlayer()
    if not local_player then
        return false
    end

    local host_ent = EntityList.GetEntitiesByClassID(97)
    local multi_hosts_dist = {}

    for i, host in pairs(host_ent) do
        local host_origin = host:GetRenderOrigin()
        local local_origin = local_player:GetRenderOrigin()
        local dist = host_origin:DistTo(local_origin)

        table.insert(multi_hosts_dist, dist)
    end

    local min_dist = math.floor(math.min(unpack(multi_hosts_dist)))

    if math.floor(min_dist) < 70 and not (math.floor(min_dist) == 0) then
        return false
    end

    return true
end

antiaim.defuse_bomb_distance = function()
    local local_player = EntityList.GetLocalPlayer()
    if not local_player then
        return false
    end

    local curr_team = local_player:GetProp("m_iTeamNum")
    local bomb_ent = EntityList.GetEntitiesByClassID(129)

    if table.getn(bomb_ent) > 0 then
        local bomb_origin = bomb_ent[1]:GetRenderOrigin()
        local local_origin = local_player:GetRenderOrigin()
        local dist = bomb_origin:DistTo(local_origin)
       
        if dist <= 90 and curr_team ~= 2 then  
            return false
        end
    end

    return true
end

antiaim.legit_aa_time = GlobalVars.realtime
antiaim.in_use = false

antiaim.allow_on_use = function()
    if not antiaim_menu["Enable Anti-Aim"]:Get() then
        return
    end

    if not antiaim_menu["Anti-Aim on Use"]:Get() then
        return
    end

    if Cheat.IsKeyDown(0x45) and antiaim.defuse_bomb_distance() and antiaim.hostage_distance() then
        antiaim.in_use = false

        if (GlobalVars.realtime >= antiaim.legit_aa_time + 0.2) then
            if (antiaim.in_use == false) then
                EngineClient.ExecuteClientCmd("+use")
                antiaim.in_use = true
            end
            if (antiaim.in_use == true) then
                EngineClient.ExecuteClientCmd("-use")
            end
        else
            if (antiaim.in_use == true) then
                EngineClient.ExecuteClientCmd("-use")
                antiaim.in_use = false
            end
            antiaim.legit_aa_time = GlobalVars.realtime
        end
    else
        antiaim.in_use = false
    end
end

antiaim.GetManuals = function()
    local get_yaw_base = antiaim.refs["Yaw Base"]:Get()

    local freestand = (get_yaw_base == 5)
    local right = (get_yaw_base == 2)
    local left = (get_yaw_base == 3)
    local any = (left or right or freestand)

    return {
        any = any,
        left = left,
        right = right,
    }
end

antiaim.get_roll_state = function()
    if not antiaim_menu["Enable Anti-Aim"]:Get() then
        return false
    end

    if not antiaim_menu["Roll Anti-Aim"]:Get() then
        return false
    end
   
    if antiaim_menu["Roll on Manuals"]:Get() and not (antiaim.GetManuals().right or antiaim.GetManuals().left) then
        return false
    end

    return true
end

antiaim.GetPlayerState = function()
    local local_player = EntityList.GetLocalPlayer()
    if not local_player then
        return nil
    end

    local flags = local_player:GetProp("m_fFlags")
    local velocity = local_player:GetProp("m_vecVelocity"):Length2D()

    local is_in_air = bit.band(flags, 1)
    local is_crouching = bit.band(flags, 6)

    if antiaim.get_roll_state() then return 'Roll' end

    if antiaim.in_use then return "On Use" end

    if (is_in_air == 0) or Cheat.IsKeyDown(0x20) then return "Air" end

    if (is_crouching == 6) then return "Crouching" end

    if vars.slowmo_ref:Get() and velocity > 3 then return "Slowwalk" end

    if velocity > 3 then return "Moving" end

    return "Standing"
end

antiaim.GetDesync = function()
    local local_player = EntityList.GetLocalPlayer()
    if not local_player then
        return 0
    end

    local degree = math.normalize(AntiAim.GetCurrentRealRotation() - local_player:GetProp("m_angEyeAngles[1]"))
    return math.abs(math.floor(tonumber(string.format("%.2f", (math.clamp(degree, AntiAim.GetMinDesyncDelta(), AntiAim.GetMaxDesyncDelta()))))))
end


antiaim.refs = {}

antiaim.refs["Pitch"] =                 Menu.FindVar("Aimbot", "Anti Aim", "Main", "Pitch")
antiaim.refs["Yaw Base"] =              Menu.FindVar("Aimbot", "Anti Aim", "Main", "Yaw Base")
antiaim.refs["Yaw Add"] =               Menu.FindVar("Aimbot", "Anti Aim", "Main", "Yaw Add")
antiaim.refs["Yaw Modifier"] =          Menu.FindVar("Aimbot", "Anti Aim", "Main", "Yaw Modifier")
antiaim.refs["Modifier Degree"] =       Menu.FindVar("Aimbot", "Anti Aim", "Main", "Modifier Degree")
antiaim.refs["Left Limit"] =            Menu.FindVar("Aimbot", "Anti Aim", "Fake Angle", "Left Limit")
antiaim.refs["Right Limit"] =           Menu.FindVar("Aimbot", "Anti Aim", "Fake Angle", "Right Limit")
antiaim.refs["Fake Options"] =          Menu.FindVar("Aimbot", "Anti Aim", "Fake Angle", "Fake Options")
antiaim.refs["LBY Mode"] =              Menu.FindVar("Aimbot", "Anti Aim", "Fake Angle", "LBY Mode")
antiaim.refs["Freestanding Desync"] =   Menu.FindVar("Aimbot", "Anti Aim", "Fake Angle", "Freestanding Desync")
antiaim.refs["Desync On Shot"] =        Menu.FindVar("Aimbot", "Anti Aim", "Fake Angle", "Desync On Shot")




antiaim.antibruteforce = {}

antiaim.antibruteforce.limits = {
    min = 2,
    max = 10,
}

menu["Anti-Aim"]["Anti-Bruteforce"] = {}

menu["Anti-Aim"]["Anti-Bruteforce"]["Enable Anti-Bruteforce"] = Menu.Switch(tabs.antibruteforce, "Anti-Bruteforce", "Enable", false)

menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"] = Menu.SliderInt(tabs.antibruteforce, 'Anti-Bruteforce', 'Phases Count', antiaim.antibruteforce.limits.min, antiaim.antibruteforce.limits.min, antiaim.antibruteforce.limits.max)
menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:SetVisible(false)

antiaim.antibruteforce.create_phase = Menu.Button(tabs.antibruteforce, 'Anti-Bruteforce', 'Create new phase', '', function()
    if menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Get() < antiaim.antibruteforce.limits.max then
        menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Set(menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Get() + 1)
    end
end)

antiaim.antibruteforce.remove_phase = Menu.Button(tabs.antibruteforce, 'Anti-Bruteforce', 'Remove last phase', '', function()
    if menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Get() > antiaim.antibruteforce.limits.min then
        menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Set(menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Get() - 1)
    end
end)


menu["Anti-Aim"]["Anti-Bruteforce Phases"] = {}

for i = 1, antiaim.antibruteforce.limits.max do
    menu["Anti-Aim"]["Anti-Bruteforce Phases"][i] = Menu.SliderInt(tabs.antibruteforce, 'Phases', ('[Phase %i] Fake Limit'):format(i), 0, -60, 60)
end

antiaim.antibruteforce.MenuVisible = function()

    local global_state = menu["Anti-Aim"]["Anti-Bruteforce"]["Enable Anti-Bruteforce"]:Get()

    antiaim.antibruteforce.create_phase:SetVisible(global_state)
    antiaim.antibruteforce.remove_phase:SetVisible(global_state)

    for i = 1, #menu["Anti-Aim"]["Anti-Bruteforce Phases"] do

        if menu["Anti-Aim"]["Anti-Bruteforce Phases"][i] then

            menu["Anti-Aim"]["Anti-Bruteforce Phases"][i]:SetVisible(i <= menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Get() and global_state)

        end

    end
end

antiaim.antibruteforce.MenuVisible()

menu["Anti-Aim"]["Anti-Bruteforce"]["Enable Anti-Bruteforce"]:RegisterCallback(antiaim.antibruteforce.MenuVisible)
antiaim.antibruteforce.create_phase:RegisterCallback(antiaim.antibruteforce.MenuVisible)
antiaim.antibruteforce.remove_phase:RegisterCallback(antiaim.antibruteforce.MenuVisible)






antiaim.antibruteforce.work_blyad = true
antiaim.antibruteforce.distance = 150 -- дистанция при которой он работает
antiaim.antibruteforce.last_handled_tick = -1 -- последний тик когда сработал антибрут
antiaim.antibruteforce.current_phase = 0 -- текущая фаза -- 0 = выключено
antiaim.antibruteforce.update_time = 0 -- время последнего срабатывания
antiaim.antibruteforce.active_time = 5 -- seconds

antiaim.antibruteforce.on_event = function(event)
    if not menu["Anti-Aim"]["Anti-Bruteforce"]["Enable Anti-Bruteforce"]:Get() then
        return
    end

    if event:GetName() ~= "bullet_impact" then
        return
    end

    if not antiaim.antibruteforce.work_blyad then
        return
    end

    if antiaim.antibruteforce.last_handled_tick == GlobalVars.tickcount then
        return
    end

    local localplayer = EntityList.GetLocalPlayer()
    if not localplayer or not localplayer:IsAlive() then
        return
    end

    local userid = event:GetInt("userid")
    local player_object = EntityList.GetPlayerForUserID(userid)
    if not player_object or player_object:IsDormant() or player_object:IsTeamMate() then
        return
    end

    local eye_position = localplayer:GetEyePosition()
    if not eye_position then
        return
    end

    local enemy_eye_position = player_object:GetEyePosition()
    if not enemy_eye_position then
        return
    end

    local impact_vector = Vector.new(event:GetFloat("x"), event:GetFloat("y"), event:GetFloat("z"))
   
    local distance_to_local = math.closest_point_on_ray(enemy_eye_position, impact_vector, eye_position):DistTo(eye_position)

    if distance_to_local > antiaim.antibruteforce.distance then
        return
    end

    antiaim.antibruteforce.last_handled_tick = GlobalVars.tickcount
   
    -- это сделано что бы начинать антибрут с фазы которая противоположна текущему углу
    if antiaim.antibruteforce.current_phase ~= 0 then
        antiaim.antibruteforce.current_phase = antiaim.antibruteforce.current_phase + 1
        if antiaim.antibruteforce.current_phase > menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Get() then
            antiaim.antibruteforce.current_phase = 1
        end
    else
        local inverter = AntiAim.GetInverterState() and 1 or -1

        antiaim.antibruteforce.current_phase = 1

        for i = 1, menu["Anti-Aim"]["Anti-Bruteforce"]["Phases Count"]:Get() do
            local angle = menu["Anti-Aim"]["Anti-Bruteforce Phases"][i]:Get()

            if angle * inverter > 0 then
                antiaim.antibruteforce.current_phase = i
                break
            end
        end

    end

    antiaim.antibruteforce.update_time = GlobalVars.realtime + antiaim.antibruteforce.active_time
end

local antibackstab = {}

antibackstab.update = function()
    if not antiaim_menu["Anti-Backstab"]:Get() then
        return false
    end

    local local_player = EntityList.GetLocalPlayer()
    if not local_player or not local_player:IsAlive() then
        return false
    end

    local players = EntityList.GetPlayers()
    if not players or #players < 0 then
        return false
    end

    local local_origin = local_player:GetRenderOrigin()

    local enemy_w_knife = table.filter(players, function(player)
        return (not player:IsDormant() and player:IsEnemy() and player:IsAlive() and player:GetActiveWeapon() and player:GetActiveWeapon():IsKnife())
    end)

    local dist_to_local_enemy = table.filter(enemy_w_knife, function(player)
        return (local_origin:DistTo(player:GetRenderOrigin()) < 150)
    end)

    if #dist_to_local_enemy > 0 then
        return true
    end

    return false
end

antiaim.angle_vec = function(angles)
    local forward, right = Vector.new(), Vector.new()

    local pitch, yaw, roll = angles.pitch * math.pi_divided, angles.yaw * math.pi_divided, angles.roll * math.pi_divided
    local cp = math.cos(pitch)
    local sp = math.sin(pitch)

    local cy = math.cos(yaw)
    local sy = math.sin(yaw)

    local cr = math.cos(roll)
    local sr = math.sin(roll)

    forward.x = cp * cy
    forward.y = cp * sy
    forward.z = -sp

    right.x = -1 * sr * sp * cy + -1 * cr * -sy
    right.y = -1 * sr * sp * sy + -1 * cr * cy
    right.z = -1 * sr * cp

    return forward, right
end

antiaim.actual_mov = Vector2.new(0, 0)
antiaim.mov_fix = function(cmd)
    local frL, riL = antiaim.angle_vec(QAngle.new(0, cmd.viewangles.yaw, 0))
    local frC, riC = antiaim.angle_vec(cmd.viewangles)

    frL.z = 0
    riL.z = 0
    frC.z = 0
    riC.z = 0

    frL = frL / frL:Length()
    riL = riL / riL:Length()
    frC = frC / frC:Length()
    riC = riC / riC:Length()

    local worldCoords = frL * actual_mov.x + riL * actual_mov.y;

    cmd.sidemove = (frC.x * worldCoords.y - frC.y * worldCoords.x) / (riC.y * frC.x - riC.x * frC.y)
    cmd.forwardmove = (riC.y * worldCoords.x - riC.x * worldCoords.y) / (riC.y * frC.x - riC.x * frC.y)
end

antiaim.roll = function(cmd)
    if not antiaim.get_roll_state() then
        return
    end

    cmd.viewangles.roll = AntiAim.GetInverterState() and antiaim_menu["Roll Left"]:Get() or antiaim_menu["Roll Right"]:Get()
end

antiaim.roll_movement = function(cmd)
    if not antiaim.get_roll_state() then
        return
    end

    actual_mov = Vector2.new(cmd.forwardmove, cmd.sidemove)
    antiaim.mov_fix(cmd)
end


antiaim.on_prediction = function()
    if not antiaim_menu["Enable Anti-Aim"]:Get() then
        return
    end
   
    local player_state = antiaim.GetPlayerState()
    if not player_state then
        return
    end

    local is_inverted = AntiAim.GetInverterState()
    local data = conditions_menu[player_state]

    if not (data["Override"]:Get() and antiaim_menu["Conditions"]:Get()) then
        data = conditions_menu["Shared"]
    end

    for key, aa_ref in pairs(antiaim.refs) do
        local get_value = function()
            if (key == "Pitch") then
                return antiaim.in_use and 0 or 1
            end

            if (key == "Yaw Base") then
                return antiaim.in_use and 0 or antiaim_menu["Yaw Base"]:Get()
            end

            if antiaim.antibruteforce.current_phase ~= 0 and key == "Yaw Modifier" then
                return 0
            end

            if (key == "Yaw Add") then
                return is_inverted and data["Yaw Add Left"]:Get() or data["Yaw Add Right"]:Get()
            end

            if (data["Fake Limit Type"]:Get() == 1) then
                local tickcount = GlobalVars.tickcount % 4 > 1

                if (key == "Left Limit") then
                    return tickcount and data["Left Limit"]:Get() or 18
                end

                if (key == "Right Limit") then
                    return tickcount and data["Right Limit"]:Get() or 18
                end
            end

            return data[key]:Get()
        end

        local value = get_value()

        antiaim.refs[key]:Set(value)
    end

    if antibackstab.update() and not antiaim.in_use then
        antiaim.refs["Yaw Base"]:Set(4)
        antiaim.refs["Yaw Add"]:Set(180)
    end

    antiaim.antibruteforce.work_blyad = not data["Disable Anti-Bruteforce"]:Get()

    if not antiaim.antibruteforce.work_blyad or antiaim.antibruteforce.current_phase == 0 or antiaim.antibruteforce.update_time < GlobalVars.realtime then
        antiaim.antibruteforce.current_phase = 0
        return
    end


    local menu_item = menu["Anti-Aim"]["Anti-Bruteforce Phases"][antiaim.antibruteforce.current_phase]
    if not menu_item then
        return
    end

    local angle = menu_item:Get()

    AntiAim.OverrideInverter(angle < 0)
    AntiAim.OverrideLimit(math.abs(angle))
end




menu["Anti-Aim"]["Animations"] = {}

menu["Anti-Aim"]["Animations"]["Pitch on Land"] = Menu.Switch(tabs.antiaim, "Misc", "Pitch on Land", false)
menu["Anti-Aim"]["Animations"]["Static Air Legs"] = Menu.Switch(tabs.antiaim, "Misc", "Static Air Legs", false)
menu["Anti-Aim"]["Animations"]["Static Landing Legs"] = Menu.Switch(tabs.antiaim, "Misc", "Static Landing Legs", false)

animation_breaker.set_params = function(player_ptr, layer, start_val, end_val)

    player_ptr = ffi.cast("unsigned int", player_ptr)

    if player_ptr == 0x0 then
        return false
    end

    local studio_hdr = ffi.cast("void**", player_ptr + ffi_handler.offsets.m_pStudioHdr)[0]

    if studio_hdr == nil then
        return false
    end

    local pose_params = ffi_handler.get_pose_parameters(studio_hdr, layer)

    if pose_params == nil then
        return
    end

    if animation_breaker.cache[layer] == nil then
        animation_breaker.cache[layer] = {}

        animation_breaker.cache[layer].m_flStart = pose_params.m_flStart
        animation_breaker.cache[layer].m_flEnd = pose_params.m_flEnd

        animation_breaker.cache[layer].m_flState = pose_params.m_flState

        animation_breaker.cache[layer].installed = false
        return true
    end

    if start_val ~= nil and not animation_breaker.cache[layer].installed then

        pose_params.m_flStart   = start_val
        pose_params.m_flEnd     = end_val

        pose_params.m_flState   = (pose_params.m_flStart + pose_params.m_flEnd) / 2

        animation_breaker.cache[layer].installed = true
        return true
    end
   
    if animation_breaker.cache[layer].installed then

        pose_params.m_flStart   = animation_breaker.cache[layer].m_flStart
        pose_params.m_flEnd     = animation_breaker.cache[layer].m_flEnd

        pose_params.m_flState   = animation_breaker.cache[layer].m_flState

        animation_breaker.cache[layer].installed = false

        return true
    end

    return false
end

animation_breaker.handle_prediction = function(cmd)

    local local_player = ffi_handler.get_client_entity(EngineClient.GetLocalPlayer())

    if local_player == nil then
        return
    end

    local local_player_addr = ffi.cast("unsigned int", local_player)

    if local_player_addr == 0x0 then
        return
    end

    local animstate = ffi.cast( "void**", local_player_addr + ffi_handler.offsets.animstate)[0]

    if animstate == nil then
        return
    end

    animstate = ffi.cast("unsigned int", animstate)

    if animstate == 0x0 then
        return
    end
   
    local landing_anim = ffi.cast("bool*", animstate + ffi_handler.offsets.landing_anim)[0]

    if landing_anim == nil then
        return
    end

    if menu["Anti-Aim"]["Animations"]["Static Landing Legs"]:Get() then
        animation_breaker.set_params(local_player, 0, -180, -179)
    end

    if menu["Anti-Aim"]["Animations"]["Static Air Legs"]:Get() then
        animation_breaker.set_params(local_player, 6, 0.9, 1)
    end
   
    if menu["Anti-Aim"]["Animations"]["Pitch on Land"]:Get() and landing_anim and bit.band(cmd.buttons, 2) == 0 then
        animation_breaker.set_params(local_player, 12, 0.999, 1)
    end

end

animation_breaker.handle_cmove = function()

    local local_player = ffi_handler.get_client_entity(EngineClient.GetLocalPlayer())

    if local_player == nil then
        return
    end

    for k, v in pairs(animation_breaker.cache) do
        animation_breaker.set_params(local_player, k)
    end

end

animation_breaker.on_destroy = function()

    local local_player = ffi_handler.get_client_entity(EngineClient.GetLocalPlayer())

    if local_player == nil then
        return
    end

    for k, v in pairs(animation_breaker.cache) do
        animation_breaker.set_params(local_player, k)
    end

end





menu["Visual"] = {}



local binds = {}

menu["Visual"]["Binds"] = {}
binds_menu = menu["Visual"]["Binds"]

binds_menu["Enable indicators"] = Menu.MultiCombo(tabs.visual, "Visual", "Indicators", {"Desync & Line / State", "Script name", "Binds", "Min. Damage"}, 0)
binds_menu["Binds"] = Menu.MultiCombo(tabs.visual, "Visual", "Binds", {"Double Tap", "Hide Shots", "Minimum Damage"}, 0)
binds_menu["Indicators Type"]   = Menu.Combo(tabs.visual, "Visual", "Indicators type", {"Default", "Pixel"}, 0)

binds_menu["Min Damage X"] = Menu.SliderInt(tabs.visual, "Colors", "[Min. Damage] X", math.floor(vars.screen.x / 2), 0, math.floor(vars.screen.x))
binds_menu["Min Damage Y"] = Menu.SliderInt(tabs.visual, "Colors", "[Min. Damage] Y", math.floor(vars.screen.y / 2), 0, math.floor(vars.screen.y))

binds_menu["Script name Color"] = Menu.ColorEdit(tabs.visual, "Colors", "[Indicators] Script name", Color.RGBA(150, 150, 255))
binds_menu["Desync Line Color"] = Menu.ColorEdit(tabs.visual, "Colors", "[Indicators] Desync", Color.RGBA(150, 150, 255))

binds.menu_update = function()
    local state = binds_menu["Enable indicators"]

    binds_menu["Script name Color"]:SetVisible(state:Get(2))
    binds_menu["Desync Line Color"]:SetVisible(state:Get(1))
    binds_menu["Min Damage X"]:SetVisible(state:Get(4))
    binds_menu["Min Damage Y"]:SetVisible(state:Get(4))
    binds_menu["Binds"]:SetVisible(state:Get(3))
end

binds.menu_update()

binds_menu["Enable indicators"]:RegisterCallback(binds.menu_update)

local min_damage = {}

min_damage.on_draw = function()
    if not binds_menu["Enable indicators"]:Get(4) then
        return
    end

    local local_player = EntityList.GetLocalPlayer()

    if not local_player or not local_player:IsAlive() then
        return
    end

    local x, y = binds_menu["Min Damage X"]:Get(), binds_menu["Min Damage Y"]:Get()

    Render.Text(tostring(vars.minimum_damage:Get()), Vector2.new(x, y), Color.new(1.0, 1.0, 1.0), font.pixel.size, font.pixel.init, true)
end


local mt = {
    name = "",
    alpha = 0,
    add_y = 13,
    color = Color.RGBA(0, 255, 0),

    GetName = function(self)
        return self.name
    end,

    GetColor = function(self)
        return self.color
    end,

    GetBool = function()
        return true
    end,

    CustomRender = function(name, vector, color)
        Render.ShadowText(name, vector, color, font.verdana, true, true)
    end,
}

binds.data = {}

binds.data.CreateObject = function(self, array)
    table.insert(self, setmetatable(array, {__index = mt}))
end


-- @type: default

binds.data:CreateObject({
    name = "0°",

    GetName = function(self)
        local desync = antiaim.GetDesync()
        self.name = ("%s°"):format(desync)

        return self.name
    end,

    GetColor = function()
        local color = binds_menu["Desync Line Color"]:Get()
        color.a = 1.0
       
        return color
    end,

    GetBool = function()
        return binds_menu["Enable indicators"]:Get(1) and binds_menu["Indicators Type"]:Get() == 0 and antiaim.antibruteforce.current_phase == 0
    end,

    CustomRender = function(name, vector, color)
        local w = (90 / 60 * antiaim.GetDesync())

        Render.ShadowText(name, Vector2.new(vector.x, vector.y - 10), Color.new(1.0, 1.0, 1.0, color.a), font.verdana, true, true)
        Render.HorizontalGradient(vector.x - w / 2, vector.y, w, 1, color, Color.new(color.r, color.g, color.b, 0))
    end,
})

binds.data:CreateObject({
    name = "",

    GetName = function(self)
        local desync = antiaim.GetDesync()
        self.name = ("%s°"):format(desync)

        return self.name
    end,

    GetColor = function()
        local color = binds_menu["Desync Line Color"]:Get()
        color.a = 1.0
       
        return color
    end,

    GetBool = function()
        return binds_menu["Enable indicators"]:Get(1) and binds_menu["Indicators Type"]:Get() == 0 and antiaim.antibruteforce.current_phase ~= 0
    end,

    CustomRender = function(name, vector, color)
        local w = 90 / 5 * (antiaim.antibruteforce.update_time - GlobalVars.realtime)
        name = ('Phase: %s'):format(antiaim.antibruteforce.current_phase)
       
        Render.ShadowText(name, Vector2.new(vector.x, vector.y - 10), Color.new(1.0, 1.0, 1.0, color.a), font.verdana, true, true)
        Render.HorizontalGradient(vector.x - w / 2, vector.y, w, 1, color, Color.new(color.r, color.g, color.b, 0))
    end,
})

binds.data:CreateObject({
    name = "AARNE YAW",

    GetName = function(self)
        if antiaim.in_use then
            return "LEGIT AA"
        end

        if antiaim.GetManuals().any then
            return "MANUAL AA"
        end

        return self.name
    end,

    GetColor = function()
        local color = binds_menu["Script name Color"]:Get()
        color.a = 1.0
       
        return color
    end,

    GetBool = function()
        return binds_menu["Enable indicators"]:Get(2) and binds_menu["Indicators Type"]:Get() == 0
    end,
})

binds.data:CreateObject({
    name = "DT",

    GetColor = function()
        local dt_charge = Exploits.GetCharge()

        return Color.new(1.0 - (1.0 * dt_charge), dt_charge, 0.0)
    end,
   
    GetBool = function()
        if vars.dt_ref:Get() and binds_menu["Enable indicators"]:Get(3) and binds_menu["Indicators Type"]:Get() == 0 and binds_menu["Binds"]:Get(1) then
            return true
        end

        return false
    end,

    CustomRender = function(name, vector, color)
        local dt_charge = Exploits.GetCharge()

        Render.ShadowText(name, vector, color, font.verdana, true, true)
        Render.Circle(Vector2.new(vector.x - 13, vector.y), 4, 30, color, 1.6, 0, 360 * dt_charge)
    end,
})

binds.data:CreateObject({
    name = "ON-SHOT",

    GetBool = function()
        if vars.hs_ref:Get() and not vars.dt_ref:Get() and binds_menu["Enable indicators"]:Get(3) and binds_menu["Indicators Type"]:Get() == 0 and binds_menu["Binds"]:Get(2) then
            return true
        end

        return false
    end,
})

binds.data:CreateObject({
    name = "DMG",

    GetBool = function()
        local CheatBinds = Cheat.GetBinds()

        for i, bind in ipairs(CheatBinds) do
            local bind_name = bind:GetName()
            local bind_is_active = bind:IsActive()

            if (bind_name == "Minimum Damage") and bind_is_active and binds_menu["Enable indicators"]:Get(3) and binds_menu["Indicators Type"]:Get() == 0 and binds_menu["Binds"]:Get(3) then
                return true
            end
        end

        return false
    end
})



-- @type: pixel

local pixel_color_1 = Color.new(1.0, 1.0, 1.0)
local pixel_color_2 = Color.new(1.0, 1.0, 1.0)

binds.data:CreateObject({
    name = "AARNE-YAW",
    add_y = 10,

    GetName = function(self)
        return self.name
    end,

    GetColor = function()
        local color = binds_menu["Script name Color"]:Get()
        color.a = 1.0
       
        return color
    end,

    GetBool = function()
        return binds_menu["Enable indicators"]:Get(2) and binds_menu["Indicators Type"]:Get() == 1
    end,

    CustomRender = function(name, vector, color)
        local is_inverted = AntiAim.GetInverterState()

        pixel_color_1 = math.lerp(pixel_color_1, is_inverted and Color.new(1.0, 1.0, 1.0, color.a) or color)
        pixel_color_2 = math.lerp(pixel_color_2, is_inverted and color or Color.new(1.0, 1.0, 1.0, color.a))

        Render.Text("AARNE-\x20\x20\x20", vector, pixel_color_1, font.pixel.size, font.pixel.init, true, true)

        local text_size = Render.CalcTextSize("AARNE-", font.pixel.size, font.pixel.init) - Render.CalcTextSize("\x20\x20\x20", font.pixel.size, font.pixel.init)

        vector.x = vector.x + text_size.x
        Render.Text("YAW", vector, pixel_color_2, font.pixel.size, font.pixel.init, true, true)
    end,
})

binds.data:CreateObject({
    name = '',
    add_y = 10,

    GetName = function()
        return ('PHASE: %s'):format(antiaim.antibruteforce.current_phase)
    end,

    GetColor = function()
        return Color.new(1.0, 1.0, 1.0)
    end,

    GetBool = function()
        return binds_menu["Enable indicators"]:Get(1) and binds_menu["Indicators Type"]:Get() == 1 and antiaim.antibruteforce.current_phase ~= 0
    end,

    CustomRender = function(name, vector, color)
        Render.Text(name, vector, color, font.pixel.size, font.pixel.init, true, true)

        local name_size = Render.CalcTextSize(name, font.pixel.size, font.pixel.init)
        local val = antiaim.antibruteforce.update_time - GlobalVars.realtime
        Render.Circle(Vector2.new(vector.x - name_size.x / 2 - 6, vector.y), 3, 30, color, 1, 0, 360 / 5 * val)
    end,
})

binds.data:CreateObject({
    name = "",
    add_y = 10,

    GetName = function(self)
        local state = antiaim.GetPlayerState()

        if state then
            return ("%s"):format(state)
        end

        return self.name
    end,

    GetColor = function()
        return Color.new(1.0, 1.0, 1.0)
    end,

    GetBool = function()
        return binds_menu["Enable indicators"]:Get(1) and binds_menu["Indicators Type"]:Get() == 1 and antiaim.antibruteforce.current_phase == 0
    end,

    CustomRender = function(name, vector, color)
        Render.Text(name, vector, color, font.pixel.size, font.pixel.init, true, true)
    end,
})

binds.data:CreateObject({
    name = "DT",
    add_y = 10,

    GetColor = function()
        local dt_charge = Exploits.GetCharge()

        return Color.new(1.0 - (1.0 * dt_charge), dt_charge, 0.0)
    end,
   
    GetBool = function()
        if vars.dt_ref:Get() and binds_menu["Enable indicators"]:Get(3) and binds_menu["Indicators Type"]:Get() == 1 and binds_menu["Binds"]:Get(1) then
            return true
        end

        return false
    end,

    CustomRender = function(name, vector, color)
        Render.Text(name, vector, color, font.pixel.size, font.pixel.init, true, true)
    end,
})

binds.data:CreateObject({
    name = "HS",
    add_y = 10,

    GetBool = function()
        if vars.hs_ref:Get() and not vars.dt_ref:Get() and binds_menu["Enable indicators"]:Get(3) and binds_menu["Indicators Type"]:Get() == 1 and binds_menu["Binds"]:Get(2) then
            return true
        end

        return false
    end,

    CustomRender = function(name, vector, color)
        Render.Text(name, vector, color, font.pixel.size, font.pixel.init, true, true)
    end,
})

binds.data:CreateObject({
    name = "DMG",
    add_y = 10,

    GetColor = function()
        return Color.RGBA(204, 183, 106)
    end,

    GetBool = function()
        local CheatBinds = Cheat.GetBinds()

        for i, bind in ipairs(CheatBinds) do
            local bind_name = bind:GetName()
            local bind_is_active = bind:IsActive()

            if (bind_name == "Minimum Damage") and bind_is_active and binds_menu["Enable indicators"]:Get(3) and binds_menu["Indicators Type"]:Get() == 1 and binds_menu["Binds"]:Get(3) then
                return true
            end
        end

        return false
    end,

    CustomRender = function(name, vector, color)
        Render.Text(name, vector, color, font.pixel.size, font.pixel.init, true, true)
    end,
})




binds.GetActiveBinds = function(self)
    local active_binds = {}

    for i, data in ipairs(self.data) do
        data.alpha = math.lerp(data.alpha, data:GetBool() and 255 or 0, 0.095)

        if data.alpha > 1 then
            table.insert(active_binds, data)
        end
    end

    return active_binds
end

binds.on_draw = function()
    local local_player = EntityList.GetLocalPlayer()
    if not local_player or not local_player:IsAlive() then
        return
    end

    local x, y, plus = vars.screen.x / 2, vars.screen.y / 2, 0

    local active_data = binds:GetActiveBinds()
    for i, data in pairs(active_data) do
        local alpha = data.alpha / 255
        local color = data:GetColor()
        local name = data:GetName()

        color.a = alpha

        local off = y + (plus * data.add_y) + 30
        data.CustomRender(name, Vector2.new(x, off), color)

        plus = plus + alpha
    end
end



local arrows = {}

menu["Visual"]["Arrows"] = {}
arrows_menu = menu["Visual"]["Arrows"]

arrows_menu["Arrows"] = Menu.Combo(tabs.visual, "Visual", "Arrows", {"Disable", "Default", "TeamSkeet"}, 0)
arrows_menu["Size"] =  Menu.SliderInt(tabs.visual, "Visual", "[Arrow] Size", 9, 0, 50)
arrows_menu["Distance"] =  Menu.SliderInt(tabs.visual, "Visual", "[Arrow] Distance", 43, 0, 60)
arrows_menu["Arrow Color"] = Menu.ColorEdit(tabs.visual, "Colors", "[Arrows] Color", Color.RGBA(150, 150, 255))
arrows_menu["Inverted Color"] = Menu.ColorEdit(tabs.visual, "Colors", "[Arrows] Inverted Color", Color.RGBA(150, 150, 255))

arrows.update_menu = function()
    local state = arrows_menu["Arrows"]:Get()

    arrows_menu["Size"]:SetVisible(state == 2)
    arrows_menu["Distance"]:SetVisible(state == 1 or state == 2)
    arrows_menu["Arrow Color"]:SetVisible(state == 1 or state == 2)
    arrows_menu["Inverted Color"]:SetVisible(state == 2)
end

arrows.update_menu()

arrows_menu["Arrows"]:RegisterCallback(arrows.update_menu)

arrows.by_text = function(x, y, arr_col, is_manual)
    local distance = arrows_menu["Distance"]:Get()

    local arrow = ""
    local dist = 0

    if is_manual.left then
        arrow = "<"
        dist = -distance
    end

    if is_manual.right then
        arrow = ">"
        dist = distance
    end

    Render.ShadowText(arrow, Vector2.new(x + dist, y), arr_col, font.arrow, true, true)
end

arrows.by_poly = function(x, y, arr_col, inv_col, is_manual)
    local distance, height, size = arrows_menu["Distance"]:Get(), arrows_menu["Size"]:Get(), 5 + arrows_menu["Size"]:Get()

    local m_left = is_manual.left and arr_col or Color.RGBA(17, 17, 17, 130)
    local m_right = is_manual.right and arr_col or Color.RGBA(17, 17, 17, 130)

    local s_right = AntiAim.GetInverterState() and Color.RGBA(17, 17, 17, 130) or inv_col
    local s_left = AntiAim.GetInverterState() and inv_col or Color.RGBA(17, 17, 17, 130)

    Render.PolyFilled(m_left, Vector2.new(x - distance, y - height), Vector2.new(x - (distance + size), y), Vector2.new(x - distance, y + height))
    Render.PolyFilled(m_right, Vector2.new(x + distance, y - height), Vector2.new(x + (distance + size), y), Vector2.new(x + distance, y + height))

    Render.BoxFilled(Vector2.new(x - (distance - 2), y - height), Vector2.new(x - (distance - 2) + 2, y + height), s_left)
    Render.BoxFilled(Vector2.new(x + (distance - 2), y - height), Vector2.new(x + (distance - 2) - 2, y + height), s_right)
end

arrows.on_draw = function()
    local local_player = EntityList.GetLocalPlayer()
    if not local_player or not local_player:IsAlive() then
        return
    end

    local state = arrows_menu["Arrows"]:Get()
    if state == 0 then
        return
    end

    local x, y = vars.screen.x / 2, vars.screen.y / 2
    local is_manual = antiaim.GetManuals()
    local arr_col = arrows_menu["Arrow Color"]:Get()
    local inv_col = arrows_menu["Inverted Color"]:Get()

    arr_col.a = 1.0
    inv_col.a = 1.0

    if state == 1 then
        arrows.by_text(x, y, arr_col, is_manual)
    end
    if state == 2 then
        arrows.by_poly(x, y, arr_col, inv_col, is_manual)
    end
end



menu["Visual"]["Hitlogs"] = {}

menu["Visual"]["Hitlogs"]["Draw Type"] = Menu.MultiCombo(tabs.visual, "Visual", "Hitlogs", {"Custom Render", "Under Crosshair", "Console Print", }, 0)

local hitlogs = {}

hitlogs.data = {}

hitlogs.count = {
    "st",
    "nd",
    "rd"
}

hitlogs.shots = 0

hitlogs.hitgroup_names = {'head', 'chest', 'stomach', 'left arm', 'right arm', 'left leg', 'right leg', 'neck', '?', 'gear' }

hitlogs.reasons = { "hit", "resolver", "spread", "occlusion",  "prediction error" }

hitlogs.reset = function(event)
    if event:GetName() == "round_start" then
        hitlogs.shots = 0
    end
end

hitlogs.shot_data = {}

hitlogs.on_ragebot = function(shot)
    hitlogs.shot_data = {
        backtrack = shot.backtrack,
        hitchance = shot.hitchance,
        damage = shot.damage,
        angle = shot.angle,
    }
end


hitlogs.on_registered_shot = function(shot)
    local reason = hitlogs.reasons[shot.reason + 1]
    local name = EntityList.GetPlayer(shot.target_index):GetName() or "?"
    local hitchance = math.floor(shot.hitchance + 0.5)

    hitlogs.shots = hitlogs.shots + 1

    local count_shot = ("%i%s"):format(hitlogs.shots, hitlogs.count[hitlogs.shots] or "th")
   
    local log = nil
    local print_log = nil

    if reason == "hit" then
        print_log = ("{1, 1, 1}Registered {0.78, 1, 0}%s {1, 1, 1}shot in {0.78, 1, 0}%s's %s {1, 1, 1}[damage: {0.78, 1, 0}%s{1, 1, 1}/{0.78, 1, 0}%s {1, 1, 1}| hitchance: {0.78, 1, 0}%s{1, 1, 1}/{0.78, 1, 0}%s {1, 1, 1}| history: {0.78, 1, 0}%s{1, 1, 1}]"):format(count_shot, name, hitlogs.hitgroup_names[shot.hitgroup], shot.damage, hitlogs.shot_data.damage, hitchance, hitlogs.shot_data.hitchance, shot.backtrack)
        log = ("Registered %s shot in %s's %s [damage: %s/%s | hitchance: %s/%s | history: %s]"):format(count_shot, name, hitlogs.hitgroup_names[shot.hitgroup], shot.damage, hitlogs.shot_data.damage, hitchance, hitlogs.shot_data.hitchance, shot.backtrack)
    else
        print_log = ("{1, 1, 1}Missed {1, 0, 0}%s {1, 1, 1}shot in {1, 0, 0}%s's %s {1, 1, 1}due to {1, 0, 0}%s {1, 1, 1}[damage: {1, 0, 0}%s{1, 1, 1}/{1, 0, 0}%s {1, 1, 1}| hitchance: {1, 0, 0}%s{1, 1, 1}/{1, 0, 0}%s {1, 1, 1}| history: {1, 0, 0}%s{1, 1, 1}]"):format(count_shot, name, hitlogs.hitgroup_names[shot.hitgroup + 1], reason, shot.damage, hitlogs.shot_data.damage, hitchance, hitlogs.shot_data.hitchance, shot.backtrack)
        log = ("Missed %s shot in %s's %s due to %s [damage: %s/%s | hitchance: %s/%s | history: %s]"):format(count_shot, name, hitlogs.hitgroup_names[shot.hitgroup + 1], reason, shot.damage, hitlogs.shot_data.damage, hitchance, hitlogs.shot_data.hitchance, shot.backtrack)
    end

    if menu["Visual"]["Hitlogs"]["Draw Type"]:GetBool(3) then
        uwu.print('{0.54, 0.83, 1}[Aarne.club] ' .. print_log .. '\n')
    end

    if log and menu["Visual"]["Hitlogs"]["Draw Type"]:GetBool(1) then
        table.insert(hitlogs.data, {
            log = print_log,
            alpha = 1,
            realtime = GlobalVars.realtime,
        })
    end
end

hitlogs.on_draw = function()
    if not menu["Visual"]["Hitlogs"]["Draw Type"]:GetBool(1) then
        return
    end

    local x, y, plus = 5, 5, 0

    for i, data in ipairs(hitlogs.data) do

        data.alpha = math.lerp(data.alpha, (data.realtime + 5 < GlobalVars.realtime) and 0 or 255, 0.095)

        local alpha = data.alpha / 255

        local off = y + 13 * plus
        uwu.print(data.log, Vector2.new(x, off), alpha, font.verdana_r, false)
        --Render.ShadowText(data.log, Vector2.new(x, off), Color.new(1.0, 1.0, 1.0, alpha), font.verdana_r, true)

        plus = plus + alpha

        if data.alpha <= 0 then
            table.remove(hitlogs.data, i)
        end
    end
end


hitlogs.on_hurt = function(event)
    if not (event:GetName() == "player_hurt") then
        return
    end

    if not menu["Visual"]["Hitlogs"]["Draw Type"]:GetBool(2) then
        return
    end

    local local_player = EntityList.GetLocalPlayer()
    local userid = EntityList.GetPlayerForUserID(event:GetInt("userid", 0))
    local attacker = EntityList.GetPlayerForUserID(event:GetInt("attacker", 0))

    if not (local_player == attacker) then
        return
    end

    local target_name = userid:GetName()
    local health = event:GetInt("health", 0)
    local damage = event:GetInt("dmg_health", 0)
    local hitgroup = event:GetInt("hitgroup", 0)
    local hitgroup_name = hitlogs.hitgroup_names[hitgroup] or "?"

    local log = ("%s %s -%s (%s)"):format(target_name, hitgroup_name, damage, health)

    binds.data:CreateObject({
        name = log,
        time = GlobalVars.realtime,

        GetBool = function(self)
            if self.time + 5 < GlobalVars.realtime then
                return false
            end
            return true
        end,

        GetColor = function()
            if health <= 0 then
                return Color.new(0.5, 0.2, 0.2)
            end

            return Color.new(1.0, 1.0, 1.0)
        end,

        CustomRender = function(name, vector, color)
            vector.y = vector.y + 20
            Render.ShadowText(name, vector, color, font.verdana, true, true)
        end
    })
end



local snaplines = {}

menu["Visual"]["Snaplines"] = {}

menu["Visual"]["Snaplines"]["Enable and Color"] = Menu.SwitchColor(tabs.visual, "Visual", "Snaplines", false, Color.RGBA(255, 255, 255, 100))

snaplines.on_draw = function()
    if not menu["Visual"]["Snaplines"]["Enable and Color"]:GetBool() then
        return
    end

    local snap_color = menu["Visual"]["Snaplines"]["Enable and Color"]:GetColor()

    local hitbox = 4
    local players = EntityList.GetPlayers()
    local local_player = EntityList.GetLocalPlayer()

    if not local_player or not local_player:IsAlive() or not players or #players < 1 then
        return
    end
   
    local local_hitbox = local_player:GetHitboxCenter(hitbox)
    local local_hitbox_2d = Render.WorldToScreen(local_hitbox)

    if not vars.thirdperson:Get() then
        local_hitbox_2d = Vector2.new(vars.screen.x / 2, vars.screen.y)
    end

    for i, player in ipairs(players) do
        if player:IsEnemy() and player:IsAlive() and not player:IsDormant() then
            local player_hitbox = player:GetHitboxCenter(hitbox)
            local player_hitbox_2d = Render.WorldToScreen(player_hitbox)

            Render.Line(local_hitbox_2d, player_hitbox_2d, snap_color)
        end
    end
end




local hitmarker = {}

menu["Visual"]["Hitmarker"] = {}
menu["Visual"]["Hitmarker"]["Enable Hitmarker"] = Menu.MultiCombo(tabs.visual, "Visual", "Hitmarker", {'Damage', 'Сross'}, 0)

menu["Visual"]["Hitmarker"]['Color'] = Menu.ColorEdit(tabs.visual, 'Colors', '[Hitmarker] Color', Color.RGBA(255, 255, 255))

hitmarker.update_menu = function()
    local state = menu["Visual"]["Hitmarker"]["Enable Hitmarker"]:Get(1) or menu["Visual"]["Hitmarker"]["Enable Hitmarker"]:Get(2)
    menu["Visual"]["Hitmarker"]['Color']:SetVisible(state)
end

hitmarker.update_menu()

menu["Visual"]["Hitmarker"]["Enable Hitmarker"]:RegisterCallback(hitmarker.update_menu)

hitmarker.data = {}

hitmarker.on_hurt = function(event)
    if not menu["Visual"]["Hitmarker"]["Enable Hitmarker"]:Get(1) and not menu["Visual"]["Hitmarker"]["Enable Hitmarker"]:Get(2) then
        return
    end

    if not (event:GetName() == "player_hurt") then
        return
    end

    local local_player = EntityList.GetLocalPlayer()
    if not local_player then
        return
    end

    local userid = EntityList.GetPlayerForUserID(event:GetInt("userid", 0))
    local attacker = EntityList.GetPlayerForUserID(event:GetInt("attacker", 0))

    if not (local_player == attacker) then
        return
    end

    local local_weapon = local_player:GetActiveWeapon()
    if not local_weapon or not local_weapon:IsGun() then
        return
    end

    local damage = event:GetInt("dmg_health", 0)
    local hitgroup = event:GetInt("hitgroup", 0)

    local userid_hitbox = userid:GetHitboxCenter(hitgroup)

    local color = menu["Visual"]["Hitmarker"]['Color']:Get()

    table.insert(hitmarker.data, {
        alpha = 1,
        move = 1,
        color = color,
        damage = damage,
        hitgroup = hitgroup,
        userid_hitbox = userid_hitbox,

        realtime = GlobalVars.realtime,
    })
end

hitmarker.on_draw = function()
    for i, data in ipairs(hitmarker.data) do
        local hitgroup = data.hitgroup
        local userid_hitbox = data.userid_hitbox

        if not userid_hitbox or not userid_hitbox.x then
            return
        end

        local userid_hitbox_2d = Render.WorldToScreen(userid_hitbox)

        local damage = tostring(data.damage)

        data.alpha = math.lerp(data.alpha, data.move >= 200 and 0 or 255, 0.095)
        local alpha = data.alpha / 255

        data.color.a = alpha

        if menu["Visual"]["Hitmarker"]["Enable Hitmarker"]:Get(2) then
            Render.FilledBox(userid_hitbox_2d.x - 4.5, userid_hitbox_2d.y, 10, 1, data.color)
            Render.FilledBox(userid_hitbox_2d.x, userid_hitbox_2d.y - 4.5, 1, 10, data.color)
        end

        data.move = math.lerp(data.move, 255, 0.005)

        userid_hitbox_2d.y = userid_hitbox_2d.y - (70 * data.move / 255)

        if menu["Visual"]["Hitmarker"]["Enable Hitmarker"]:Get(1) then
            Render.ShadowText(damage, userid_hitbox_2d, data.color, font.verdana_r, true, true)
        end

        if data.move >= 200 then
            if data.alpha < 1 then
                table.remove(hitmarker.data, i)
            end
        end
    end
end

local scope_line = {}

scope_line.var = Menu.FindVar("Visuals", "View", "Camera", "Remove Scope")

menu["Visual"]["Custom Scope"] = {}

scope_line_menu = menu["Visual"]["Custom Scope"]

scope_line_menu["Enable"] = Menu.Switch(tabs.visual, "Visual", "Custom Scope", false)
scope_line_menu["Offset"] = Menu.SliderInt(tabs.visual, "Visual", "Offset", 10, 0, 500)
scope_line_menu["Length"] = Menu.SliderInt(tabs.visual, "Visual", "Length", 60, 0, 1000)
scope_line_menu["Color 1"] = Menu.ColorEdit(tabs.visual, "Colors", "[Custom Scope] Start", Color.RGBA(255, 255, 255))
scope_line_menu["Color 2"] = Menu.ColorEdit(tabs.visual, "Colors", "[Custom Scope] End", Color.RGBA(255, 255, 255, 0))

scope_line.update_menu = function()
    for key, menu in pairs(scope_line_menu) do
        local state = scope_line_menu["Enable"]:Get()

        if not (key == "Enable") then
            menu:SetVisible(state)
        end
    end
end

scope_line.update_menu()

scope_line_menu["Enable"]:RegisterCallback(scope_line.update_menu)

scope_line.anim_num = 0

scope_line.on_draw = function()
    if not scope_line_menu["Enable"]:Get() then
        return
    end

    scope_line.var:SetInt(2)

    local local_player = EntityList.GetLocalPlayer()

    local state = (not local_player or not local_player:IsAlive() or not local_player:GetProp("m_bIsScoped"))

    scope_line.anim_num = math.lerp(scope_line.anim_num, state and 0 or 255, 0.095)

    local alpha = scope_line.anim_num / 255

    scope_line.offset = scope_line_menu["Offset"] :Get() * alpha
    scope_line.length = scope_line_menu["Length"]:Get() * alpha
    scope_line.col_1 = scope_line_menu["Color 1"]:Get()
    scope_line.col_2 = scope_line_menu["Color 2"]:Get()
    scope_line.width = 1

    scope_line.col_1.a = scope_line.col_1.a * alpha
    scope_line.col_2.a = scope_line.col_2.a * alpha
   
    scope_line.start_x = vars.screen.x / 2
    scope_line.start_y = vars.screen.y / 2

    --Left
    Render.GradientBoxFilled(Vector2.new(scope_line.start_x - scope_line.offset, scope_line.start_y), Vector2.new(scope_line.start_x - scope_line.offset - scope_line.length, scope_line.start_y + scope_line.width), scope_line.col_1, scope_line.col_2, scope_line.col_1, scope_line.col_2)

    --Right
    Render.GradientBoxFilled(Vector2.new(scope_line.start_x + scope_line.offset, scope_line.start_y), Vector2.new(scope_line.start_x + scope_line.offset + scope_line.length, scope_line.start_y + scope_line.width), scope_line.col_1, scope_line.col_2, scope_line.col_1, scope_line.col_2)

    --Up
    Render.GradientBoxFilled(Vector2.new(scope_line.start_x, scope_line.start_y + scope_line.offset), Vector2.new(scope_line.start_x + scope_line.width, scope_line.start_y + scope_line.offset + scope_line.length), scope_line.col_1, scope_line.col_1, scope_line.col_2, scope_line.col_2)

    --Down
    Render.GradientBoxFilled(Vector2.new(scope_line.start_x, scope_line.start_y - scope_line.offset), Vector2.new(scope_line.start_x + scope_line.width, scope_line.start_y - scope_line.offset - scope_line.length), scope_line.col_1, scope_line.col_1, scope_line.col_2, scope_line.col_2)
end



local sloweddown = {}

menu["Visual"]["Velocity Recovery"] = {}

menu["Visual"]["Velocity Recovery"]["Enable"] = Menu.Switch(tabs.visual, "Visual", "Velocity Recovery", false)
menu["Visual"]["Velocity Recovery"]["X"] = Menu.SliderInt(tabs.visual, 'Visual', 'Velocity Recovery X', math.floor(vars.screen.x / 2), 0, math.floor(vars.screen.x))
menu["Visual"]["Velocity Recovery"]["Y"] = Menu.SliderInt(tabs.visual, 'Visual', 'Velocity Recovery Y', 300, 0, math.floor(vars.screen.y))

menu["Visual"]["Velocity Recovery"]["X"]:SetVisible(false)
menu["Visual"]["Velocity Recovery"]["Y"]:SetVisible(false)

sloweddown.anim_line = 0

sloweddown.on_draw = draggables.create_draggable(menu["Visual"]["Velocity Recovery"]["X"], menu["Visual"]["Velocity Recovery"]["Y"], 160, 40, 3, function(self)
    if not menu["Visual"]["Velocity Recovery"]["Enable"]:Get() then
        return
    end

    local local_player = EntityList.GetLocalPlayer()
    if not local_player or not local_player:IsAlive() then
        return
    end

    local vel = local_player:GetProp("m_flVelocityModifier")
    if vel == 1 and not Cheat.IsMenuVisible() then
        return
    end

    local color = Color.new(1.0 - (1.0 * vel), vel / 2, 0.0)
    local alpha = math.abs(GlobalVars.curtime * 2 % 2 - 1)

    local text = ("Recovery: %s%%"):format(math.floor(vel * 100))

    local text_width = 105
    sloweddown.anim_line = math.lerp(sloweddown.anim_line, math.floor((text_width - 2) * vel), 0.095)

    local x, y = self.position_x, self.position_y

    Render.PolyFilled(Color.new(0, 0, 0, 0.2 * alpha), Vector2.new(x + 20, y - 4), Vector2.new(x - 3, y + 42), Vector2.new(x + 43, y + 42))
    Render.PolyFilled(Color.new(color.r, color.g, color.b, alpha), Vector2.new(x + 20, y + 0), Vector2.new(x + 0, y + 40), Vector2.new(x + 40, y + 40))
    Render.ShadowText("!", Vector2.new(x + 15, y + 10), Color.new(0.0, 0.0, 0.0, 0.7 * alpha), font.slow2)

    Render.ShadowText(text, Vector2.new(x + 50, y + 5), Color.new(1.0, 1.0, 1.0), font.slow, true)

    Render.Box(Vector2.new(x + 50, y + 25), Vector2.new(x + 55 + text_width, y + 40), Color.new(0.0, 0.0, 0.0))
    Render.BoxFilled(Vector2.new(x + 51, y + 26), Vector2.new(x + 54 + text_width, y + 39), Color.new(0.0, 0.0, 0.0, 0.3))
    Render.BoxFilled(Vector2.new(x + 51, y + 26), Vector2.new(x + 56 + sloweddown.anim_line, y + 39), color)
end)




menu["Global"] = {}


local max_misses = {}

menu["Global"]['Max Misses'] = {
    ['Enable'] = Menu.Switch(tabs.global, 'Rage', 'Max. Misses', false, 'After Х misses, script disable head for ragebot.'),
    ['Max'] = Menu.SliderInt(tabs.global, 'Rage', 'Max.', 2, 1, 10)
}

max_misses.update_menu = function()
    local val = menu["Global"]['Max Misses']['Enable']:Get()
    menu["Global"]['Max Misses']['Max']:SetVisible(val)
end

max_misses.update_menu()
menu["Global"]['Max Misses']['Enable']:RegisterCallback(max_misses.update_menu)

max_misses.data = {}

max_misses.on_registered_shot = function(shot)
    if shot.reason ~= 1 then
        return
    end
   
    if not max_misses.data[shot.target_index] then
        max_misses.data[shot.target_index] = {
            esp_bool = false,
            shots = 0,
        }
    end

    max_misses.data[shot.target_index].shots = max_misses.data[shot.target_index].shots + 1
end

max_misses.on_prediction = function()
    if not menu["Global"]['Max Misses']['Enable']:Get() then
        return
    end
   
    for player_index, data in pairs(max_misses.data) do
        if data.shots >= menu["Global"]['Max Misses']['Max']:Get() then
            data.esp_bool = true

            RageBot.EnableHitbox(player_index, 0, false)
        end
    end
end

max_misses.reset_data = function(event)
    if event:GetName() ~= 'round_start' then
        return
    end

    max_misses.data = {}
end

ESP.CustomText("Body", "enemies", "BODY", function(ent)
    local data = max_misses.data[ent:EntIndex()]

    if data and data.esp_bool then
        return 'BODY'
    end
end)



local teleport = {}

menu['Global']['Teleport'] = {}

teleport.csgo_weapons = { [1] = "Deagle", [2] = "Pistols", [3] = "Pistols", [4] = "Pistols", [5] = "Pistols", [6] = "Pistols", [7] = "Rifle/LMG", [8] = "Rifle/LMG", [9] = "AWP", [10] = "Rifle/LMG", [11] = "AutoSnipers", [12] = "Rifle/LMG", [13] = "Rifle/LMG", [14] = "Rifle/LMG", [15] = "Rifle/LMG", [16] = "Rifle/LMG", [17] = "SMG", [18] = "SMG", [19] = "SMG", [20] = "Scout", [21] = "Rifle/LMG", [22] = "Rifle/LMG", [23] = "SMG", [24] = "SMG", [25] = "Shotgun", [26] = "SMG", [27] = "Shotgun", [28] = "Rifle/LMG", [29] = "Shotgun", [30] = "Pistols", [31] = "Taser", [32] = "Pistols", [33] = "SMG", [34] = "SMG", [35] = "Shotgun", [36] = "Pistols", [37] = "AutoSnipers", [38] = "AutoSnipers", [39] = "Rifle/LMG", [40] = "Scout", [41] = "Other", [42] = "Other", [43] = "Nades", [44] = "Nades", [45] = "Nades", [46] = "Nades", [47] = "Nades", [48] = "Nades", [49] = "Other", [59] = "Other", [60] = "Rifle/LMG", [61] = "Pistols", [63] = "Pistols", [64] = "Pistols", [500] = "Other", [505] = "Other", [506] = "Other", [507] = "Other", [508] = "Other", [509] = "Other", [512] = "Other", [514] = "Other", [515] = "Other", [516] = "Other", [197108] = "Other", [197113] = "Other", [197114] = "Other", [197115] = "Other", [197116] = "Other", [197123] = "Other", [197120] = "Other", [197128] = "Other", [197124] = "Other", [197130] = "Other", [197122] = "Other", [197117] = "Other", [197131] = "Other", [197127] = "Other", [197111] = "Other", [197125] = "Other", [197126] = "Other", [197129] = "Other", [197133] = "Other", [262205] = "Pistols", [262208] = "Pistols" }

teleport.weapons_list = {}
teleport.weapon_list_names = {}

for k, v in pairs(teleport.csgo_weapons) do
    if teleport.weapons_list[v] == nil then
        teleport.weapons_list[v] = {}
        table.insert(teleport.weapon_list_names, v)
    end

    table.insert(teleport.weapons_list[v], k)
end

table.sort(teleport.weapon_list_names)

teleport.combo_weapon_ids = {}

menu['Global']['Teleport']['Enable'] = Menu.Switch(tabs.global, 'Rage', 'Teleport In Air', false)
menu['Global']['Teleport']['Weapons'] = Menu.MultiCombo(tabs.global, 'Rage', 'Weapons', (function()
    local tbl = {}

    for k, v in pairs(teleport.weapon_list_names) do
        table.insert(tbl, v)
        teleport.combo_weapon_ids[v] = k
    end

    return tbl
end)(), 0)

teleport.update_menu = function()
    menu['Global']['Teleport']['Weapons']:SetVisible(menu['Global']['Teleport']['Enable']:Get())
end

teleport.update_menu()

menu['Global']['Teleport']['Enable']:RegisterCallback(teleport.update_menu)

teleport.min_penetrate_damage = 10

teleport.on_prediction = function()
    if not menu['Global']['Teleport']['Enable']:Get() then
        return
    end

    if not vars.dt_ref:Get() then
        return
    end

    if Exploits.GetCharge() ~= 1 then
        return
    end

    local localplayer = EntityList.GetLocalPlayer()
    if localplayer == nil or not localplayer:IsAlive() then
        return
    end

    local active_weapon = localplayer:GetActiveWeapon()
    if active_weapon == nil then
        return
    end

    active_weapon = active_weapon:GetWeaponID()

    local group_name = teleport.csgo_weapons[active_weapon]
    if group_name == nil then
        return
    end

    local is_allowed_by_combo = bit.band(menu['Global']['Teleport']['Weapons']:Get(), bit.lshift(1, teleport.combo_weapon_ids[group_name] - 1)) ~= 0
    if not is_allowed_by_combo then
        return
    end

    local flags = localplayer:GetProp("m_fFlags")
    local on_ground = bit.band(flags, bit.lshift(1, 0)) ~= 0
    if on_ground then
        return
    end

    local players = EntityList.GetPlayers()

    if #players == 1 then
        return
    end

    local local_player_hitbox = localplayer:GetHitboxCenter(6)

    for k, current_player in ipairs(players) do
        if current_player == local_player or current_player:IsDormant() or current_player:IsTeamMate() or not current_player:IsAlive() then
            goto skip
        end

        local player_eye = current_player:GetEyePosition()
       
        local penetrated_bullet = Cheat.FireBullet(current_player, player_eye, local_player_hitbox)

        if penetrated_bullet.trace.hit_entity ~= nil and penetrated_bullet.damage > teleport.min_penetrate_damage and penetrated_bullet.trace.hit_entity:EntIndex() == localplayer:EntIndex() then
            Exploits.ForceTeleport()
            break
        end

        ::skip::
    end
end

local aimbot = {}

menu["Global"]["Dormant"] = {}

menu["Global"]["Dormant"]["Dormant Enable"] = Menu.Switch(tabs.global, "Rage", "Dormant Aimbot", false, 'shit like russian army')
menu["Global"]["Dormant"]["Auto Stop"] = Menu.Switch(tabs.global, "Rage", "Auto Stop", false)
menu["Global"]["Dormant"]["Auto Scope"] = Menu.Switch(tabs.global, "Rage", "Auto Scope", false)
menu["Global"]["Dormant"]["Minimum Damage"] = Menu.SliderInt(tabs.global, "Rage", "Minimum Damage", 5, 1, 100)

aimbot.update_menu = function()
    local state = menu["Global"]["Dormant"]["Dormant Enable"]:Get()

    menu["Global"]["Dormant"]["Minimum Damage"]:SetVisible(state)
    menu["Global"]["Dormant"]["Auto Stop"]:SetVisible(state)
    menu["Global"]["Dormant"]["Auto Scope"]:SetVisible(state)
end

aimbot.update_menu()
menu["Global"]["Dormant"]["Dormant Enable"]:RegisterCallback(aimbot.update_menu)

aimbot.esp_data = {}

--@note: premium autostop
aimbot.auto_stop = function(cmd)
    cmd.forwardmove = cmd.forwardmove - cmd.forwardmove / 1.5
    cmd.sidemove = cmd.sidemove - cmd.sidemove / 1.5
end

aimbot.auto_scope = function(local_player, weapon, cmd)
    local flags = local_player:GetProp("m_fFlags")
    local scoped = local_player:IsScoped()
   
    if (weapon:IsSniper() == true and scoped == false and bit.band(flags, 1) == 1) then
        cmd.buttons = bit.bor(cmd.buttons, 2048)
    end
end

aimbot.on_prediction = function(cmd)
    if not menu["Global"]["Dormant"]["Dormant Enable"]:Get() then
        return
    end

    local local_player = EntityList.GetLocalPlayer()
    if not local_player or not local_player:IsAlive() then
        return
    end

    local local_weapon = local_player:GetActiveWeapon()
    if local_weapon == nil then
        return
    end

    local flags = local_player:GetProp("m_fFlags")
    local on_ground = bit.band(flags, bit.lshift(1, 0)) ~= 0
    if not on_ground then
        return
    end

    local players = EntityList.GetPlayers()
    if #players == 1 then
        return
    end

    local weapon_inaccuracy = 1 / local_weapon:GetInaccuracy(local_weapon)
    local min_damage = menu["Global"]["Dormant"]["Minimum Damage"]:Get()
    local is_autostop = menu["Global"]["Dormant"]["Auto Stop"]:Get()
    local is_autoscope = menu["Global"]["Dormant"]["Auto Scope"]:Get()

    local local_eye = local_player:GetEyePosition()

    local esp_data = {}

    for i, player in ipairs(players) do
        if not player:IsEnemy() or not player:IsAlive() or (player:GetESPAlpha() == 1) then
            goto skip
        end

        local trace_bullet = Cheat.FireBullet(local_player, local_eye, player:GetHitboxCenter(5))

        for i = 0, 18 do
            local trace_bullet_hitbox = Cheat.FireBullet(local_player, local_eye, player:GetHitboxCenter(i))

            if trace_bullet_hitbox.damage >= min_damage then
                trace_bullet = trace_bullet_hitbox
            end
        end


        if trace_bullet.trace.hit_entity and not EntityList.GetPlayer(trace_bullet.trace.hit_entity:EntIndex()):IsEnemy() then
            goto skip
        end

        if trace_bullet.damage >= min_damage and not local_weapon:IsReloading() and local_weapon:IsSniper() then
            esp_data[player:EntIndex()] = true

            if is_autoscope then
                aimbot.auto_scope(local_player, local_weapon, cmd)
            end

            if is_autostop then
                aimbot.auto_stop(cmd)
            end
           
            if weapon_inaccuracy >= 90 and local_player:IsScoped() and local_weapon:GetProp("m_flNextPrimaryAttack") < GlobalVars.curtime then
                local angle = Cheat.VectorToAngle(trace_bullet.trace.endpos - local_eye)

                local m_aimPunchAngle = local_player:GetProp("m_aimPunchAngle")
                local aim_punch = QAngle.new(m_aimPunchAngle.x, m_aimPunchAngle.y, 0.0)

                aim_punch.yaw = aim_punch.yaw * 2
                aim_punch.pitch = aim_punch.pitch * 2

                cmd.viewangles = angle - aim_punch

                cmd.buttons = bit.bor(cmd.buttons, 1)
                break
            end
        end

        ::skip::
    end

    aimbot.esp_data = esp_data
end

ESP.CustomText("Dormant Aimbot", "enemies", "DA", function(ent)
    if aimbot.esp_data[ent:EntIndex()] then
        return 'DA'
    end
end)



local global = {}

menu["Global"]["Custom Hitchances"] = {}

menu["Global"]["Custom Hitchances"]["Custom Hitchance"] = Menu.Switch(tabs.global, "Rage", "Custom Hitchance", false)
menu["Global"]["Custom Hitchances"]["In Air Hitchance"] = Menu.SliderInt(tabs.global, "Rage", "In Air Hitchance", 60, 0, 100)
menu["Global"]["Custom Hitchances"]["No Scope Hitchance"] = Menu.SliderInt(tabs.global, "Rage", "No Scope Hitchance", 60, 0, 100)

global.update_menu = function()
    local state = menu["Global"]["Custom Hitchances"]["Custom Hitchance"]:Get()

    menu["Global"]["Custom Hitchances"]["In Air Hitchance"]:SetVisible(state)
    menu["Global"]["Custom Hitchances"]["No Scope Hitchance"]:SetVisible(state)
end

global.update_menu()

menu["Global"]["Custom Hitchances"]["Custom Hitchance"]:RegisterCallback(global.update_menu)


global.hitchances = function()
    if not menu["Global"]["Custom Hitchances"]["Custom Hitchance"]:Get() then
        return
    end

    local local_player = EntityList.GetLocalPlayer()
    if not local_player  then
        return
    end

    local players = EntityList.GetPlayers()
    if #players < 1 then
        return
    end

    local state = antiaim.GetPlayerState()

    if state and (state == "Air") then
        local in_air_hitchance = menu["Global"]["Custom Hitchances"]["In Air Hitchance"]:Get()

        for i, player in ipairs(players) do  
            RageBot.OverrideHitchance(player:EntIndex(), in_air_hitchance)
        end

        return
    end

    local local_weapon = local_player:GetActiveWeapon()

    if local_weapon and local_weapon:IsSniper() and not local_player:IsScoped() then
        local no_scope_hitchance = menu["Global"]["Custom Hitchances"]["No Scope Hitchance"]:Get()

        for i, player in ipairs(players) do
            RageBot.OverrideHitchance(player:EntIndex(), no_scope_hitchance)
        end
    end
end

local fakelag = {}

menu["Global"]["Fake Lag"] = {}

menu["Global"]["Fake Lag"]["Disable lags on Hide Shots"] = Menu.Switch(tabs.global, "Rage", "Disable lags on Hide Shots", false, 'Disable your Fake Lags in Menu when you use Hide Shots')

fakelag.update_menu = function()
    if menu["Global"]["Fake Lag"]["Disable lags on Hide Shots"]:Get() then
        vars.fakelag_ref:Set(not vars.hs_ref:Get())
    end
end

fakelag.update_menu()

vars.hs_ref:RegisterCallback(fakelag.update_menu)
menu["Global"]["Fake Lag"]["Disable lags on Hide Shots"]:RegisterCallback(fakelag.update_menu)



local clantag = {}

menu["Global"]["ClanTag"] = {}

menu["Global"]["ClanTag"]["ClanTag"] = Menu.Switch(tabs.global, "Other", "ClanTag", false)

clantag.ffi = ffi.cast('int(__fastcall*)(const char*, const char*)', Utils.PatternScan('engine.dll', '53 56 57 8B DA 8B F9 FF 15'))
clantag.last = nil

clantag.set = function(tag)
    if tag == clantag.last then
        return
    end

    clantag.ffi(tag, tag)
    clantag.last = tag
end

clantag.build = function(tag)
    local ret = {}

    for i = 1, #tag do
        table.insert(ret, tag:sub(1, i))
    end

    for i = 1, 4 do
        table.insert(ret, tag)
    end

    for i = 1, #tag do
        table.insert(ret, tag:sub(i, #tag))
    end

    table.insert(ret, '')

    return ret
end

clantag.tag = clantag.build("aarne.club")

clantag.on_draw = function()
    if not menu["Global"]["ClanTag"]["ClanTag"]:Get() then
        return
    end

    if not EngineClient.IsConnected() then
        return
    end

    local net_channel_info = EngineClient.GetNetChannelInfo()

    if not net_channel_info then
        return
    end

    local latency = net_channel_info:GetLatency(0) / GlobalVars.interval_per_tick
    local tickcount_pred = GlobalVars.tickcount + latency
    local iter = math.floor(math.fmod(tickcount_pred / 13, #clantag.tag)) + 1

    clantag.set(clantag.tag[iter])
end

clantag.destroy = function()
    clantag.set("")
end

menu["Global"]["ClanTag"]["ClanTag"]:RegisterCallback(clantag.destroy)



local trashtalk = {}

trashtalk.phrases = {
    "Меф, кокс, героин, гашик, эксзи, амф, лучшие закладки вашего города писать в тг - fipp1337",
    "you are welcome - www.aarne.club",
    "Мы убили долбаёба и положили его в подвал, он там тухнет",
    "Тебя ебут в жопу, ты хочешь быть как Playboi Carti (Да ну нахуй)",
    "У тебя нет девушки, ты ебёшь кошку, ты — зоофил",
    "Благодари Дога то, что я не умер тебя",
    "ХАХАЗВАЗХВЗАХВХА НИЩЕНКА В ЧЕСТЬ ТЕБЯ РЕКУ НАЗВАЛИ",
    "ЗА КЕМ ДОЖРАЛ?!",
    "Почему твоя мать подписана у меня как 'Дроп' ?",
    "Нигга, ты не true",
    "Убил беременную тёлку,у неё была двойня. Триплкилл",
    "Ты гандон, я уеду в тюрьму и выебу там твоего папу",
    "Ты не ебал тёлок — ты день и ночь на PornHub'е",
    "Damn, ебашу налегке",
    "твоя шалава типа гроб, положил в нее лил пипку",
    "А ты ебаный бич",
    "Закопал его живым и он уже в могиле помер",
    "Ты ебаная шлюха, иди нюхай меф с моего хуя",
    "Его башка будто мяч — я пинал пыром",
    "Чё ты мне хочешь сказать? Уебан, помолчи, не давал тебе голос",
    "Он ещё даже тёлку не трахал, но уже убил человека",
    "A МАМЕ? А ПАПЕ??",
    "москаль, в ад",
    'лови чек на сабку хуесос нищий http://t.me/CryptoBot?start=CQzZkcNF3QN',
    "иди с медведями сфоткайся",
    "одной ногой играю (◣◢)",
    "LIFEHACK BITCH!!! (◣◢)",
    "мёда похавай, москаль",
    "hs бомjара",
    "я сейчас начну кое-что про маму говорить и мне будет всё равно, что у меня мама дома",
    "куда слетел тапок?!",
    "ща ебало будет плоским",
    "иди голубей покорми",
    "ебать я твоей матери кормушку расхуячил",
    "иди на алике силиконовые мозги вгетай себе, москаль",
    "я сожрал твою мать нахуй, и её кости хрустели, как чипсы русская картошка",
    "в лобби безмамный бот",
    "нахуя бычок об жопу тушишь?",
    "ты ден? ты наверное себе мозги мамкиными сигами задымил все",
    "Powered by www.aarne.club",
    "Заскамил узбека я думал это был таджик",
    "oh no cringe",
    'Мальчик, блять, остынь...',
    'Aarne.club - чтобы не быть Броук Боем',
    'в гулаг ублюдок',
    'no-life user',
    'и-и-и-иди нахуй шлюха',
    'ОПРАВДАЙСЯ МНЕ В ХУЙ..',
    'уничтожен',
    '1 TON жира в тебе, хуесос...',
    'У сестры знакомый военный говорит завтра ВСУ будут брать Белгород чтобы окружить Донбасс',
    'Слава Белгородской Народной Республике!',
    'где ты был 8 лет хуесос ебучий',
    'сегодня видел как ты бабку за сахар пырнул ха-ха',
    'Zаглотнул хуяку V рот уебан',
    'удобряй землю чмырь',
    'owned by bandera-script',
}


menu["Global"]["Trashtalk"] = {}

menu["Global"]["Trashtalk"]["Enable Trashtalk"] = Menu.Switch(tabs.global, "Other", "Trashtalk", false)

trashtalk.on_kill = function(event)
    if (event:GetName() == "player_death") then
        local local_player = EntityList.GetLocalPlayer()
        if not local_player then
            return
        end

        local userid = EntityList.GetPlayerForUserID(event:GetInt("userid", 0))
        local attacker = EntityList.GetPlayerForUserID(event:GetInt("attacker", 0))

        if (attacker == local_player and local_player ~= userid) then
            local phrase = menu["Global"]["Trashtalk"]["Enable Trashtalk"]:Get() and trashtalk.phrases[Utils.RandomInt(1, #trashtalk.phrases)] or ''

            local userid_name = userid:GetName()

            if playerlist.data[userid_name] and playerlist.data[userid_name]['Override']:Get() and playerlist.data[userid_name]['Trashtalk']:Get() then
                phrase = playerlist.data[userid_name]['Trashtalk Text']:Get()
            end
           
            local to_say = ("say %s"):format(phrase)

            EngineClient.ExecuteClientCmd(to_say)
        end
    end
end



local hitsound = {}

hitsound.data = {
    ["Skeet"] = "buttons\\arena_switch_press_02",
    ["Custom"] = "Custom",
}

hitsound.get_pairs = function()
    local keys = {}

    for key, index in pairs(hitsound.data) do
        table.insert(keys, key)
    end

    return keys
end

hitsound.keys = hitsound.get_pairs()

menu["Global"]["Hitsound"] = {}

menu["Global"]["Hitsound"]["Enable"] = Menu.Switch(tabs.global, "Other", "Hitsound", false)
menu["Global"]["Hitsound"]["Sounds"] = Menu.Combo(tabs.global, "Other", "Sounds", hitsound.keys, 0)
menu["Global"]["Hitsound"]["Custom"] = Menu.TextBox(tabs.global, "Other", "Custom", 64, "", "All csgo sounds\npaste.dy.fi/isy/plain")
menu["Global"]["Hitsound"]["Volume"] = Menu.SliderInt(tabs.global, "Other", "Volume", 100, 0, 100)

hitsound.update_menu = function()
    local state = menu["Global"]["Hitsound"]["Enable"]:Get()
    local main = menu["Global"]["Hitsound"]["Sounds"]:Get()

    menu["Global"]["Hitsound"]["Sounds"]:SetVisible(state)
    menu["Global"]["Hitsound"]["Custom"]:SetVisible(hitsound.data[hitsound.keys[main + 1]] == "Custom" and state)
    menu["Global"]["Hitsound"]["Volume"]:SetVisible(state)
end

hitsound.update_menu()

menu["Global"]["Hitsound"]["Enable"]:RegisterCallback(hitsound.update_menu)
menu["Global"]["Hitsound"]["Sounds"]:RegisterCallback(hitsound.update_menu)

hitsound.on_hurt = function(event)
    if not menu["Global"]["Hitsound"]["Enable"]:Get() then
        return
    end

    if not (event:GetName() == "player_hurt") then
        return
    end

    local local_player = EntityList.GetLocalPlayer()
    local userid = EntityList.GetPlayerForUserID(event:GetInt("userid", 0))
    local attacker = EntityList.GetPlayerForUserID(event:GetInt("attacker", 0))

    if not (attacker == local_player) then
        return
    end

    local hitsound_index = menu["Global"]["Hitsound"]["Sounds"]:Get()
    local hitsound_volume = menu["Global"]["Hitsound"]["Volume"]:Get() / 100
    local hitsound_check = hitsound.data[hitsound.keys[hitsound_index + 1]]

    local hitsound_name = hitsound_check == "Custom" and menu["Global"]["Hitsound"]["Custom"]:Get() or hitsound_check

    local to_execute = ("playvol %s %s"):format(hitsound_name, hitsound_volume)

    EngineClient.ExecuteClientCmd(to_execute)
end

local radar = {}

menu["Global"]["Radar"] = {}

menu["Global"]["Radar"]["Disable Radar"] = Menu.Switch(tabs.global, "Other", "Disable Radar", false)

radar.var = CVar.FindVar("cl_drawhud_force_radar")

radar.on_click = function()
    radar.var:SetInt(menu["Global"]["Radar"]["Disable Radar"]:Get() and -1 or 0)
end

radar.on_click()

menu["Global"]["Radar"]["Disable Radar"]:RegisterCallback(radar.on_click)

local molotov = {}

menu["Global"]["Molotov"] = {}

menu["Global"]["Molotov"]["Molotov Ignore-Z"] = Menu.Switch(tabs.global, "Other", "Molotov Ignore-Z", false)
menu["Global"]["Molotov"]["Molotov Wireframe"] = Menu.Switch(tabs.global, "Other", "Molotov Wireframe", false)

molotov.materials = {
    "particle/fire_burning_character/fire_env_fire_depthblend_oriented",
    "particle/fire_burning_character/fire_burning_character",
    "particle/fire_explosion_1/fire_explosion_1_oriented",
    "particle/fire_explosion_1/fire_explosion_1_bright",
    "particle/fire_burning_character/fire_burning_character_depthblend",
    "particle/fire_burning_character/fire_env_fire_depthblend",
}

molotov.on_draw = function()
    for k, v in ipairs(molotov.materials) do
        local material = MatSystem.FindMaterial(v, "")

        if material ~= nil then
            material:SetMaterialVarFlag(bit.lshift(1, 28), menu["Global"]["Molotov"]["Molotov Wireframe"]:GetBool()) -- Wireframe
            material:SetMaterialVarFlag(bit.lshift(1, 15), menu["Global"]["Molotov"]["Molotov Ignore-Z"]:GetBool()) -- IgnoreZ
        end
    end
end

molotov.on_destroy = function()
    for k, v in pairs(molotov.materials) do
        local material = MatSystem.FindMaterial(v, "")

        if material ~= nil then
            material:SetMaterialVarFlag(bit.lshift(1, 28), false) -- Wireframe
            material:SetMaterialVarFlag(bit.lshift(1, 15), false) -- IgnoreZ
        end
    end
end

local thirdperson = {}

menu["Global"]["Thirdperson"] = {}
thirdperson_menu = menu["Global"]["Thirdperson"]

thirdperson_menu["Disable 3D Person Anim"] = Menu.Switch(tabs.global, "Other", "Disable Thirdperson Anim.", false)

thirdperson.on_value = function()
    local state = thirdperson_menu["Disable 3D Person Anim"]:Get()

    Cheat.SetThirdPersonAnim(not state)
end

thirdperson.on_value()

thirdperson_menu["Disable 3D Person Anim"]:RegisterCallback(thirdperson.on_value)







local configs = {}

configs.default = "eyJWaXN1YWwiOnsiSGl0bG9ncyI6eyJEcmF3IFR5cGUiOjV9LCJBcnJvd3MiOnsiQXJyb3dzIjoxLCJTaXplIjo0LCJJbnZlcnRlZCBDb2xvciI6eyIxIjowLjU4ODIzNTMxODY2MDczNjEsIjIiOjAuNTg4MjM1MzE4NjYwNzM2MSwiMyI6MSwiNCI6MX0sIkRpc3RhbmNlIjozMywiQXJyb3cgQ29sb3IiOnsiMSI6MC40OTkxODIwNDU0NTk3NDczLCIyIjowLjU0NzI5OTAyNzQ0MjkzMjEsIjMiOjAuODM1MzY1ODMxODUxOTU5MiwiNCI6MX19LCJCaW5kcyI6eyJNaW4gRGFtYWdlIFgiOjkzMywiRW5hYmxlIGluZGljYXRvcnMiOjcsIkluZGljYXRvcnMgVHlwZSI6MSwiTWluIERhbWFnZSBZIjo1MTcsIkJpbmRzIjo3LCJEZXN5bmMgTGluZSBDb2xvciI6eyIxIjowLjQ5ODAzOTIxNTgwMzE0NjM2LCIyIjowLjU0OTAxOTYzNDcyMzY2MzMsIjMiOjAuODM1Mjk0MTI3NDY0Mjk0NCwiNCI6MX0sIlNjcmlwdCBuYW1lIENvbG9yIjp7IjEiOjAuNDk4MDM5MjE1ODAzMTQ2MzYsIjIiOjAuNTQ5MDE5NjM0NzIzNjYzMywiMyI6MC44MzUyOTQxMjc0NjQyOTQ0LCI0IjoxfX0sIkhpdG1hcmtlciI6eyJFbmFibGUgSGl0bWFya2VyIjoyLCJDb2xvciI6eyIxIjoxLCIyIjoxLCIzIjoxLCI0IjoxfX0sIlZlbG9jaXR5IFJlY292ZXJ5Ijp7IkVuYWJsZSI6ZmFsc2V9LCJTbmFwbGluZXMiOnsiRW5hYmxlIGFuZCBDb2xvciI6ZmFsc2V9LCJDdXN0b20gU2NvcGUiOnsiRW5hYmxlIjp0cnVlLCJPZmZzZXQiOjEwLCJDb2xvciAyIjp7IjEiOjEsIjIiOjEsIjMiOjEsIjQiOjB9LCJMZW5ndGgiOjYwLCJDb2xvciAxIjp7IjEiOjEsIjIiOjEsIjMiOjEsIjQiOjAuMzc4MDQ4Nzc3NTgwMjYxMjN9fX0sIkdsb2JhbCI6eyJDbGFuVGFnIjp7IkNsYW5UYWciOnRydWV9LCJGYWtlIExhZyI6eyJEaXNhYmxlIGxhZ3Mgb24gSGlkZSBTaG90cyI6dHJ1ZX0sIk1vbG90b3YiOnsiTW9sb3RvdiBJZ25vcmUtWiI6ZmFsc2UsIk1vbG90b3YgV2lyZWZyYW1lIjpmYWxzZX0sIlRyYXNodGFsayI6eyJFbmFibGUgVHJhc2h0YWxrIjp0cnVlfSwiRG9ybWFudCI6eyJEb3JtYW50IEVuYWJsZSI6ZmFsc2UsIkF1dG8gU2NvcGUiOmZhbHNlLCJBdXRvIFN0b3AiOmZhbHNlLCJNaW5pbXVtIERhbWFnZSI6NX0sIlJhZGFyIjp7IkRpc2FibGUgUmFkYXIiOnRydWV9LCJUaGlyZHBlcnNvbiI6eyJEaXNhYmxlIDNEIFBlcnNvbiBBbmltIjp0cnVlfSwiSGl0c291bmQiOnsiRW5hYmxlIjp0cnVlLCJTb3VuZHMiOjAsIkN1c3RvbSI6IiIsIlZvbHVtZSI6NTB9LCJUZWxlcG9ydCI6eyJFbmFibGUiOnRydWUsIldlYXBvbnMiOjI2NX0sIkN1c3RvbSBIaXRjaGFuY2VzIjp7IkluIEFpciBIaXRjaGFuY2UiOjEwMCwiQ3VzdG9tIEhpdGNoYW5jZSI6ZmFsc2UsIk5vIFNjb3BlIEhpdGNoYW5jZSI6MTAwfX0sIkFudGktQWltIjp7IkNyb3VjaGluZyI6eyJMZWZ0IExpbWl0Ijo2MCwiRmFrZSBMaW1pdCBUeXBlIjowLCJZYXcgQWRkIFJpZ2h0IjoyMCwiT3ZlcnJpZGUiOnRydWUsIkxCWSBNb2RlIjoxLCJGYWtlIE9wdGlvbnMiOjIsIk1vZGlmaWVyIERlZ3JlZSI6MjIsIkRpc2FibGUgQW50aS1CcnV0ZWZvcmNlIjpmYWxzZSwiWWF3IEFkZCBMZWZ0IjotMjAsIkZyZWVzdGFuZGluZyBEZXN5bmMiOjAsIkRlc3luYyBPbiBTaG90IjoxLCJSaWdodCBMaW1pdCI6NjAsIllhdyBNb2RpZmllciI6MX0sIlN0YW5kaW5nIjp7IkxlZnQgTGltaXQiOjAsIkZha2UgTGltaXQgVHlwZSI6MCwiWWF3IEFkZCBSaWdodCI6MCwiT3ZlcnJpZGUiOmZhbHNlLCJMQlkgTW9kZSI6MCwiRmFrZSBPcHRpb25zIjowLCJNb2RpZmllciBEZWdyZWUiOjAsIkRpc2FibGUgQW50aS1CcnV0ZWZvcmNlIjpmYWxzZSwiWWF3IEFkZCBMZWZ0IjowLCJGcmVlc3RhbmRpbmcgRGVzeW5jIjowLCJEZXN5bmMgT24gU2hvdCI6MCwiUmlnaHQgTGltaXQiOjAsIllhdyBNb2RpZmllciI6MH0sIlNsb3d3YWxrIjp7IkxlZnQgTGltaXQiOjAsIkZha2UgTGltaXQgVHlwZSI6MCwiWWF3IEFkZCBSaWdodCI6MCwiT3ZlcnJpZGUiOmZhbHNlLCJMQlkgTW9kZSI6MCwiRmFrZSBPcHRpb25zIjowLCJNb2RpZmllciBEZWdyZWUiOjAsIkRpc2FibGUgQW50aS1CcnV0ZWZvcmNlIjpmYWxzZSwiWWF3IEFkZCBMZWZ0IjowLCJGcmVlc3RhbmRpbmcgRGVzeW5jIjowLCJEZXN5bmMgT24gU2hvdCI6MCwiUmlnaHQgTGltaXQiOjAsIllhdyBNb2RpZmllciI6MH0sIkFudGktQnJ1dGVmb3JjZSBQaGFzZXMiOnsiMSI6NjAsIjIiOi02MCwiMyI6MCwiNCI6MCwiNSI6MCwiNiI6MCwiNyI6MCwiOCI6MCwiOSI6MCwiMTAiOjB9LCJPbiBVc2UiOnsiTGVmdCBMaW1pdCI6NjAsIkZha2UgTGltaXQgVHlwZSI6MCwiWWF3IEFkZCBSaWdodCI6MCwiT3ZlcnJpZGUiOnRydWUsIkxCWSBNb2RlIjoxLCJGYWtlIE9wdGlvbnMiOjAsIk1vZGlmaWVyIERlZ3JlZSI6MCwiRGlzYWJsZSBBbnRpLUJydXRlZm9yY2UiOmZhbHNlLCJZYXcgQWRkIExlZnQiOjAsIkZyZWVzdGFuZGluZyBEZXN5bmMiOjEsIkRlc3luYyBPbiBTaG90IjoxLCJSaWdodCBMaW1pdCI6NjAsIllhdyBNb2RpZmllciI6MH0sIlNoYXJlZCI6eyJMZWZ0IExpbWl0IjoxOCwiRmFrZSBMaW1pdCBUeXBlIjowLCJZYXcgQWRkIFJpZ2h0IjowLCJPdmVycmlkZSI6ZmFsc2UsIkxCWSBNb2RlIjoxLCJGYWtlIE9wdGlvbnMiOjIsIk1vZGlmaWVyIERlZ3JlZSI6NTQsIkRpc2FibGUgQW50aS1CcnV0ZWZvcmNlIjp0cnVlLCJZYXcgQWRkIExlZnQiOjAsIkZyZWVzdGFuZGluZyBEZXN5bmMiOjAsIkRlc3luYyBPbiBTaG90IjoxLCJSaWdodCBMaW1pdCI6MTgsIllhdyBNb2RpZmllciI6MX0sIkFpciI6eyJMZWZ0IExpbWl0Ijo0NywiRmFrZSBMaW1pdCBUeXBlIjoxLCJZYXcgQWRkIFJpZ2h0IjotNywiT3ZlcnJpZGUiOmZhbHNlLCJMQlkgTW9kZSI6MCwiRmFrZSBPcHRpb25zIjoyLCJNb2RpZmllciBEZWdyZWUiOjEsIkRpc2FibGUgQW50aS1CcnV0ZWZvcmNlIjpmYWxzZSwiWWF3IEFkZCBMZWZ0IjotNywiRnJlZXN0YW5kaW5nIERlc3luYyI6MCwiRGVzeW5jIE9uIFNob3QiOjIsIlJpZ2h0IExpbWl0Ijo0NywiWWF3IE1vZGlmaWVyIjoxfSwiTW92aW5nIjp7IkxlZnQgTGltaXQiOjAsIkZha2UgTGltaXQgVHlwZSI6MCwiWWF3IEFkZCBSaWdodCI6MCwiT3ZlcnJpZGUiOmZhbHNlLCJMQlkgTW9kZSI6MCwiRmFrZSBPcHRpb25zIjowLCJNb2RpZmllciBEZWdyZWUiOjAsIkRpc2FibGUgQW50aS1CcnV0ZWZvcmNlIjpmYWxzZSwiWWF3IEFkZCBMZWZ0IjowLCJGcmVlc3RhbmRpbmcgRGVzeW5jIjowLCJEZXN5bmMgT24gU2hvdCI6MCwiUmlnaHQgTGltaXQiOjAsIllhdyBNb2RpZmllciI6MH0sIkFudGktQWltIjp7IllhdyBCYXNlIjo0LCJSb2xsIG9uIE1hbnVhbHMiOmZhbHNlLCJDb25kaXRpb25zIjp0cnVlLCJBbnRpLUFpbSBvbiBVc2UiOnRydWUsIkFudGktQmFja3N0YWIiOnRydWUsIlJvbGwgTGVmdCI6LTQ1LCJSb2xsIFJpZ2h0Ijo0NSwiRW5hYmxlIEFudGktQWltIjp0cnVlLCJUYWIiOjAsIlJvbGwgQW50aS1BaW0iOmZhbHNlfSwiQW5pbWF0aW9ucyI6eyJTdGF0aWMgQWlyIExlZ3MiOnRydWUsIlBpdGNoIG9uIExhbmQiOmZhbHNlLCJTdGF0aWMgTGFuZGluZyBMZWdzIjp0cnVlfSwiQW50aS1CcnV0ZWZvcmNlIjp7IkVuYWJsZSBBbnRpLUJydXRlZm9yY2UiOnRydWUsIlBoYXNlcyBDb3VudCI6Mn0sIlJvbGwiOnsiTGVmdCBMaW1pdCI6NjAsIkZha2UgTGltaXQgVHlwZSI6MCwiWWF3IEFkZCBSaWdodCI6MCwiT3ZlcnJpZGUiOnRydWUsIkxCWSBNb2RlIjowLCJGYWtlIE9wdGlvbnMiOjAsIk1vZGlmaWVyIERlZ3JlZSI6MCwiRGlzYWJsZSBBbnRpLUJydXRlZm9yY2UiOnRydWUsIllhdyBBZGQgTGVmdCI6MCwiRnJlZXN0YW5kaW5nIERlc3luYyI6MCwiRGVzeW5jIE9uIFNob3QiOjEsIlJpZ2h0IExpbWl0Ijo2MCwiWWF3IE1vZGlmaWVyIjowfX19"

configs.data = {}

configs.update = function()
    for tab_name, tab in pairs(menu) do
        configs.data[tab_name] = {}
        for global_item_name, tab2 in pairs(tab) do
            configs.data[tab_name][global_item_name] = {}
            for item_name, item in pairs(tab2) do
                local value = item:Get()

                -- @note: крутой метод получения макак
                if type(value) == 'userdata' then
                    local color = item:Get()

                    value = {color.r, color.g, color.b, color.a}
                end

                configs.data[tab_name][global_item_name][item_name] = value
            end
        end
    end
end

configs.load = function(values)
    if values == nil then
        Cheat.AddEvent("Something went wrong... Check the config data again")
        uwu.print('{0.54, 0.83, 1}[Aarne.club] {1, 1, 1}Something went wrong... Check the {0.78, 1, 0}config data {1, 1, 1}again \n')
        return
    end

    for tab_name, tab in pairs(menu) do
        for global_item_name, tab2 in pairs(tab) do
            for item_name, item in pairs(tab2) do
                local value = values[tab_name]

                if value == nil then
                    --print('[Error] tab_name ' .. tab_name)
                    goto skip
                end

                value = values[tab_name][global_item_name]

                if value == nil then
                    --print('[Error] global_item_name ' .. global_item_name)
                    goto skip
                end

                value = values[tab_name][global_item_name][item_name]

                if value == nil then
                    local error_log = ('Failed to load config for (%s) children item of (%s) item'):format(item_name, global_item_name)

                    Cheat.AddEvent(error_log)
                    uwu.print(('{0.54, 0.83, 1}[Aarne.club] {1, 1, 1}Failed to load config for {0.78, 1, 0}%s {1, 1, 1}children item of {0.78, 1, 0}%s {1, 1, 1}item \n'):format(item_name, global_item_name))

                    goto skip
                end

                if type(value) == 'table' then
                    value = Color.new(unpack(value))
                end

                --print(tab_name, global_item_name, item_name, value)

                menu[tab_name][global_item_name][item_name]:Set(value)
                ::skip::
            end
        end
    end

    max_misses.update_menu()
    fakelag.update_menu()
    radar.on_click()
    aimbot.update_menu()
    global.update_menu()
    arrows.update_menu()
    antiaim.update_menu()
    scope_line.update_menu()
    hitsound.update_menu()
    hitmarker.update_menu()
    teleport.update_menu()
    antiaim.antibruteforce.MenuVisible()

    Cheat.AddEvent('Config successfully loaded!')
    uwu.print('{0.54, 0.83, 1}[Aarne.club] {1, 1, 1}Config {0.78, 1, 0}successfully {1, 1, 1}loaded!\n')
end





configs.url = 'https://625c894695cd5855d6139e9b.mockapi.io/api/v1/config/'

configs.create_config = function(config_password, config_name, config_data)
    http.request(configs.url, {
        type = 'POST',
        data = {
            config_password = config_password,
            config_name = config_name,
            config_data = config_data,
        }
    })
end

configs.delete_config = function(id)
    http.request(configs.url .. id, {type = 'DELETE'})
end

configs.all_configs = {}
configs.my_configs = {}

configs.parse_configs = function()
    configs.all_configs = {}

    local parse_configs = json.parse(Http.Get(configs.url))

    if type(parse_configs) ~= 'table' or #parse_configs < 1 then
        return
    end

    for i, next_config_data in ipairs(parse_configs) do
        for key, data in pairs(next_config_data) do
            configs.all_configs[tostring(next_config_data.config_name)] = {
                id = next_config_data.id,
                config_data = next_config_data.config_data,
                config_password = next_config_data.config_password,
            }
        end
    end
end

configs.parse_configs()

configs.ui = {}

configs.ui.name = Menu.TextBox(tabs.config, 'Create', 'Config Name', 64, '')
configs.ui.password = Menu.TextBox(tabs.config, 'Create', 'Config Password', 64, '', 'You need to set a password for further access to delete the config.')
configs.ui.upload = Menu.Button(tabs.config, 'Create', 'Upload Config', '')

configs.ui.configs = Menu.Combo(tabs.config, 'Cloud', 'Configs', {'no configs :('}, 0)
configs.ui.access_password = Menu.TextBox(tabs.config, 'Cloud', 'Config Password', 64, '', 'Enter the password for the config to access the delete.')
configs.ui.update_configs = Menu.Button(tabs.config, 'Cloud', 'Update List', '')
configs.ui.load = Menu.Button(tabs.config, 'Cloud', 'Load Config', '')
configs.ui.delete = Menu.Button(tabs.config, 'Cloud', 'Delete Config', '')

configs.update_configs_list = function()
    configs.parse_configs()

    local config_names = table.keys(configs.all_configs)

    if (#config_names < 1) then
        config_names = {'no configs :('}
    end

    configs.ui.configs:UpdateList(config_names)
    Cheat.AddEvent('Config list successfully updated!')
end

configs.update_configs_list()

configs.ui.update_configs:RegisterCallback(configs.update_configs_list)

configs.upload = function()
    local config_names = table.keys(configs.all_configs)

    configs.update()

    local response = json.encode(configs.data)
    local encoded_config = base64.encode(response)

    local config_password = configs.ui.password:Get()
    local config_name = configs.ui.name:Get()
    local config_data = encoded_config

    if table.find(config_names, config_name) then
        Cheat.AddEvent('This name already exists.')
        return
    end

    configs.create_config(config_password, config_name, config_data)
    Cheat.AddEvent('Config successfully uploaded!')

    configs.update_configs_list()
end

configs.ui.upload:RegisterCallback(configs.upload)

configs.delete_my_config = function()
    local config_index = configs.ui.configs:Get()
    local config_names = table.keys(configs.all_configs)
    local config_name = config_names[config_index + 1]
    local config_password = configs.ui.access_password:Get()

    if not configs.all_configs[config_name] then
        Cheat.AddEvent('This config does not exist.')
        return
    end

    local config_data = configs.all_configs[config_name]

    if not (config_data.config_password == config_password) then
        Cheat.AddEvent('Wrong config password.')
        return
    end

    configs.delete_config(config_data.id)
    Cheat.AddEvent('Config successfully deleted!')

    configs.update_configs_list()
end

configs.ui.delete:RegisterCallback(configs.delete_my_config)

configs.load_config = function()
    local config_index = configs.ui.configs:Get()
    local config_names = table.keys(configs.all_configs)
    local config_name = config_names[config_index + 1]

    if not configs.all_configs[config_name] then
        Cheat.AddEvent('This config does not exist.')
        return
    end

    local config_data = configs.all_configs[config_name].config_data
    local decoded_config_data = base64.decode(config_data)
    local json_to_table = json.parse(decoded_config_data)

    configs.load(json_to_table)
end

configs.ui.load:RegisterCallback(configs.load_config)




Menu.Button(tabs.config, 'Recommendations', 'Discord Server', '', function()
    Panorama.Open().SteamOverlayAPI.OpenExternalBrowserURL('https://discord.gg/tSjcsbmMFF')
end)

Menu.Button(tabs.config, 'Recommendations', 'NL Config', '', function()
    Panorama.Open().SteamOverlayAPI.OpenExternalBrowserURL('https://en.neverlose.cc/market/item?id=VKC48g')
end)

Menu.Button(tabs.config, 'Recommendations', 'Solus UI', '', function()
    Panorama.Open().SteamOverlayAPI.OpenExternalBrowserURL('https://en.neverlose.cc/market/item?id=XjP7t5')
end)

local callbacks = {}

callbacks.on_prediction = function(cmd)
    animation_breaker.handle_prediction(cmd)
    aimbot.on_prediction(cmd)
    global hitchance()
    antiaim.on_prediction()
    antiaim.allow_on_use()
    teleport.on_prediction()
    antiaim.roll(cmd)
    playerlist:on_prediction()
    max_misses.on_prediction()
end

callbacks.on_createmove = function(cmd)
    animation_breaker.handle_cmove()
    antiaim.roll_movement(cmd)
end

callbacks.on_evets = function(event)
    antiaim.antibruteforce.on_event(event)
    hitmarker.on_hurt(event)
    trashtalk.on_kill(event)
    hitlogs.on_hurt(event)
    hitlogs reset(event)
    hitsound.on_hurt(event)
    max_misses.reset_data(event)
end

callbacks.on_draw = function()
    scope_line.on_draw()
    hitmarker.on_draw()
    snaplines.on_draw()
    molotov.on_draw()
    hitlogs.on_draw()
    arrows.on_draw()
    binds.on_draw()
    sloweddown.on_draw:update()
    min_damage.on_draw()
    clantag.on_draw()
end

callbacks.on_destroy = function()
    animation_breaker.on_destroy()
    molotov.on_destroy()
    clantag.destroy()
end

callbacks.on_registered_shot = function(shot)
    hitlogs.on_registered_shot(shot)
    max_misses.on_registered_shot(shot)
end

callbacks.on_ragebot = function(shot)
    hitlogs.on_ragebot(shot)
end

Cheat.RegisterCallback("draw", callbacks.on_draw)
Cheat.RegisterCallback("events", callbacks.on_evets)
Cheat.RegisterCallback("destroy", callbacks.on_destroy)
Cheat.RegisterCallback("prediction", callbacks.on_prediction)
Cheat.RegisterCallback("createmove", callbacks.on_createmove)
Cheat.RegisterCallback("ragebot_shot", callbacks.on_ragebot)
Cheat.RegisterCallback("registered_shot", callbacks.on_registered_shot)
Delete it ffs been posted so May Fucking time this is Insane
 
Забаненный
Статус
Оффлайн
Регистрация
5 Июн 2020
Сообщения
569
Реакции[?]
131
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Пользователь
Статус
Оффлайн
Регистрация
28 Фев 2018
Сообщения
430
Реакции[?]
94
Поинты[?]
10K
Пользователь
Статус
Оффлайн
Регистрация
28 Фев 2018
Сообщения
430
Реакции[?]
94
Поинты[?]
10K
Сверху Снизу