local vector = require ('vector') local http = require ('gamesense/http') local pui = require ('gamesense/pui') local base64 = require ('gamesense/base64') local clipboard = require ('gamesense/clipboard') local aa_func = require ('gamesense/antiaim_funcs') local trace = require ('gamesense/trace') local csgo_weapons = require ('gamesense/csgo_weapons') local steamworks = require ('gamesense/steamworks') local localize = require ('gamesense/localize') local chat = require ('gamesense/chat') local bit = require("bit") local ffi = require('ffi', 'Failed to require FFI, please make sure Allow unsafe scripts is enabled!') local c_entity = require('gamesense/entity') local get_client_entity = vtable_bind("client_panorama.dll", "VClientEntityList003", 3, "void*(__thiscall*)(void*,int)") local is_weapon = vtable_thunk(166, "bool(__thiscall*)(void*)") local get_inaccuracy = vtable_thunk(483, "float(__thiscall*)(void*)") local lua = {name = 'Ultherapy',build = 'Luxury',username = _G.ULATHERAPY_CLOUD_USERNAME or 'ROOT',update = '08.12.2025'} local function is_in_game() local local_player = entity.get_local_player() return local_player and entity.is_alive(local_player) and not entity.is_dormant(local_player) end local exploits=(function()local classes={ }function class(name)return function(tab)if not tab then return classes[name]end tab.__index,tab.__classname=tab,name if tab.call then tab.__call=tab.call end setmetatable(tab,tab)classes[name],_G[name]=tab,tab return tab end end local g_ctx={local_player=nil,weapon=nil,aimbot=ui.reference("RAGE","Aimbot","Enabled"),doubletap={ui.reference("RAGE","Aimbot","Double tap")},hideshots={ui.reference("AA","Other","On shot anti-aim")},fakeduck=ui.reference("RAGE","Other","Duck peek assist")}local clamp=function(value,min,max)return math.min(math.max(value,min),max)end class"exploits"{max_process_ticks=(math.abs(client.get_cvar("sv_maxusrcmdprocessticks")or 16)-1),tickbase_difference=0,ticks_processed=0,command_number=0,choked_commands=0,need_force_defensive=false,current_shift_amount=0,reset_vars=function(self)self.ticks_processed=0 self.tickbase_difference=0 self.choked_commands=0 self.command_number=0 end,store_vars=function(self,ctx)self.command_number=ctx.command_number or 0 self.choked_commands=ctx.chokedcommands or 0 end,store_tickbase_difference=function(self,ctx)if ctx.command_number==self.command_number then local tickbase=entity.get_prop(g_ctx.local_player,"m_nTickBase")or 0 self.ticks_processed=clamp(math.abs(tickbase-(self.tickbase_difference or 0)),0,(self.max_process_ticks or 0)-(self.choked_commands or 0))self.tickbase_difference=math.max(tickbase,self.tickbase_difference or 0)self.command_number=0 end end,is_doubletap=function(self)return ui.get(g_ctx.doubletap[2])end,is_hideshots=function(self)return ui.get(g_ctx.hideshots[2])end,is_active=function(self)return self:is_doubletap()or self:is_hideshots()end,in_defensive=function(self,max)max=max or self.max_process_ticks return self:is_active()and(self.ticks_processed>1 and self.ticks_processed=0 and self.ticks_processed<=5)and(self.tickbase_difference or 0)>0)end,is_lagcomp_broken=function(self)local tickbase=entity.get_prop(g_ctx.local_player,"m_nTickBase")or 0 return not self:is_defensive_ended()or(self.tickbase_difference or 0)min_shift_amount and current_shift_amount(min_shift_amount/2)and current_shift_amount<(max_shift_amount/2)end end,should_force_defensive=function(self,state)if not self:is_active()then return false end self.need_force_defensive=state and self:is_defensive_ended()end,charge_ticks=14,charge_timer=globals.tickcount(),allow_unsafe_charge=function(self,state)if not(self:is_active()--[[and self:can_recharge()]])then self.charge_timer=globals.tickcount()ui.set(g_ctx.aimbot,true)return end if not state then self.charge_timer=globals.tickcount()ui.set(g_ctx.aimbot,true)return end if ui.get(g_ctx.fakeduck)then ui.set(g_ctx.aimbot,true)return end if globals.tickcount()>=self.charge_timer+self.charge_ticks then ui.set(g_ctx.aimbot,true)else ui.set(g_ctx.aimbot,false)end end,force_reload_exploits=function(self,state)if not state then ui.set(g_ctx.doubletap[1],true)ui.set(g_ctx.hideshots[1],true)return end if self:is_doubletap()and not self:in_recharge()then ui.set(g_ctx.doubletap[1],false)else ui.set(g_ctx.doubletap[1],true)end if self:is_hideshots()and not self:in_recharge()then ui.set(g_ctx.hideshots[1],false)else ui.set(g_ctx.hideshots[1],true)end end}local event_list={on_setup_command=function(ctx)if not(entity.get_local_player()and entity.is_alive(entity.get_local_player())and entity.get_player_weapon(entity.get_local_player()))then return end g_ctx.local_player=entity.get_local_player()g_ctx.weapon=entity.get_player_weapon(g_ctx.local_player)if exploits.need_force_defensive then ctx.force_defensive=true end end,on_run_command=function(ctx)exploits:store_vars(ctx)end,on_predict_command=function(ctx)exploits:store_tickbase_difference(ctx)end,on_player_death=function(ctx)if not(ctx.userid and ctx.attacker)then return end if g_ctx.local_player~=client.userid_to_entindex(ctx.userid)then return end exploits:reset_vars()end,on_level_init=function()exploits:reset_vars()end,on_round_start=function()exploits:reset_vars()end,on_round_end=function()exploits:reset_vars()end,on_shutdown=function()collectgarbage("collect")end}for k,v in next,event_list do client.set_event_callback(k:sub(4),function(ctx)v(ctx)end)end return exploits end)() local reference = { rage = { aimbot = { enabled = { pui.reference('rage', 'aimbot', 'enabled') }, target_hitbox = pui.reference('rage', 'aimbot', 'target hitbox'), minimum_damage = pui.reference('rage', 'aimbot', 'minimum damage'), minimum_damage_override = { pui.reference('rage', 'aimbot', 'minimum damage override') }, minimum_hitchance = pui.reference('rage', 'aimbot', 'minimum hit chance'), double_tap = { pui.reference('rage', 'aimbot', 'double tap') }, double_tap_limit = pui.reference('rage', 'aimbot', 'double tap fake lag limit'), force_body = pui.reference('rage', 'aimbot', 'force body aim'), force_safe = pui.reference('rage', 'aimbot', 'force safe point'), auto_scope = pui.reference('rage', 'aimbot', 'automatic scope') }, other = { quickpeek = { pui.reference('rage', 'other', 'quick peek assist') }, quickpeek_assist_mode = { pui.reference('rage', 'other', 'quick peek assist mode') }, quickpeek_assist_distance = pui.reference('rage', 'other', 'quick peek assist distance'), fake_duck = pui.reference('rage', 'other', 'duck peek assist'), log_spread = pui.reference('rage', 'other', 'log misses due to spread'), }, ps = { pui.reference('misc', 'miscellaneous', 'ping spike') }, log_hit = pui.reference('misc', 'miscellaneous', 'log damage dealt'), log_purchases = pui.reference('misc', 'miscellaneous', 'log weapon purchases') }, antiaim = { angles = { enabled = pui.reference('aa', 'anti-aimbot angles', 'enabled'), pitch = { pui.reference('aa', 'anti-aimbot angles', 'pitch') }, yaw = { pui.reference('aa', 'anti-aimbot angles', 'yaw') }, yaw_base = pui.reference('aa', 'anti-aimbot angles', 'yaw base'), yaw_jitter = { pui.reference('aa', 'anti-aimbot angles', 'yaw jitter') }, body_yaw = { pui.reference('aa', 'anti-aimbot angles', 'body yaw') }, fs_body_yaw = pui.reference('aa', 'anti-aimbot angles', 'freestanding body yaw'), edge_yaw = pui.reference('aa', 'anti-aimbot angles', 'edge yaw'), freestanding = { pui.reference('aa', 'anti-aimbot angles', 'freestanding') }, roll = pui.reference('aa', 'anti-aimbot angles', 'roll') }, fakelag = { enabled = pui.reference('aa', 'fake lag', 'enabled'), amount = pui.reference('aa', 'fake lag', 'amount'), variance = pui.reference('aa', 'fake lag', 'variance'), limit = pui.reference('aa', 'fake lag', 'limit'), sv = pui.reference('MISC', 'Settings', 'sv_maxusrcmdprocessticks2') }, other = { on_shot_anti_aim = { pui.reference('aa', 'other', 'on shot anti-aim') }, slow_motion = { pui.reference('aa', 'other', 'slow motion') }, fake_peek = { pui.reference('aa', 'other', 'fake peek') }, leg_movement = pui.reference('aa', 'other', 'leg movement') } }, visuals = { scope = pui.reference('visuals', 'effects', 'remove scope overlay'), thirdperson = pui.reference('visuals', 'effects', 'force third person (alive)') }, misc = { miscellaneous = { override_zoom_fov = pui.reference('misc', 'miscellaneous', 'override zoom fov'), draw_console_output = pui.reference('misc', 'miscellaneous', 'draw console output') }, settings = { menu_color = pui.reference('misc', 'settings', 'menu color'), anti_untrusted = pui.reference('misc', 'settings', 'anti-untrusted') }, movement = { air_strafe = pui.reference('misc', 'movement', 'air strafe') } }, playerlist = { players = pui.reference('Players', 'Players', 'Player list'), force_body = pui.reference('Players', 'Adjustments', 'Force body yaw'), force_body_value = pui.reference('Players', 'Adjustments', 'Force body yaw value'), reset = pui.reference('Players', 'Players', 'Reset all') } } do defer(function () pui.traverse(reference, function (ref) ref:override() ref:set_enabled(true) if ref.hotkey then ref.hotkey:set_enabled(true) end end) end) end local anim = {} function anim.new(current, target, speed) return current + (target - current) * (globals.frametime() * speed) end local LoadingAnimation = {start_time = globals.realtime(),check = false,alpha = 0} function LoadingAnimation:update() local sx, sy = client.screen_size() if self.start_time + 3 < globals.realtime() then self.check = true end self.alpha = anim.new(self.alpha, self.check and 0 or 1, 3) end function LoadingAnimation:draw() if self.alpha <= 0.01 then return end local sx, sy = client.screen_size() renderer.blur(0, 0, sx * self.alpha, sy) renderer.rectangle(0, 0, sx * self.alpha, sy, 31, 31, 31, 100 * self.alpha) local text1 = "Ultherapy™" local text2 = "<-LUXURY PROJECT->" local w1, h1 = renderer.measure_text('+', text1) local w2, h2 = renderer.measure_text('-', text2) renderer.text(sx/2 - math.floor(w1/2 * self.alpha), sy/2 - h1/2, 255, 255, 255, 255 * self.alpha, '+', 0, text1) renderer.text(sx/2 - math.floor(w2/2 * self.alpha) + w1/2 + 10, sy/2 - h2/2 + 30, 255, 105, 105, 255 * self.alpha, '-', 0, text2) end local function on_paint_ui() LoadingAnimation:update() LoadingAnimation:draw() end local function initialize() client.set_event_callback('paint_ui', on_paint_ui) end initialize() local animations = { } local function lerp (name, target_value, speed, tolerance, easing_style) if animations[name] == nil then animations[name] = target_value end speed = speed or 8 tolerance = tolerance or 0.005 easing_style = easing_style or 'linear' local current_value = animations[name] local delta = globals.absoluteframetime() * speed local new_value if easing_style == 'linear' then new_value = current_value + (target_value - current_value) * delta elseif easing_style == 'smooth' then new_value = current_value + (target_value - current_value) * (delta * delta * (3 - 2 * delta)) elseif easing_style == 'ease_in' then new_value = current_value + (target_value - current_value) * (delta * delta) elseif easing_style == 'ease_out' then local progress = 1 - (1 - delta) * (1 - delta) new_value = current_value + (target_value - current_value) * progress elseif easing_style == 'ease_in_out' then local progress = delta < 0.5 and 2 * delta * delta or 1 - math.pow(-2 * delta + 2, 2) / 2 new_value = current_value + (target_value - current_value) * progress else new_value = current_value + (target_value - current_value) * delta end if math.abs(target_value - new_value) <= tolerance then animations[name] = target_value else animations[name] = new_value end return animations[name] end local coloring = { } coloring.rgba_to_hex = function (r, g, b, a) return string.format('%.2x%.2x%.2x%.2x', r, g, b, a):upper() end coloring.accent = coloring.rgba_to_hex(reference.misc.settings.menu_color:get()) coloring.reset = '9D9D9DFF' coloring.default = 'CDCDCDFF' coloring.init = function () local r, g, b, a = reference.misc.settings.menu_color:get() coloring.accent = coloring.rgba_to_hex(r, g, b, a) return coloring.accent end coloring.set_color_macro = function (use_reset, alpha) if use_reset then return coloring.reset end local r, g, b, a = reference.misc.settings.menu_color:get() if alpha ~= nil and alpha >= 0 and alpha <= 255 then return string.format('%.2x%.2x%.2x%.2x', r, g, b, alpha):upper() else return coloring.rgba_to_hex(r, g, b, a) end end local function lazy_lerp (a, b, t) return a + (b - a) * (t * t * (3 - 2 * t)) end local function lerp_color (c1, c2, t) return { r = lazy_lerp(c1.r, c2.r, t), g = lazy_lerp(c1.g, c2.g, t), b = lazy_lerp(c1.b, c2.b, t), a = lazy_lerp(c1.a, c2.a, t) } end local cached_colors = { } local last_cache_time = -1 local function prepare_gradient_cache (speed, col1_start, col1_end, col2_start, col2_end, vertical, w, h) local time = globals.realtime() * speed * 0.2 local steps = 16 local single_mode = not (w and h) if not single_mode then steps = vertical and h or w end if cached_colors.steps == steps and cached_colors.single_mode == single_mode and math.abs(time - last_cache_time) < 0.02 then return cached_colors.data end last_cache_time = time cached_colors.steps = steps cached_colors.single_mode = single_mode cached_colors.data = { } if single_mode then local t1 = (math.sin(time * 0.5) + 1) * 0.5 local t2 = (math.cos(time * 0.5) + 1) * 0.5 local c_a = lerp_color(col1_start, col1_end, t1) local c_b = lerp_color(col2_start, col2_end, t2) local blend_t = (math.sin(time) + 1) * 0.5 local final_color = lerp_color(c_a, c_b, blend_t) cached_colors.data = final_color else for i = 0, steps do local offset = steps > 0 and (i / steps) or 0 local t1 = (math.sin(time * 0.5 + offset * math.pi * 2) + 1) * 0.5 local t2 = (math.cos(time * 0.5 + offset * math.pi * 2) + 1) * 0.5 local c_a = lerp_color(col1_start, col1_end, t1) local c_b = lerp_color(col2_start, col2_end, t2) local blend_t = (math.sin(time + offset * math.pi) + 1) * 0.5 local final_color = lerp_color(c_a, c_b, blend_t) cached_colors.data[i] = final_color end end return cached_colors.data end local function draw_animated_gradient (x, y, w, h, speed, col1_start, col1_end, col2_start, col2_end, vertical, direction_up) local steps = vertical and h or w local colors = prepare_gradient_cache(speed, col1_start, col1_end, col2_start, col2_end, vertical, w, h) local step_size = 2 for i = 0, steps, step_size do local color = colors[i] or colors[#colors] local r, g, b, a = color.r, color.g, color.b, color.a if vertical then local draw_y = direction_up and (y + (h - i)) or (y + i) renderer.rectangle(x, draw_y, w, step_size, r, g, b, a) else local draw_x = direction_up and (x + (w - i)) or (x + i) renderer.rectangle(draw_x, y, step_size, h, r, g, b, a) end end end local function draw_gradient_text (x, y, flags, max_width, text, speed, col1_start, col1_end, col2_start, col2_end) local time = globals.realtime() * speed * 0.2 local text_len = #text if text_len == 0 then return x end local final_text = { } final_text[#final_text + 1] = '' local time_sin = time * 0.5 local time_cos = time * 0.5 local base_sin = math.sin(time) for i = 1, text_len do local char = text:sub(i, i) local offset = (i - 1) / text_len local t1 = (math.sin(time_sin + offset * math.pi * 2) + 1) * 0.5 local t2 = (math.cos(time_cos + offset * math.pi * 2) + 1) * 0.5 local c_a = lerp_color(col1_start, col1_end, t1) local c_b = lerp_color(col2_start, col2_end, t2) local blend_t = (math.sin(time + offset * math.pi) + 1) * 0.5 local final_color = lerp_color(c_a, c_b, blend_t) local hex_color = coloring.rgba_to_hex( final_color.r + 0.5, final_color.g + 0.5, final_color.b + 0.5, final_color.a + 0.5 ) final_text[#final_text + 1] = '\a' final_text[#final_text + 1] = hex_color final_text[#final_text + 1] = char end local rendered_text = table.concat(final_text) renderer.text(x, y, 255, 255, 255, col1_start.a, flags, max_width, rendered_text) local w, _ = renderer.measure_text(flags, rendered_text) return x + w end local is_on_ground = false do local pre, post = 0, 0 local function on_setup_command () local me = entity.get_local_player() if not me or not entity.is_alive(me) then return end pre = entity.get_prop(me, 'm_fFlags') end local function on_run_command () local me = entity.get_local_player() if not me or not entity.is_alive(me) then return end post = entity.get_prop(me, 'm_fFlags') is_on_ground = bit.band(pre, 1) == 1 and bit.band(post, 1) == 1 end client.set_event_callback('setup_command', on_setup_command) client.set_event_callback('run_command', on_run_command) end local ticks = 0 local helpers = { rounded_rectangle = function (x, y, w, h, rounding, r, g, b, a, gradient_colors) y = y + rounding gradient_colors = gradient_colors or { use_gradient = false } local data_circle = { {x + rounding, y, 180}, {x + w - rounding, y, 90}, {x + rounding, y + h - rounding * 2, 270}, {x + w - rounding, y + h - rounding * 2, 0} } local data = { {x + rounding, y, w - rounding * 2, h - rounding * 2}, {x + rounding, y - rounding, w - rounding * 2, rounding}, {x + rounding, y + h - rounding * 2, w - rounding * 2, rounding}, {x, y, rounding, h - rounding * 2}, {x + w - rounding, y, rounding, h - rounding * 2} } for _, data in next, data_circle do if gradient_colors.use_gradient then local t1 = (math.sin(globals.realtime() * 25 * 0.2 * 0.5 + data[3] * math.pi * 2) + 1) / 2 local t2 = (math.sin(globals.realtime() * 25 * 0.2 * 0.5 + data[3] * math.pi * 2) + 1) / 2 local c_a = lerp_color(gradient_colors.col1_start, gradient_colors.col1_end, t1) local c_b = lerp_color(gradient_colors.col2_start, gradient_colors.col2_end, t2) local blend_t = (math.sin(25 + 50 * math.pi) + 1) / 2 local final_color = lerp_color(c_a, c_b, blend_t) renderer.circle(data[1], data[2], final_color.r, final_color.g, final_color.b, final_color.a, rounding, data[3], 0.25) else renderer.circle(data[1], data[2], r, g, b, a, rounding, data[3], 0.25) end end for _, data in next, data do if gradient_colors.use_gradient then draw_animated_gradient(data[1], data[2], data[3], data[4], 25, gradient_colors.col1_start, gradient_colors.col1_end, gradient_colors.col2_start, gradient_colors.col2_end, false ) else renderer.rectangle(data[1], data[2], data[3], data[4], r, g, b, a) end end end, semi_outlined_rectangle = function (x, y, w, h, rounding, thickness, gradient_colors, reverse) reverse = reverse or false rounding = math.min(rounding, w / 2, h / 2) if reverse then y = y - rounding + 1 else y = y + rounding end local data_circle = { {x + rounding, y + (reverse and 0 or h - rounding + 1), reverse and 180 or 90}, {x + w - rounding, y + (reverse and 0 or h - rounding + 1), reverse and 270 or 0} } local data = { {x + rounding, y + (reverse and -rounding or h - thickness + 1), w - rounding * 2, thickness}, } local base = gradient_colors.col1_start local color_cache if gradient_colors.use_gradient then color_cache = prepare_gradient_cache(25, gradient_colors.col1_start, gradient_colors.col1_end, gradient_colors.col2_start, gradient_colors.col2_end, false, w, 1 ) end for _, circle in pairs(data_circle) do if gradient_colors.use_gradient then local offset = (circle[1] - x) / w local step_index = math.floor(offset * w) local final_color = color_cache[step_index] or base renderer.circle_outline(circle[1], circle[2], final_color.r, final_color.g, final_color.b, final_color.a, rounding, circle[3], 0.25, thickness) else renderer.circle_outline(circle[1], circle[2], base.r, base.g, base.b, base.a, rounding, circle[3], 0.25, thickness) end end for _, rect in pairs(data) do if gradient_colors.use_gradient then draw_animated_gradient(rect[1], rect[2], rect[3], rect[4], 25, gradient_colors.col1_start, gradient_colors.col1_end, gradient_colors.col2_start, gradient_colors.col2_end, false ) else renderer.rectangle(rect[1], rect[2], rect[3], rect[4], base.r, base.g, base.b, base.a) end end local gradient_y = reverse and y - (h - rounding - thickness - 20) or y + thickness + 9 local gradient_height = h - rounding - thickness - 20 if gradient_colors.use_gradient then if reverse then local color = prepare_gradient_cache(25, {r = gradient_colors.col1_start.r, g = gradient_colors.col1_start.g, b = gradient_colors.col1_start.b, a = 0}, {r = gradient_colors.col1_end.r, g = gradient_colors.col1_end.g, b = gradient_colors.col1_end.b, a = 0}, {r = gradient_colors.col2_start.r, g = gradient_colors.col2_start.g, b = gradient_colors.col2_start.b, a = gradient_colors.col2_start.a}, {r = gradient_colors.col2_end.r, g = gradient_colors.col2_end.g, b = gradient_colors.col2_end.b, a = gradient_colors.col2_end.a}, true ) renderer.gradient(x, gradient_y, thickness, gradient_height, color.r, color.g, color.b, 0, color.r, color.g, color.b, base.a, false) renderer.gradient(x + w - thickness, gradient_y, thickness, gradient_height, color.r, color.g, color.b, 0, color.r, color.g, color.b, base.a, false) else local color = prepare_gradient_cache(25, {r = gradient_colors.col1_start.r, g = gradient_colors.col1_start.g, b = gradient_colors.col1_start.b, a = gradient_colors.col1_start.a}, {r = gradient_colors.col1_end.r, g = gradient_colors.col1_end.g, b = gradient_colors.col1_end.b, a = gradient_colors.col1_end.a}, {r = gradient_colors.col2_start.r, g = gradient_colors.col2_start.g, b = gradient_colors.col2_start.b, a = 0}, {r = gradient_colors.col2_end.r, g = gradient_colors.col2_end.g, b = gradient_colors.col2_end.b, a = 0}, true ) renderer.gradient(x, gradient_y, thickness, gradient_height, color.r, color.g, color.b, base.a, color.r, color.g, color.b, 0, false) renderer.gradient(x + w - thickness, gradient_y, thickness, gradient_height, color.r, color.g, color.b, base.a, color.r, color.g, color.b, 0, false) end else if reverse then renderer.gradient(x, gradient_y, thickness, gradient_height, base.r, base.g, base.b, 0, base.r, base.g, base.b, base.a, false) renderer.gradient(x + w - thickness, gradient_y, thickness, gradient_height, base.r, base.g, base.b, 0, base.r, base.g, base.b, base.a, false) else renderer.gradient(x, gradient_y, thickness, gradient_height, base.r, base.g, base.b, base.a, base.r, base.g, base.b, 0, false) renderer.gradient(x + w - thickness, gradient_y, thickness, gradient_height, base.r, base.g, base.b, base.a, base.r, base.g, base.b, 0, false) end end end, rounded_outlined_rectangle = function (x, y, w, h, rounding, thickness, r, g, b, a) y = y + rounding local data_circle = { {x + rounding, y, 180}, {x + w - rounding, y, 270}, {x + rounding, y + h - rounding * 2, 90}, {x + w - rounding, y + h - rounding * 2, 0} } local data = { {x + rounding, y - rounding, w - rounding * 2, thickness}, {x + rounding, y + h - rounding - thickness, w - rounding * 2, thickness}, {x, y, thickness, h - rounding * 2}, {x + w - thickness, y, thickness, h - rounding * 2} } for _, data in next, data_circle do renderer.circle_outline(data[1], data[2], r, g, b, a, rounding, data[3], 0.25, thickness) end for _, data in next, data do renderer.rectangle(data[1], data[2], data[3], data[4], r, g, b, a) end end, get_state = function () local me = entity.get_local_player() if not entity.is_alive(me) then return 'Global' end local vel = {entity.get_prop(me, 'm_vecVelocity')} local velocity = vector(vel[1] or 0, vel[2] or 0, 0) local speed = velocity:length2d() local ground_entity = entity.get_prop(me, 'm_hGroundEntity') local is_on_player = ground_entity ~= 0 and entity.get_classname(ground_entity) == 'CCSPlayer' ticks = (ground_entity == 0) and (ticks + 1) or 0 if is_on_player then is_on_ground = true end if not is_on_ground then return (entity.get_prop(me, 'm_flDuckAmount') == 1) and 'Air+' or 'Air' end if is_on_ground and (entity.get_prop(me, 'm_flDuckAmount') == 1 or reference.rage.other.fake_duck:get()) then return (speed > 10) and 'Sneak' or 'Crouch' end return (speed > 10) and (reference.antiaim.other.slow_motion[1].hotkey:get() and 'Walk' or 'Run') or 'Stand' end, get_freestand_direction = function (player) local data = { side = 1, last_side = 0, last_hit = 0, hit_side = 0 } if not player or entity.get_prop(player, 'm_lifeState') ~= 0 then return end if data.hit_side ~= 0 and globals.curtime() - data.last_hit > 5 then data.last_side = 0 data.last_hit = 0 data.hit_side = 0 end local eye = vector(client.eye_position()) local ang = vector(client.camera_angles()) local trace_data = {left = 0, right = 0} for i = ang.y - 120, ang.y + 120, 30 do if i ~= ang.y then local rad = math.rad(i) local px, py, pz = eye.x + 256 * math.cos(rad), eye.y + 256 * math.sin(rad), eye.z local fraction = client.trace_line(player, eye.x, eye.y, eye.z, px, py, pz) local side = i < ang.y and 'left' or 'right' trace_data[side] = trace_data[side] + fraction end end data.side = trace_data.left < trace_data.right and -1 or 1 if data.side == data.last_side then return end data.last_side = data.side if data.hit_side ~= 0 then data.side = data.hit_side end return data.side end } function helpers:clamp (value, min, max) return math.max(min, math.min(value, max)) end local function table_contains (tbl, val) for _, v in ipairs(tbl) do if v == val then return true end end return false end local function screen_size_x () return select(1, client.screen_size()) or 1920 end local function screen_size_y () return select(2, client.screen_size()) or 1080 end local drag_system = { elements = { }, dragging = nil, drag_start_pos = { x = 0, y = 0 }, last_alpha = 0, guide_alpha = 0, dot_alpha = 0, animate_menu = 0 } function drag_system:get_width() local w = self.element.w return type(w) == 'function' and w() or w end function drag_system:get_height() local h = self.element.h return type(h) == 'function' and h() or h end function drag_system.new (name, x_slider, y_slider, default_x, default_y, drag_axes, options) local self = setmetatable({ }, { __index = drag_system }) self.name = name self.x_slider = x_slider self.y_slider = y_slider self.element = { default_x = default_x, default_y = default_y, w = options and (options.w or 60) or 60, h = options and (options.h or 20) or 20, align_x = options and options.align_x or 'center', align_y = options and options.align_y or 'center', expand_dir = options and options.expand_dir or 'right' } self.drag_axes = drag_axes:lower() self.options = { show_guides = options and options.show_guides, show_highlight = options and options.show_highlight, show_default_dot = options and options.show_default_dot, align_center = options and options.align_center, show_center_dot = options and options.show_center_dot, snap_distance = options and options.snap_distance, highlight_color = options and options.highlight_color or {150, 150, 150, 80} } self.hover_progress = 0 self.click_progress = 0 self.last_screen_w = screen_size_x() self.last_screen_h = screen_size_y() self.relative_x = x_slider and (x_slider:get() / self.last_screen_w) or (default_x / self.last_screen_w) self.relative_y = y_slider and (y_slider:get() / self.last_screen_h) or (default_y / self.last_screen_h) table.insert(drag_system.elements, self) return self end function drag_system:clamp_position (x, y, screen_w, screen_h, elem_w, elem_h) if self.element.expand_dir == 'left' then x = helpers:clamp(x, elem_w, screen_w) else x = helpers:clamp(x, 0, screen_w - elem_w) end y = helpers:clamp(y, 0, screen_h - elem_h) return x, y end function drag_system:get_pos () local elem_w, elem_h = self:get_width(), self:get_height() local x = self.x_slider and self.x_slider:get() or self.element.default_x local y = self.y_slider and self.y_slider:get() or self.element.default_y if self.element.expand_dir == 'left' then x = x - elem_w elseif not self.x_slider then x = math.floor(x - elem_w / 2 + 1) end if not self.y_slider then y = math.floor(y - elem_h / 2 + 0.5) end return x, y end function drag_system:update (alpha) if not ui.is_menu_open() or alpha < 100 then return end local screen_w, screen_h = screen_size_x(), screen_size_y() local elem_w, elem_h = self:get_width(), self:get_height() if screen_w ~= self.last_screen_w or screen_h ~= self.last_screen_h then if self.x_slider then local new_x = math.floor(self.relative_x * screen_w + 0.5) self.x_slider:set(new_x) end if self.y_slider then local new_y = math.floor(self.relative_y * screen_h + 0.5) self.y_slider:set(new_y) end self.last_screen_w = screen_w self.last_screen_h = screen_h end local x, y = self:get_pos(screen_w, screen_h) local mx, my = ui.mouse_position() local mp_x, mp_y = ui.menu_position() local ms_w, ms_h = ui.menu_size() if mx >= mp_x and mx <= mp_x + ms_w and my >= mp_y and my <= mp_y + ms_h then self.dragging = false drag_system.dragging = false return end if not self.dragging then local current_x = self.x_slider and self.x_slider:get() or self.element.default_x local current_y = self.y_slider and self.y_slider:get() or self.element.default_y local clamped_x, clamped_y = self:clamp_position(current_x, current_y, screen_w, screen_h, elem_w, elem_h) if self.x_slider and clamped_x ~= current_x then self.x_slider:set(clamped_x) self.relative_x = clamped_x / screen_w end if self.y_slider and clamped_y ~= current_y then self.y_slider:set(clamped_y) self.relative_y = clamped_y / screen_h end end local is_hovered = mx >= x and mx <= x + elem_w and my >= y and my <= y + elem_h self.hover_progress = lerp('hover_' .. tostring(self.name), is_hovered and 1 or 0, 10, 0.001, 'ease_out') if client.key_state(0x01) then if not self.dragging and not drag_system.dragging then if is_hovered then self.dragging = true drag_system.dragging = true self.drag_start_pos.x = mx - x self.drag_start_pos.y = my - y self.click_progress = 0 end elseif self.dragging then self.click_progress = lerp('click_' .. tostring(self.name), 1, 10, 0.001, 'ease_out') local new_x = mx - self.drag_start_pos.x local new_y = my - self.drag_start_pos.y local snap = self.options.snap_distance local elem_center_x = new_x + elem_w / 2 local elem_center_y = new_y + elem_h / 2 if self.drag_axes:find('x') and self.x_slider then if self.options.align_center then if math.abs(elem_center_x - screen_w / 2) < snap then new_x = screen_w / 2 - elem_w / 2 end end local target_x = self.element.default_x if self.element.align_x == 'left' then target_x = target_x + elem_w / 2 elseif self.element.align_x == 'right' then target_x = target_x - elem_w / 2 end if math.abs(elem_center_x - target_x) < snap then new_x = self.element.default_x if self.element.align_x == 'left' then new_x = new_x elseif self.element.align_x == 'center' then new_x = new_x - elem_w / 2 elseif self.element.align_x == 'right' then new_x = new_x - elem_w end end if self.element.expand_dir == 'left' then new_x = helpers:clamp(new_x + elem_w, elem_w, screen_w) self.x_slider:set(new_x) else new_x = helpers:clamp(new_x, 0, screen_w - elem_w) self.x_slider:set(new_x) end self.relative_x = self.x_slider:get() / screen_w end if self.drag_axes:find('y') and self.y_slider then if self.options.align_center then if math.abs(elem_center_y - screen_h / 2) < snap then new_y = screen_h / 2 - elem_h / 2 end end local target_y = self.element.default_y if self.element.align_y == 'top' then target_y = target_y + elem_h / 2 elseif self.element.align_y == 'bottom' then target_y = target_y - elem_h / 2 end if math.abs(elem_center_y - target_y) < snap then new_y = self.element.default_y if self.element.align_y == 'top' then new_y = new_y elseif self.element.align_y == 'center' then new_y = new_y - elem_h / 2 elseif self.element.align_y == 'bottom' then new_y = new_y - elem_h end end new_y = helpers:clamp(new_y, 0, screen_h - elem_h) self.y_slider:set(new_y) self.relative_y = self.y_slider:get() / screen_h end end else self.click_progress = lerp('click_' .. tostring(self.name), 0, 10, 0.001, 'ease_out') self.dragging = false drag_system.dragging = false end end function drag_system:draw_guides (alpha) local screen_w, screen_h = screen_size_x(), screen_size_y() local x, y = self:get_pos(screen_w, screen_h) local elem_w, elem_h = self:get_width(), self:get_height() local menu_open_factor = ui.is_menu_open() and 1 or 0 local target_guide_alpha = self.dragging and 255 or 0 self.guide_alpha = lerp('guide_alpha_' .. tostring(self.name), (target_guide_alpha) * menu_open_factor * alpha / 255, 12, 0.01, 'ease_out') local target_dot_alpha = self.dragging and 255 or 0 self.dot_alpha = lerp('dot_alpha_' .. tostring(self.name), (target_dot_alpha) * menu_open_factor * alpha / 255, 12, 0.01, 'ease_out') local target_alpha = self.dragging and 120 or 0 self.last_alpha = lerp('last_alpha_' .. tostring(self.name), (target_alpha) * menu_open_factor * alpha / 255, 8, 0.01, 'ease_out') if self.last_alpha > 1 then renderer.rectangle(0, 0, screen_w, screen_h, 0, 0, 0, self.last_alpha) end if self.options.show_highlight then local hc = self.options.highlight_color local base_alpha = hc[4] local hover_alpha = base_alpha * (0.5 + self.hover_progress * 0.5) local click_alpha = base_alpha * (1 + self.click_progress * 0.3) local final_alpha = hover_alpha + (click_alpha - hover_alpha) * self.click_progress self.animate_menu = lerp('animate_menu_' .. tostring(self.name), (final_alpha) * menu_open_factor * alpha / 255, 11, 0.01, 'ease_out') helpers.rounded_rectangle(x, y, elem_w, elem_h, 4, hc[1], hc[2], hc[3], self.animate_menu) end if self.options.show_guides then local ga = math.floor(self.guide_alpha) local show_center_dot = self.options.show_center_dot ~= false local center_x, center_y = screen_w / 2, screen_h / 2 local elem_center_x, elem_center_y = x + elem_w / 2, y + elem_h / 2 local center_snapped_x = self.drag_axes:find('x') and math.abs(elem_center_x - center_x) < self.options.snap_distance local center_snapped_y = self.drag_axes:find('y') and math.abs(elem_center_y - center_y) < self.options.snap_distance local is_at_center = (not self.drag_axes:find('x') or center_snapped_x) and (not self.drag_axes:find('y') or center_snapped_y) local center_alpha = (show_center_dot and not is_at_center) and ga or 0 self.center_alpha = lerp('center_alpha_' .. tostring(self.name), center_alpha, 8, 0.01, 'ease_out') if self.options.align_center then if show_center_dot and self.center_alpha > 0 then renderer.circle(center_x, center_y, 255, 255, 255, self.center_alpha, 3, 0, 1) end if self.drag_axes:find('x') and self.element.default_y ~= center_y then renderer.line(0, center_y, screen_w, center_y, 255, 255, 255, ga * 0.3) end if self.drag_axes:find('y') and self.element.default_x ~= center_x then renderer.line(center_x, 0, center_x, screen_h, 255, 255, 255, ga * 0.3) end end local show_default_dot = self.options.show_default_dot ~= false local da = math.floor(self.dot_alpha) local default_x, default_y = self.element.default_x, self.element.default_y if self.element.align_x == 'center' then default_x = default_x - elem_w / 2 elseif self.element.align_x == 'right' then default_x = default_x - elem_w end if self.element.align_y == 'center' then default_y = default_y - elem_h / 2 elseif self.element.align_y == 'bottom' then default_y = default_y - elem_h end local is_snapped_x = self.drag_axes:find('x') and math.abs(x - default_x) < self.options.snap_distance local is_snapped_y = self.drag_axes:find('y') and math.abs(y - default_y) < self.options.snap_distance local is_at_default = (not self.drag_axes:find('x') or is_snapped_x) and (not self.drag_axes:find('y') or is_snapped_y) local default_alpha = (show_default_dot and not is_at_default) and da or 0 self.default_alpha = lerp('default_alpha_' .. tostring(self.name), default_alpha, 8, 0.01, 'ease_out') if show_default_dot and self.default_alpha > 0 then renderer.circle(self.element.default_x, self.element.default_y, 255, 255, 255, self.default_alpha, 3, 0, 1) end if show_default_dot and self.drag_axes:find('x') then renderer.line(0, self.element.default_y, screen_w, self.element.default_y, 255, 255, 255, da * 0.3) end if show_default_dot and self.drag_axes:find('y') then renderer.line(self.element.default_x, 0, self.element.default_x, screen_h, 255, 255, 255, da * 0.3) end end end do local block_fire = false client.set_event_callback('setup_command', function (e) if ui.is_menu_open() then if bit.band(e.buttons, 1) == 1 then e.buttons = bit.band(e.buttons, bit.bnot(1)) block_fire = true end else block_fire = false end end) end -- 在main_label定义附近添加以下代码 local menu_color_ref = ui.reference("MISC", "Settings", "Menu color") local function rgba_hex(r, g, b, a) return string.format("%02X%02X%02X%02X", r, g, b, a) end local function create_gradient_array(r, g, b, length) local t = {} local curtime = globals.curtime() local speed = 5 for i = 1, length do local factor = 0.5 + 0.5 * math.sin(curtime * speed + i / length * math.pi * 2) t[i] = { math.floor(r * factor), math.floor(g * factor), math.floor(b * factor), 255 } end return t end local menu = { group = { anti_aim = { main = pui.group('AA', 'Anti-aimbot angles'), fakelag = pui.group('AA', 'Fake lag'), other = pui.group('AA', 'Other') } } } local tab = { main_label = menu.group.anti_aim.main:label(' '), main = menu.group.anti_aim.main:combobox('\nMain tab', {' Control Center', ' Angle Matrix', ' Module Suite'}), second_label = menu.group.anti_aim.fakelag:label('\v \a7F7F7F97• '), second = menu.group.anti_aim.fakelag:combobox('\nSecond tab', {' Information', ' Configuration'}), space_2 = menu.group.anti_aim.fakelag:label(' '), } do pui.traverse({tab.second, tab.second_label, tab.space_2}, function (ref) ref:depend({tab.main, ' Control Center'}) end) tab.second:set_callback(function (ref) if ref:get() == ' Information' then tab.second_label:set('\v \a7F7F7F97• ') elseif ref:get() == ' Configuration' then tab.second_label:set('\a7F7F7F97 • \v') end end) end -- 在文件的合适位置(如所有初始化代码之后)添加以下回调 client.set_event_callback("paint_ui", function() local r, g, b, _ = ui.get(menu_color_ref) local text = string.format("%s / %s", lua.name, lua.build) local arr = create_gradient_array(r, g, b, #text) local colored_str = "" for i = 1, #text do colored_str = colored_str .. string.format("\a%s%s", rgba_hex(unpack(arr[i])), text:sub(i,i)) end tab.main_label:set(colored_str) end) local hell_phrases = { 'You cannot refuse this invitation.', 'This script makes you a top performer.', 'Singing in the villa.', 'Silver dragon fish in the pool.', 'I will give Uncle tea set as a gift.', 'He studied ink and wrote.', 'Just give me four words.', 'Speak of grand ambitions.', } local random_phrase = hell_phrases[client.random_int(1, 8)] local information = { space = menu.group.anti_aim.fakelag:label(' '), user = menu.group.anti_aim.fakelag:label(string.format('\v \r Welcome back, \v%s\r!', lua.username)), build = menu.group.anti_aim.fakelag:label(string.format('\v \r Your build is \v%s\r.', lua.build)), hell_message = menu.group.anti_aim.fakelag:label('\v \r ' .. random_phrase), welcome = menu.group.anti_aim.fakelag:label('\v \r Latest project \v' .. lua.name .. '\r enjoy!'), updata= menu.group.anti_aim.fakelag:label('\v \r Update date :\v' .. lua.update .. ''), space2 = menu.group.anti_aim.fakelag:label(' '), space3 = menu.group.anti_aim.fakelag:label(' '), text = menu.group.anti_aim.fakelag:label('\a7F7F7F97Thank you for your trust and support.'), csocialsname = menu.group.anti_aim.other:label('\v \rHighlights \vVideo'), space4 = menu.group.anti_aim.other:label('\a464646CC¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯'), socials = menu.group.anti_aim.other:slider('\nHighlights', 1, 2, 1, true, '', 1, {[1] = ' Pornhub', [2] = ' Stripchat'}), youtube = menu.group.anti_aim.other:button('\v\r \aFF1717FFStripchat', function () panorama.open('CSGOHud').SteamOverlayAPI.OpenExternalBrowserURL('https://zh.stripchat.com/') end), youtube_2 = menu.group.anti_aim.other:button('\v\r Porn\aFFA500FFhub', function () panorama.open('CSGOHud').SteamOverlayAPI.OpenExternalBrowserURL('https://cn.pornhub.com/view_video.php?viewkey=67bb207ccd2c8#1') end), discord_server = menu.group.anti_aim.main:button('\v\r Join \a00FF00FFKOOK\r Server', function () panorama.open('CSGOHud').SteamOverlayAPI.OpenExternalBrowserURL('https://kook.vip/3h1onO') end), } do pui.traverse(information, function (ref) ref:depend({tab.main, ' Control Center'}, {tab.second, ' Information'}) end) information.youtube_2:depend({information.socials, 1}) information.youtube:depend({information.socials, 2}) end local logic = { } local config_db = database.read('zhag1337') or { presets = {'Default'}, default = 'Default' } config_db.presets = config_db.presets or { } database.write('zhag1337', config_db) database.flush() local list_display_data = config_db.presets if #config_db.presets == 0 then list_display_data = {'Config list is empty!'} end local presets = { _local = { cfg = menu.group.anti_aim.other:label('\v \rNew \vConfig'), space5 = menu.group.anti_aim.other:label('\a464646CC¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯'), name = menu.group.anti_aim.other:textbox('Config Name'), create = menu.group.anti_aim.other:button('\v \rCreate \vConfig'), import_from_clipboard = menu.group.anti_aim.other:button('\v \rImport \vConfig'), export_to_clipboard = menu.group.anti_aim.other:button('\v \rExport \vConfig'), list = menu.group.anti_aim.main:listbox('\nPresets', list_display_data), load = menu.group.anti_aim.main:button('\v \rLoad \vConfig'), save = menu.group.anti_aim.main:button('\v \rSave \vConfig'), load_aa = menu.group.anti_aim.main:button('\v \rOnly \vAngles'), delete = menu.group.anti_aim.main:button('\aFF000092 Delete Config') }, } do local function update_list() local list_names = {} local selected_index = presets._local.list:get() + 1 for i = 1, #config_db.presets do local prefix = (selected_index == i) and '• ' or ' ' list_names[#list_names + 1] = prefix .. config_db.presets[i] end if #list_names == 0 then list_names[#list_names + 1] = 'Config list is empty!' end presets._local.list:update(list_names) end logic.create = function () local name = presets._local.name:get() if name == '' then client.color_log(255, 175, 175, 'Ultherapy · \0') client.color_log(200, 200, 200, 'Config name cannot be empty.') return end for i = 1, #config_db.presets do if config_db.presets[i] == name then client.color_log(255, 175, 175, 'Ultherapy · \0') client.color_log(200, 200, 200, 'Config already exists.') return end end table.insert(config_db.presets, name) database.write('zhag1337', config_db) database.flush() update_list() cvar.play:invoke_callback('ambient\\tones\\elev1') client.color_log(195, 198, 255, 'Ultherapy · \0') client.color_log(200, 200, 200, 'Preset created: ' .. name .. '.') end logic.import = function () local clipboard_data = clipboard.get() if not clipboard_data or clipboard_data == "" then client.color_log(255, 175, 175, 'Ultherapy · \0') client.color_log(200, 200, 200, 'Clipboard is empty.') return end local parsed_data = nil local success_parse = pcall(function() parsed_data = json.parse(clipboard_data) end) if not success_parse or not parsed_data then client.color_log(255, 175, 175, 'Ultherapy · \0') client.color_log(200, 200, 200, 'Failed to parse clipboard data.') return end logic.setup:load(parsed_data) client.exec('playvol buttons\\button17 0.5') client.color_log(195, 198, 255, 'Ultherapy · \0') client.color_log(200, 200, 200, 'Preset imported from clipboard.') end logic.delete = function () local index = presets._local.list:get() if not index or index < 0 then client.color_log(255, 175, 175, 'Ultherapy · \0') client.color_log(200, 200, 200, 'No preset selected.') return end if index + 1 > #config_db.presets then client.color_log(255, 175, 175, 'Ultherapy · \0') client.color_log(200, 200, 200, 'Invalid preset index.') return end local preset_name = config_db.presets[index + 1] table.remove(config_db.presets, index + 1) database.write('zhag1337', config_db) database.flush() update_list() if #config_db.presets == 0 then presets._local.name:set('') end cvar.play:invoke_callback('ambient\\tones\\elev1') client.color_log(195, 198, 255, 'Ultherapy · \0') client.color_log(200, 200, 200, 'Preset deleted: ' .. preset_name .. '.') end logic.save = function () local index = presets._local.list:get() if not index or index < 0 then client.color_log(255, 175, 175, 'Ultherapy · \0') client.color_log(200, 200, 200, 'No preset selected.') return end local name = config_db.presets[index + 1] if not name then client.color_log(255, 175, 175, 'Ultherapy · \0') client.color_log(200, 200, 200, 'Invalid preset name.') return end config_db[name] = json.stringify(logic.setup:save()) cvar.play:invoke_callback('ambient\\tones\\elev1') database.write('zhag1337', config_db) database.flush() update_list() client.color_log(195, 198, 255, 'Ultherapy · \0') client.color_log(200, 200, 200, 'Preset saved: ' .. name .. '.') end logic.load = function () local index = presets._local.list:get() if not index or index < 0 then client.color_log(255, 175, 175, 'Ultherapy · \0') client.color_log(200, 200, 200, 'No preset selected.') return end local name = config_db.presets[index + 1] if not name then client.color_log(255, 175, 175, 'Ultherapy · \0') client.color_log(200, 200, 200, 'Invalid preset name.') return end local data = config_db[name] if data then logic.setup:load(json.parse(data)) client.exec('playvol buttons\\light_power_on_switch_01 0.5') client.color_log(195, 198, 255, 'Ultherapy · \0') client.color_log(200, 200, 200, 'Preset loaded: ' .. name .. '.') else client.color_log(255, 175, 175, 'Ultherapy · \0') client.color_log(200, 200, 200, 'Failed to load preset: ' .. name .. '.') end update_list() end logic.load_aa = function () local index = presets._local.list:get() if not index or index < 0 then client.color_log(255, 175, 175, 'Ultherapy · \0') client.color_log(200, 200, 200, 'No preset selected.') return end local name = config_db.presets[index + 1] if not name then client.color_log(255, 175, 175, 'Ultherapy · \0') client.color_log(200, 200, 200, 'Invalid preset name.') return end local data = config_db[name] if data then logic.setup:load(json.parse(data), 1) logic.setup:load(json.parse(data), 2) client.exec('playvol buttons\\light_power_on_switch_01 0.5') client.color_log(195, 198, 255, 'Ultherapy · \0') client.color_log(200, 200, 200, 'AA preset loaded: ' .. name .. '.') else client.color_log(255, 175, 175, 'Ultherapy · \0') client.color_log(200, 200, 200, 'Failed to load AA preset: ' .. name .. '.') end update_list() end logic.export = function () clipboard.set(json.stringify(logic.setup:save())) client.exec('playvol buttons\\button18 0.5') client.color_log(195, 198, 255, 'Ultherapy · \0') client.color_log(200, 200, 200, 'Current config exported to clipboard.') end presets._local.create:set_callback(logic.create) presets._local.import_from_clipboard:set_callback(logic.import) presets._local.delete:set_callback(logic.delete) presets._local.save:set_callback(logic.save) presets._local.load:set_callback(logic.load) presets._local.load_aa:set_callback(logic.load_aa) presets._local.export_to_clipboard:set_callback(logic.export) presets._local.list:set_callback(function() update_list() local index = presets._local.list:get() if index >= 0 and index < #config_db.presets then presets._local.name:set(config_db.presets[index + 1]) end end) pui.traverse(presets, function(ref) ref:depend({tab.main, ' Control Center'}, {tab.second, ' Configuration'}) end) end -- local elements = { anti_aim = { tab_label = menu.group.anti_aim.fakelag:label('\v \a7F7F7F97•  •  • '), tab = menu.group.anti_aim.fakelag:combobox('\nAA Tab', {' Antiaim', ' Defensive', ' Fakelag', ' Debug'}), antiaim = menu.group.anti_aim.main:label('\v \rEditing \vAngle'), space333 = menu.group.anti_aim.main:label('\a464646CC¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯'), hotkeys = { hotkey = menu.group.anti_aim.other:label('\v \rHotkey \vBinds'), space201 = menu.group.anti_aim.other:label('\a464646CC¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯'), manual_mode = menu.group.anti_aim.other:slider('\v• \rManual \v»\r Mode', 1, 2, 1, true, '', 1, { [1] = 'Default', [2] = 'Spam' }), forward = menu.group.anti_aim.other:hotkey('\v• \rManual \v»\r Forward'), left = menu.group.anti_aim.other:hotkey('\v• \rManual \v»\r Left'), right = menu.group.anti_aim.other:hotkey('\v• \rManual \v»\r Right'), reset = menu.group.anti_aim.other:hotkey('\v• \rManual \v»\r Reset'), freestanding = menu.group.anti_aim.other:checkbox('\v• \rFreestanding', 0x00), freestanding_disablers = menu.group.anti_aim.other:multiselect('\v• \rDisable freestanding on', {'Stand', 'Run', 'Walk', 'Crouch', 'Sneak', 'Air', 'Air+'}), edge_yaw = menu.group.anti_aim.other:checkbox('\v• \rEdge yaw', 0x00), }, exploits = { def = menu.group.anti_aim.main:label('\v \rEditing \vDefen'), space002 = menu.group.anti_aim.main:label('\a464646CC¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯'), exp = menu.group.anti_aim.fakelag:label('\v \rSpecial \vProject'), space001 = menu.group.anti_aim.fakelag:label('\a464646CC¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯'), defensive_flick = { enable = menu.group.anti_aim.fakelag:checkbox('\v \rFake \vflick\r'), settings = { states = menu.group.anti_aim.fakelag:multiselect('\v• \rOverride', {'Stand', 'Run', 'Walk', 'Crouch', 'Sneak', 'Air', 'Air+', 'Freestanding', 'Manual Left', 'Manual Right'}), } }, exploit = { enable = menu.group.anti_aim.fakelag:checkbox('\v \rServer\v exploits'), options = menu.group.anti_aim.fakelag:combobox('\v• \rOptions', {'Fake up \abf3939FF(180)', 'Fake zero \abf3939FF(1080)', 'Fake down \abf3939FF(-180)', 'Fake down \abf3939FF(-540)'}) } }, settings = { setting = menu.group.anti_aim.fakelag:label('\v \rAntiaim \vEnhancements'), space202 = menu.group.anti_aim.fakelag:label('\a464646CC¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯'), list = menu.group.anti_aim.fakelag:multiselect('\v \rSetting \vlist', {'Safe head', 'walk speed', 'Anti backstab', 'Fast ladder', 'Spin if enemies dead', 'E-Bombsite fix', 'Low ping disable defensive', 'Spin on warmup'}), safe_head_options = menu.group.anti_aim.fakelag:multiselect('\v• \rSafe Head States', {'Knife', 'Taser', 'Height Advantage'}), safe_head_mode = menu.group.anti_aim.fakelag:combobox('\v• \rSafe Head Mode', {'Offensive', 'Defensive'}), walk_speed_slider = menu.group.anti_aim.fakelag:slider('\v• \rSlow Walk Speed', 1, 100, 50, true, 's', 1, {[100] = "Max"}) }, fakelag = { choke101 = menu.group.anti_aim.other:label('\v \rChoke \vSetting'), space101 = menu.group.anti_aim.other:label('\a464646CC¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯'), enable = menu.group.anti_aim.other:checkbox('\v \rEnable \vfakelag'), mode = menu.group.anti_aim.other:combobox('\v• \rfakelag mode', {'Adaptive', 'Dynamic', 'Maximum', 'Fluctuate', 'Random'}), limit = menu.group.anti_aim.other:slider('\v• \rfakelag limit', 1, 17, 1, true, 't'), disablers = menu.group.anti_aim.other:multiselect('\v• \rfakelag disablers', {'Standing', 'Jittering', 'Ducking'}), osaa = menu.group.anti_aim.other:combobox('\v• \rhideshot setting', {'Break LC', 'No Choke', 'Send Packet'}), } }, tab = { label = menu.group.anti_aim.fakelag:label('\v \a7F7F7F97•  • '), combo = menu.group.anti_aim.fakelag:combobox('\nFeatures Tab', {' Rage Options', ' Misc Options', ' Visual Options'}), }, aimbot = { Extended = menu.group.anti_aim.other:label('\v \rExtended \vRagebot'), space28 = menu.group.anti_aim.other:label('\a464646CC¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯'), auto_air_stop = { enable = menu.group.anti_aim.other:checkbox('\v \rAuto \vairstop'), settings = { addons = menu.group.anti_aim.other:multiselect('\v• \rCondition', {'Hitchance limit', 'Distance to enemy stopping','Auto scope when stopping'}), distance = menu.group.anti_aim.other:slider('\v• \rDistance', 100, 500, 300, true, 'u'), hitchance = menu.group.anti_aim.other:slider('\v• \rHitchance limit', 1, 100, 25, true, '%'), } }, auto_tp = { enable = menu.group.anti_aim.other:checkbox('\v \rTeleport \vmode'), mode = menu.group.anti_aim.other:combobox('\v• \rTeleport mode', {"Off", "Semi automatic teleport", "Fully automatic teleport"}), auto_discharge = menu.group.anti_aim.other:hotkey('\v↪︎ \rSemi automatic teleport hotkey'), }, auto_hs = { enable = menu.group.anti_aim.other:checkbox('\v \rAdaptive \vhideshot'), enablers = menu.group.anti_aim.other:multiselect('\v• \rAdaptive hideshot weapons', {"Scout", "Awp", "Knife", "Pistols", "Auto Snipers", "Heavy Pistols", "Rifles"}), states = menu.group.anti_aim.other:multiselect('\v• \rAdaptive hideshot states', {"Standing", "Slow", "Ducking", "Duck Running"}), }, unsafe_exploit = menu.group.anti_aim.other:checkbox('\v \rExploit \vrecharge'), aim_punch_fix = menu.group.anti_aim.other:checkbox('\v \rDamage \vcompensation'), Advanced = menu.group.anti_aim.main:label('\v \rAdvanced \vRagebot'), space29 = menu.group.anti_aim.main:label('\a464646CC¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯'), ai_peek = { enable = menu.group.anti_aim.main:checkbox('\v \rAI \vpeek', 0x00), settings = { distance = menu.group.anti_aim.main:combobox('\v• \rPeek distance', {'Long', 'Medium', 'Short'}), mode = menu.group.anti_aim.main:combobox('\v• \rTarget mode', {'Current threat', 'Closest to crosshair'}), peek_mode = menu.group.anti_aim.main:multiselect('\v• \rPeek mode', {'Automatically teleport', 'Force defensive', 'Peek indicators'}), } }, aimbot_helper = { enable = menu.group.anti_aim.main:checkbox('\v \rWeapons \vhelper'), settings = { weapon = menu.group.anti_aim.main:combobox('\v• \rWeapon', {'SSG-08', 'AWP', 'Auto Snipers'}), ssg = { select = menu.group.anti_aim.main:multiselect('\v• \rSelect SSG08', {'Force safe point', 'Prefer body aim', 'Force body aim', 'Ping spike', 'Adaptive multipoint'}), force_safe = menu.group.anti_aim.main:multiselect('\v• \rForce safe point triggers \nSSG08', {'Enemy HP < X', 'X Missed Shots', 'Lethal', 'Height advantage', 'Enemy higher than you'}), force_safe_hp = menu.group.anti_aim.main:slider('\v• \rForce safe point HP Trigger \nSSG08', 1, 100, 50, true, 'hp'), force_safe_miss = menu.group.anti_aim.main:slider('\v• \rForce safe point Missed Trigger \nSSG08', 1, 10, 2, true, 'shots'), prefer_body = menu.group.anti_aim.main:multiselect('\v• \rPrefer body aim triggers \nSSG08', {'Enemy HP < X', 'X Missed Shots', 'Lethal', 'Height advantage', 'Enemy higher than you'}), prefer_body_hp = menu.group.anti_aim.main:slider('\v• \rPrefer body aim HP Trigger \nSSG08', 1, 100, 50, true, 'hp'), prefer_body_miss = menu.group.anti_aim.main:slider('\v• \rPrefer body aim Missed Trigger \nSSG08', 1, 10, 2, true, 'shots'), force_body = menu.group.anti_aim.main:multiselect('\v• \rForce body aim triggers \nSSG08', {'Enemy HP < X', 'X Missed Shots', 'Lethal', 'Height advantage', 'Enemy higher than you'}), force_body_hp = menu.group.anti_aim.main:slider('\v• \rForce body aim HP Trigger \nSSG08', 1, 100, 50, true, 'hp'), force_body_miss = menu.group.anti_aim.main:slider('\v• \rForce body aim Missed Trigger \nSSG08', 1, 10, 2, true, 'sh'), ping_spike_value = menu.group.anti_aim.main:slider('\v• \rPing spike value \nSSG08', 1, 200, 80, true, 'ms'), mp_lower = menu.group.anti_aim.main:slider('\v• \rMultipoint lower bound \nSSG08', 25, 100, 55, true, '%'), mp_upper = menu.group.anti_aim.main:slider('\v• \rMultipoint upper bound \nSSG08', 25, 100, 70, true, '%') }, awp = { select = menu.group.anti_aim.main:multiselect('\v• \rSelect AWP', {'Force safe point', 'Prefer body aim', 'Force body aim', 'Ping spike', 'Adaptive multipoint'}), force_safe = menu.group.anti_aim.main:multiselect('\v• \rForce safe point triggers \nAWP', {'Enemy HP < X', 'X Missed Shots', 'Lethal', 'Height advantage', 'Enemy higher than you'}), force_safe_hp = menu.group.anti_aim.main:slider('\v• \rForce safe point HP Trigger \nAWP', 1, 100, 50, true, 'hp'), force_safe_miss = menu.group.anti_aim.main:slider('\v• \rForce safe point Missed Trigger \nAWP', 1, 10, 2, true, 'sh'), prefer_body = menu.group.anti_aim.main:multiselect('\v• \rPrefer body aim triggers \nAWP', {'Enemy HP < X', 'X Missed Shots', 'Lethal', 'Height advantage', 'Enemy higher than you'}), prefer_body_hp = menu.group.anti_aim.main:slider('\v• \rPrefer body aim HP Trigger \nAWP', 1, 100, 50, true, 'hp'), prefer_body_miss = menu.group.anti_aim.main:slider('\v• \rPrefer body aim Missed Trigger \nAWP', 1, 10, 2, true, 'sh'), force_body = menu.group.anti_aim.main:multiselect('\v• \rForce body aim triggers \nAWP', {'Enemy HP < X', 'X Missed Shots', 'Lethal', 'Height advantage', 'Enemy higher than you'}), force_body_hp = menu.group.anti_aim.main:slider('\v• \rForce body aim HP Trigger \nAWP', 1, 100, 50, true, 'hp'), force_body_miss = menu.group.anti_aim.main:slider('\v• \rForce body aim Missed Trigger \nAWP', 1, 10, 2, true, 'sh'), ping_spike_value = menu.group.anti_aim.main:slider('\v• \rPing spike value \nAWP', 1, 200, 130, true, 'ms'), mp_lower = menu.group.anti_aim.main:slider('\v• \rMultipoint lower bound \nAWP', 25, 100, 55, true, '%'), mp_upper = menu.group.anti_aim.main:slider('\v• \rMultipoint upper bound \nAWP', 25, 100, 70, true, '%') }, auto = { select = menu.group.anti_aim.main:multiselect('\v• \rSelect AUTO', {'Force safe point', 'Prefer body aim', 'Force body aim', 'Ping spike', 'Adaptive multipoint'}), force_safe = menu.group.anti_aim.main:multiselect('\v• \rForce safe point triggers \nAUTO', {'Enemy HP < X', 'X Missed Shots', 'Lethal', 'Height advantage', 'Enemy higher than you'}), force_safe_hp = menu.group.anti_aim.main:slider('\v• \rForce safe point HP Trigger \nAUTO', 1, 100, 50, true, 'hp'), force_safe_miss = menu.group.anti_aim.main:slider('\v• \rForce safe point Missed Trigger \nAUTO', 1, 10, 2, true, 'sh'), prefer_body = menu.group.anti_aim.main:multiselect('\v• \rPrefer body aim triggers \nAUTO', {'Enemy HP < X', 'X Missed Shots', 'Lethal', 'Height advantage', 'Enemy higher than you'}), prefer_body_hp = menu.group.anti_aim.main:slider('\v• \rPrefer body aim HP Trigger \nAUTO', 1, 100, 50, true, 'hp'), prefer_body_miss = menu.group.anti_aim.main:slider('\v• \rPrefer body aim Missed Trigger \nAUTO', 1, 10, 2, true, 'sh'), force_body = menu.group.anti_aim.main:multiselect('\v• \rForce body aim triggers \nAUTO', {'Enemy HP < X', 'X Missed Shots', 'Lethal', 'Height advantage', 'Enemy higher than you'}), force_body_hp = menu.group.anti_aim.main:slider('\v• \rForce body aim HP Trigger \nAUTO', 1, 100, 50, true, 'hp'), force_body_miss = menu.group.anti_aim.main:slider('\v• \rForce body aim Missed Trigger \nAUTO', 1, 10, 2, true, 'sh'), ping_spike_value = menu.group.anti_aim.main:slider('\v• \rPing spike value \nAUTO', 1, 200, 105, true, 'ms'), mp_lower = menu.group.anti_aim.main:slider('\v• \rMultipoint lower bound \nAUTO', 25, 100, 55, true, '%'), mp_upper = menu.group.anti_aim.main:slider('\v• \rMultipoint upper bound \nAUTO', 25, 100, 70, true, '%') } } }, Enhanced = menu.group.anti_aim.fakelag:label('\v \rEnhanced \vRagebot'), space30 = menu.group.anti_aim.fakelag:label('\a464646CC¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯'), resolver = { enable = menu.group.anti_aim.fakelag:checkbox('\v \rPrivate \vresolver'), settings = { mode = menu.group.anti_aim.fakelag:combobox('\v• \rResolver logic', {'Entitylayer', 'RAM + Animlayer \aD1AA3DFF[BETA]'}) } }, predict_enemies = { enable = menu.group.anti_aim.fakelag:checkbox('\v \rPredict \venemies'), info_label = menu.group.anti_aim.fakelag:label('\v↪︎ \rWork requires FPS > 150. Ping < 50 ms.'), }, dormant_aimbot = { enable = menu.group.anti_aim.fakelag:checkbox('\v \rDormant \vaimbot'), info_label = menu.group.anti_aim.fakelag:label('\v↪︎ \rDetection dormant targets'), }, extended_backtrack = { enable = menu.group.anti_aim.fakelag:checkbox('\v \rExtended \vbacktrack'), info_label = menu.group.anti_aim.fakelag:label('\v↪︎ \rSet sv_maxunlag from default 200 / 400'), }, game_enhancer = { enable = menu.group.anti_aim.fakelag:checkbox('\v \rFPS \vbooster'), settings = { list = menu.group.anti_aim.fakelag:multiselect('\v• \rFPS booster list', {'Fix chams color', 'Disable dynamic lighting', 'Disable dynamic shadows', 'Disable first-person tracers', 'Disable ragdolls', 'Disable eye gloss', 'Disable eye movement', 'Disable muzzle flash light', 'Enable low CPU audio', 'Disable bloom', 'Disable particles', 'Reduce breakable objects'}), } } }, visuals = { animvis = menu.group.anti_aim.main:label('\v \rAnimation \vVisuals'), space7 = menu.group.anti_aim.main:label('\a464646CC¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯'), crosshair = { enable = menu.group.anti_aim.main:checkbox('\v \rCrosshair \vindicator'), settings = { type = menu.group.anti_aim.main:combobox('\v• \rCrosshair type', {'New', 'Old'}), select = menu.group.anti_aim.main:multiselect('\v• \rSelect', {'States', 'Binds'}), } }, arrows = { enable = menu.group.anti_aim.main:checkbox('\v \rArrows \vindicator'), settings = { hide_on_thirdperson = menu.group.anti_aim.main:checkbox('\v• \rHide on thirdperson'), type = menu.group.anti_aim.main:combobox('\v• \rArrows type', {'Pointers', 'Semicircle'}), style = menu.group.anti_aim.main:combobox('\v• \rArrows style', {'*1', '*2', '*3'}), } }, scope = { enable = menu.group.anti_aim.main:checkbox('\v \rScope \vindicator'), settings = { invert = menu.group.anti_aim.main:checkbox('\v• \rInvert'), exclude = menu.group.anti_aim.main:multiselect('\v• \rExclude', {'Left', 'Right', 'Top', 'Bottom'}), gap = menu.group.anti_aim.main:slider('\v• \rScope gap', 0, 100, 5, true, 'x'), size = menu.group.anti_aim.main:slider('\v• \rScope size', 5, 200, 50, true, 'w'), } }, viewmodel_in_scope = { enable = menu.group.anti_aim.main:checkbox('\v \rViewmodel \vscope'), }, cam = { enable = menu.group.anti_aim.main:checkbox('\v \rCamera \vanimation'), }, zoom = { enable = menu.group.anti_aim.main:checkbox('\v \rZoom \vanimation'), settings = { speed = menu.group.anti_aim.main:slider('\v• \rZoom animation speed', 10, 100, 60, true, '%S'), value = menu.group.anti_aim.main:slider('\v• \rZoom animation value', 5, 100, 25, true, '%') } }, aspect_ratio = { enable = menu.group.anti_aim.main:checkbox('\v \rAspect \vratio'), settings = { value = menu.group.anti_aim.main:slider('\v• \rAspect ratio value', 100, 250, 178, true, 'x', .01, {[125] = '5:4', [133] = '4:3', [150] = '3:2', [160] = '16:10', [178] = '16:9', [200] = '2:1'}), } }, viewmodel = { enable = menu.group.anti_aim.main:checkbox('\v \rView \vmodel'), settings = { fov = menu.group.anti_aim.main:slider('\v• \rFOV', 0, 120, 68, true, '°'), x = menu.group.anti_aim.main:slider('\v• \rOffset X', -100, 100, 0, true, 'u', .1), y = menu.group.anti_aim.main:slider('\v• \rOffset Y', -100, 100, 0, true, 'u', .1), z = menu.group.anti_aim.main:slider('\v• \rOffset Z', -100, 100, 0, true, 'u', .1) } }, gocontrol = menu.group.anti_aim.fakelag:label('\v \rGlobal \vControl'), space9 = menu.group.anti_aim.fakelag:label('\a464646CC¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯'), windows = menu.group.anti_aim.fakelag:multiselect('\v \rDisplay \vindicator', {'Text brand', 'Watermark', 'Keybinds', --[['Debug panel', 'Multi panel',]] 'Event logger', 'Left indicators'}), watermark = { settings = { elements = menu.group.anti_aim.fakelag:multiselect('\v• \rWatermark elements', {'Nickname', 'Frames Per Second', 'Ping', 'Tickrate', 'Time'}), nickname = menu.group.anti_aim.fakelag:combobox('\v• \rWatermark nickname', {'Loader', 'Steam', 'Custom'}), custom = menu.group.anti_aim.fakelag:textbox('\v• \rWatermark custom nickname'), } }, event_logger = { settings = { type = menu.group.anti_aim.fakelag:multiselect('\v• \rEvent logger type', {'In console', 'On screen'}), } }, hitfeed = menu.group.anti_aim.other:label('\v \rHit \vFeedback'), space10 = menu.group.anti_aim.other:label('\a464646CC¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯'), damage = { enable = menu.group.anti_aim.other:checkbox('\v \rDamage \vindicator'), settings = { type = menu.group.anti_aim.other:combobox('\v• \rDamage indicator type', {'Always on', 'On hotkey'}), font = menu.group.anti_aim.other:combobox('\v• \rDamage indicator flag', {'Default', 'Bold', 'Small'}), } }, markers = { enable = menu.group.anti_aim.other:checkbox('\v \rMarker \vindicator'), settings = { type = menu.group.anti_aim.other:multiselect('\v• \rMarkers type', {'On hit', 'On miss', 'Damage'}) } }, hitrate = { enable = menu.group.anti_aim.other:checkbox('\v \rDebug \vindicator'), settings = { type = menu.group.anti_aim.other:multiselect('\v• \rDebug indicator type', {'Accuracy Rate', 'Detection Focus',}) } } }, misc = { Secondary = menu.group.anti_aim.fakelag:label('\v \rSecondary \vFunction'), space20 = menu.group.anti_aim.fakelag:label('\a464646CC¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯'), edge_quick_stop = menu.group.anti_aim.fakelag:checkbox('\v \rEdge \vquickstop', 0x00), drop_nades = { enable = menu.group.anti_aim.fakelag:checkbox('\v \rDrop \vnades', 0x00), settings = { list = menu.group.anti_aim.fakelag:multiselect('\v• \rtype', {'HE Grenade', 'Molotov', 'Incendiary', 'Smoke'}), } }, fd_fix = menu.group.anti_aim.fakelag:checkbox('\v \rDuckpeek \vfix'), warmup_helper = menu.group.anti_aim.fakelag:checkbox('\aFD0540FF⚠️ \rWarmup \vassistant'), hardware = menu.group.anti_aim.main:label('\v \rHardware \vFunction'), space21 = menu.group.anti_aim.main:label('\a464646CC¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯'), autobuy = { enable = menu.group.anti_aim.main:checkbox('\v \rAutobuy \vfix warmup time'), settings = { sniper = menu.group.anti_aim.main:combobox('\v• \rPrimary weapon', {'-', 'SSG-08', 'AWP', 'SCAR-20/G3SG1'}), pistol = menu.group.anti_aim.main:combobox('\v• \rSecondary weapon', {'-', 'Duals', 'P250', 'Five-SeveN/Tec-9', 'Deagle/R8'}), grenades = menu.group.anti_aim.main:multiselect('\v• \rGrenades', {'Smoke', 'Molotov', 'HE Grenade'}), utilities = menu.group.anti_aim.main:multiselect('\v• \rUtilities', {'Kevlar', 'Helmet', 'Defuse Kit', 'Taser'}) } }, animations = { enable = menu.group.anti_aim.main:checkbox('\v \rAnimation \vbreaker'), settings = { condition = menu.group.anti_aim.main:combobox('\v• \rCondition', {'On ground', 'In air'}), running = { anim_type = menu.group.anti_aim.main:combobox('\v• \rSelect animations\nOn ground', {'-', 'Static', 'Jitter', 'Alternative jitter', 'Allah', 'Alien'}), anim_min_jitter = menu.group.anti_aim.main:slider('\v• \rMin. jitter percent\nOn ground', 0, 100, 0, true, '%'), anim_max_jitter = menu.group.anti_aim.main:slider('\v• \rMax. jitter percent\nOn ground', 0, 100, 100, true, '%'), anim_extra_type = menu.group.anti_aim.main:multiselect('\v• \rSelect extra animations\nOn ground', {'Body lean'}), anim_bodylean = menu.group.anti_aim.main:slider('\v• \rLeaning percent\nOn ground', 0, 100, 70, true, '%'), }, in_air = { anim_type = menu.group.anti_aim.main:combobox('\v• \rSelect Animations\nAir', {'-', 'Static', 'Jitter', 'Allah'}), anim_min_jitter = menu.group.anti_aim.main:slider('\v• \rMin. jitter percent\nAir', 0, 100, 0, true, '%'), anim_max_jitter = menu.group.anti_aim.main:slider('\v• \rMax. jitter percent\nAir', 0, 100, 100, true, '%'), anim_extra_type = menu.group.anti_aim.main:multiselect('\v• \rSelect extra animations\nAir', {'Body lean', 'Zero pitch on landing'}), anim_bodylean = menu.group.anti_aim.main:slider('\v• \rLeaning percent\nAir', 0, 100, 70, true, '%'), }, } }, Communication = menu.group.anti_aim.other:label('\v \rCommunication \vFunction'), space22 = menu.group.anti_aim.other:label('\a464646CC¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯'), enemy_chat_viewer = menu.group.anti_aim.other:checkbox('\v \rEnemychat \vviewer'), clan_tag_spammer = menu.group.anti_aim.other:checkbox('\v \rClantag \vspammer'), filter_console = menu.group.anti_aim.other:checkbox('\v \rFilter \vconsole'), trash_talk = { enable = menu.group.anti_aim.other:checkbox('\v \rTrash \vtalk'), settings = { work = menu.group.anti_aim.other:multiselect('\v• \rWork', {'On kill', 'On death'}), type = menu.group.anti_aim.other:combobox('\v• \rType', {'Ultherapy', 'Bait'}), } } } } do --elements.anti_aim.exploits.exploit.enable:set_enabled(false) pui.traverse(elements.anti_aim, function (ref) ref:depend({tab.main, ' Angle Matrix'}) end) elements.anti_aim.tab:set_callback(function (ref) if ref:get() == ' Antiaim' then elements.anti_aim.tab_label:set('\v \a7F7F7F97•  •  • ') elseif ref:get() == ' Defensive' then elements.anti_aim.tab_label:set('\a7F7F7F97 • \v \a7F7F7F97•  • ') elseif ref:get() == ' Fakelag' then elements.anti_aim.tab_label:set('\a7F7F7F97 •  • \v \a7F7F7F97• ') elseif ref:get() == ' Debug' then elements.anti_aim.tab_label:set('\a7F7F7F97 •  •  • \v') end end) reference.antiaim.angles.yaw[2]:depend({reference.antiaim.angles.yaw[1]}, {reference.antiaim.angles.yaw[2]}) reference.antiaim.angles.pitch[2]:depend({reference.antiaim.angles.pitch[1]}, {reference.antiaim.angles.pitch[2]}) reference.antiaim.angles.yaw_jitter[1]:depend({reference.antiaim.angles.yaw[1]}, {reference.antiaim.angles.yaw[2]}) reference.antiaim.angles.yaw_jitter[2]:depend({reference.antiaim.angles.yaw[1]}, {reference.antiaim.angles.yaw[2]}, {reference.antiaim.angles.yaw_jitter[1]}, {reference.antiaim.angles.yaw_jitter[2]}) reference.antiaim.angles.body_yaw[2]:depend({reference.antiaim.angles.body_yaw[1]}) reference.antiaim.angles.fs_body_yaw:depend({reference.antiaim.angles.body_yaw[1]}) pui.traverse(reference.antiaim.angles, function (ref) ref:depend({tab.main, ' Angle Matrix'}, {elements.anti_aim.tab, ' Debug'}) if ref.hotkey then ref.hotkey:depend({tab.main, ' Angle Matrix'}, {elements.anti_aim.tab, ' Debug'}) end end) pui.traverse(reference.antiaim.fakelag, function (ref) ref:depend({tab.main, ' Angle Matrix'}, {elements.anti_aim.tab, ' Debug'}) if ref.hotkey then ref.hotkey:depend({tab.main, ' Angle Matrix'}, {elements.anti_aim.tab, ' Debug'}) end end) pui.traverse(reference.antiaim.other, function (ref) ref:depend({tab.main, ' Angle Matrix'}, {elements.anti_aim.tab, ' Debug'}) if ref.hotkey then ref.hotkey:depend({tab.main, ' Angle Matrix'}, {elements.anti_aim.tab, ' Debug'}) end end) pui.traverse(elements.anti_aim.hotkeys, function (ref) ref:depend({elements.anti_aim.tab, ' Antiaim'}, {elements.anti_aim.tab, ' Debug', true}, {elements.anti_aim.tab, ' Fakelag', true}) end) elements.anti_aim.hotkeys.freestanding_disablers:depend({elements.anti_aim.hotkeys.freestanding, true}) elements.anti_aim.antiaim:depend({elements.anti_aim.tab, ' Antiaim'}) elements.anti_aim.space333:depend({elements.anti_aim.tab, ' Antiaim'}) elements.anti_aim.fakelag.choke101:depend({tab.main, ' Angle Matrix'}, {elements.anti_aim.tab, ' Fakelag'}) elements.anti_aim.fakelag.space101:depend({tab.main, ' Angle Matrix'}, {elements.anti_aim.tab, ' Fakelag'}) elements.anti_aim.fakelag.enable:depend({tab.main, ' Angle Matrix'}, {elements.anti_aim.tab, ' Fakelag'}) elements.anti_aim.fakelag.mode:depend({tab.main, ' Angle Matrix'}, {elements.anti_aim.fakelag.enable, true}, {elements.anti_aim.tab, ' Fakelag'}) elements.anti_aim.fakelag.limit:depend({tab.main, ' Angle Matrix'}, {elements.anti_aim.fakelag.enable, true}, {elements.anti_aim.tab, ' Fakelag'}) elements.anti_aim.fakelag.disablers:depend({tab.main, ' Angle Matrix'}, {elements.anti_aim.fakelag.enable, true}, {elements.anti_aim.tab, ' Fakelag'}) elements.anti_aim.fakelag.osaa:depend({tab.main, ' Angle Matrix'}, {elements.anti_aim.fakelag.enable, true}, {elements.anti_aim.tab, ' Fakelag'}) pui.traverse(elements.anti_aim.exploits, function (ref) ref:depend({elements.anti_aim.tab, ' Defensive'}, {elements.anti_aim.tab, ' Debug', true}, {elements.anti_aim.tab, ' Fakelag', true}) end) pui.traverse(elements.anti_aim.exploits.defensive_flick.settings, function (ref) ref:depend({elements.anti_aim.exploits.defensive_flick.enable, true}) end) pui.traverse({elements.anti_aim.exploits.exploit.options}, function (ref) ref:depend({elements.anti_aim.exploits.exploit.enable, true}) end) pui.traverse(elements.anti_aim.settings, function (ref) ref:depend({elements.anti_aim.tab, ' Antiaim'}, {elements.anti_aim.tab, ' Debug', true}, {elements.anti_aim.tab, ' Fakelag', true}) end) pui.traverse({elements.anti_aim.settings.safe_head_options, elements.anti_aim.settings.safe_head_mode}, function (ref) ref:depend({elements.anti_aim.settings.list, 'Safe head'}) end) pui.traverse({elements.anti_aim.settings.walk_speed_slider}, function (ref) ref:depend({elements.anti_aim.settings.list, 'walk speed'}) end) pui.traverse(elements.tab, function (ref) ref:depend({tab.main, ' Module Suite'}) end) elements.tab.combo:set_callback(function (ref) if ref:get() == ' Rage Options' then elements.tab.label:set('\v \a7F7F7F97•  • ') elseif ref:get() == ' Misc Options' then elements.tab.label:set('\a7F7F7F97 • \v \a7F7F7F97• ') elseif ref:get() == ' Visual Options' then elements.tab.label:set('\a7F7F7F97 •  • \v') end end) pui.traverse(elements.aimbot, function (ref) ref:depend({tab.main, ' Module Suite'}, {elements.tab.combo, ' Rage Options'}) end) elements.aimbot.auto_air_stop.settings.distance:depend({elements.aimbot.auto_air_stop.settings.addons, 'Distance to enemy stopping'}) elements.aimbot.auto_air_stop.settings.hitchance:depend({elements.aimbot.auto_air_stop.settings.addons, 'Hitchance limit'}) pui.traverse(elements.aimbot.aimbot_helper.settings, function (ref) ref:depend({elements.aimbot.aimbot_helper.enable, true}) end) pui.traverse(elements.aimbot.aimbot_helper.settings.ssg, function (ref) ref:depend({elements.aimbot.aimbot_helper.settings.weapon, 'SSG-08'}) end) pui.traverse({elements.aimbot.aimbot_helper.settings.ssg.force_safe, elements.aimbot.aimbot_helper.settings.ssg.force_safe_hp, elements.aimbot.aimbot_helper.settings.ssg.force_safe_miss}, function (ref) ref:depend({elements.aimbot.aimbot_helper.settings.ssg.select, 'Force safe point'}) end) elements.aimbot.aimbot_helper.settings.ssg.force_safe_hp:depend({elements.aimbot.aimbot_helper.settings.ssg.force_safe, 'Enemy HP < X'}) elements.aimbot.aimbot_helper.settings.ssg.force_safe_miss:depend({elements.aimbot.aimbot_helper.settings.ssg.force_safe, 'X Missed Shots'}) pui.traverse({elements.aimbot.aimbot_helper.settings.ssg.prefer_body, elements.aimbot.aimbot_helper.settings.ssg.prefer_body_hp, elements.aimbot.aimbot_helper.settings.ssg.prefer_body_miss}, function (ref) ref:depend({elements.aimbot.aimbot_helper.settings.ssg.select, 'Prefer body aim'}) end) elements.aimbot.aimbot_helper.settings.ssg.prefer_body_hp:depend({elements.aimbot.aimbot_helper.settings.ssg.prefer_body, 'Enemy HP < X'}) elements.aimbot.aimbot_helper.settings.ssg.prefer_body_miss:depend({elements.aimbot.aimbot_helper.settings.ssg.prefer_body, 'X Missed Shots'}) pui.traverse({elements.aimbot.aimbot_helper.settings.ssg.force_body, elements.aimbot.aimbot_helper.settings.ssg.force_body_hp, elements.aimbot.aimbot_helper.settings.ssg.force_body_miss}, function (ref) ref:depend({elements.aimbot.aimbot_helper.settings.ssg.select, 'Force body aim'}) end) elements.aimbot.aimbot_helper.settings.ssg.force_body_hp:depend({elements.aimbot.aimbot_helper.settings.ssg.force_body, 'Enemy HP < X'}) elements.aimbot.aimbot_helper.settings.ssg.force_body_miss:depend({elements.aimbot.aimbot_helper.settings.ssg.force_body, 'X Missed Shots'}) elements.aimbot.aimbot_helper.settings.ssg.ping_spike_value:depend({elements.aimbot.aimbot_helper.settings.ssg.select, 'Ping spike'}) pui.traverse(elements.aimbot.aimbot_helper.settings.awp, function (ref) ref:depend({elements.aimbot.aimbot_helper.settings.weapon, 'AWP'}) end) pui.traverse({elements.aimbot.aimbot_helper.settings.awp.force_safe, elements.aimbot.aimbot_helper.settings.awp.force_safe_hp, elements.aimbot.aimbot_helper.settings.awp.force_safe_miss}, function (ref) ref:depend({elements.aimbot.aimbot_helper.settings.awp.select, 'Force safe point'}) end) elements.aimbot.aimbot_helper.settings.awp.force_safe_hp:depend({elements.aimbot.aimbot_helper.settings.awp.force_safe, 'Enemy HP < X'}) elements.aimbot.aimbot_helper.settings.awp.force_safe_miss:depend({elements.aimbot.aimbot_helper.settings.awp.force_safe, 'X Missed Shots'}) pui.traverse({elements.aimbot.aimbot_helper.settings.awp.prefer_body, elements.aimbot.aimbot_helper.settings.awp.prefer_body_hp, elements.aimbot.aimbot_helper.settings.awp.prefer_body_miss}, function (ref) ref:depend({elements.aimbot.aimbot_helper.settings.awp.select, 'Prefer body aim'}) end) elements.aimbot.aimbot_helper.settings.awp.prefer_body_hp:depend({elements.aimbot.aimbot_helper.settings.awp.prefer_body, 'Enemy HP < X'}) elements.aimbot.aimbot_helper.settings.awp.prefer_body_miss:depend({elements.aimbot.aimbot_helper.settings.awp.prefer_body, 'X Missed Shots'}) pui.traverse({elements.aimbot.aimbot_helper.settings.awp.force_body, elements.aimbot.aimbot_helper.settings.awp.force_body_hp, elements.aimbot.aimbot_helper.settings.awp.force_body_miss}, function (ref) ref:depend({elements.aimbot.aimbot_helper.settings.awp.select, 'Force body aim'}) end) elements.aimbot.aimbot_helper.settings.awp.force_body_hp:depend({elements.aimbot.aimbot_helper.settings.awp.force_body, 'Enemy HP < X'}) elements.aimbot.aimbot_helper.settings.awp.force_body_miss:depend({elements.aimbot.aimbot_helper.settings.awp.force_body, 'X Missed Shots'}) elements.aimbot.aimbot_helper.settings.awp.ping_spike_value:depend({elements.aimbot.aimbot_helper.settings.awp.select, 'Ping spike'}) pui.traverse(elements.aimbot.aimbot_helper.settings.auto, function (ref) ref:depend({elements.aimbot.aimbot_helper.settings.weapon, 'Auto Snipers'}) end) pui.traverse({elements.aimbot.aimbot_helper.settings.auto.force_safe, elements.aimbot.aimbot_helper.settings.auto.force_safe_hp, elements.aimbot.aimbot_helper.settings.auto.force_safe_miss}, function (ref) ref:depend({elements.aimbot.aimbot_helper.settings.auto.select, 'Force safe point'}) end) elements.aimbot.aimbot_helper.settings.auto.force_safe_hp:depend({elements.aimbot.aimbot_helper.settings.auto.force_safe, 'Enemy HP < X'}) elements.aimbot.aimbot_helper.settings.auto.force_safe_miss:depend({elements.aimbot.aimbot_helper.settings.auto.force_safe, 'X Missed Shots'}) pui.traverse({elements.aimbot.aimbot_helper.settings.auto.prefer_body, elements.aimbot.aimbot_helper.settings.auto.prefer_body_hp, elements.aimbot.aimbot_helper.settings.auto.prefer_body_miss}, function (ref) ref:depend({elements.aimbot.aimbot_helper.settings.auto.select, 'Prefer body aim'}) end) elements.aimbot.aimbot_helper.settings.auto.prefer_body_hp:depend({elements.aimbot.aimbot_helper.settings.auto.prefer_body, 'Enemy HP < X'}) elements.aimbot.aimbot_helper.settings.auto.prefer_body_miss:depend({elements.aimbot.aimbot_helper.settings.auto.prefer_body, 'X Missed Shots'}) pui.traverse({elements.aimbot.aimbot_helper.settings.auto.force_body, elements.aimbot.aimbot_helper.settings.auto.force_body_hp, elements.aimbot.aimbot_helper.settings.auto.force_body_miss}, function (ref) ref:depend({elements.aimbot.aimbot_helper.settings.auto.select, 'Force body aim'}) end) elements.aimbot.aimbot_helper.settings.auto.force_body_hp:depend({elements.aimbot.aimbot_helper.settings.auto.force_body, 'Enemy HP < X'}) elements.aimbot.aimbot_helper.settings.auto.force_body_miss:depend({elements.aimbot.aimbot_helper.settings.auto.force_body, 'X Missed Shots'}) elements.aimbot.aimbot_helper.settings.auto.ping_spike_value:depend({elements.aimbot.aimbot_helper.settings.auto.select, 'Ping spike'}) elements.aimbot.aimbot_helper.settings.ssg.mp_lower:depend({elements.aimbot.aimbot_helper.settings.ssg.select, 'Adaptive multipoint'}) elements.aimbot.aimbot_helper.settings.ssg.mp_upper:depend({elements.aimbot.aimbot_helper.settings.ssg.select, 'Adaptive multipoint'}) elements.aimbot.aimbot_helper.settings.awp.mp_lower:depend({elements.aimbot.aimbot_helper.settings.awp.select, 'Adaptive multipoint'}) elements.aimbot.aimbot_helper.settings.awp.mp_upper:depend({elements.aimbot.aimbot_helper.settings.awp.select, 'Adaptive multipoint'}) elements.aimbot.aimbot_helper.settings.auto.mp_lower:depend({elements.aimbot.aimbot_helper.settings.auto.select, 'Adaptive multipoint'}) elements.aimbot.aimbot_helper.settings.auto.mp_upper:depend({elements.aimbot.aimbot_helper.settings.auto.select, 'Adaptive multipoint'}) elements.aimbot.auto_hs.enablers:depend({elements.aimbot.auto_hs.enable, true}) elements.aimbot.auto_hs.states:depend({elements.aimbot.auto_hs.enable, true}) elements.aimbot.predict_enemies.info_label:depend({elements.aimbot.predict_enemies.enable, true}) elements.aimbot.dormant_aimbot.info_label:depend({elements.aimbot.dormant_aimbot.enable, true}) elements.aimbot.extended_backtrack.info_label:depend({elements.aimbot.extended_backtrack.enable, true}) elements.aimbot.auto_tp.mode:depend({elements.aimbot.auto_tp.enable, true}) elements.aimbot.auto_tp.auto_discharge:depend({elements.aimbot.auto_tp.enable, true}) elements.aimbot.auto_tp.auto_discharge:depend({elements.aimbot.auto_tp.mode, "Semi automatic teleport"}) elements.aimbot.auto_air_stop.settings.addons:depend({elements.aimbot.auto_air_stop.enable, true}) elements.aimbot.auto_air_stop.settings.distance:depend({elements.aimbot.auto_air_stop.enable, true}) elements.aimbot.resolver.settings.mode:depend({elements.aimbot.resolver.enable, true}) pui.traverse(elements.aimbot.ai_peek.settings, function (ref) ref:depend({elements.aimbot.ai_peek.enable, true}) end) pui.traverse(elements.aimbot.game_enhancer.settings, function (ref) ref:depend({elements.aimbot.game_enhancer.enable, true}) end) pui.traverse(elements.visuals, function (ref) ref:depend({tab.main, ' Module Suite'}, {elements.tab.combo, ' Visual Options'}) end) pui.traverse(elements.visuals.crosshair.settings, function (ref) ref:depend({elements.visuals.crosshair.enable, true}) end) pui.traverse(elements.visuals.arrows.settings, function (ref) ref:depend({elements.visuals.arrows.enable, true}) end) elements.visuals.arrows.settings.style:depend({elements.visuals.arrows.settings.type, 'Pointers'}) elements.visuals.arrows.settings.hide_on_thirdperson:depend({elements.visuals.arrows.settings.type, 'Semicircle'}) pui.traverse(elements.visuals.scope.settings, function (ref) ref:depend({elements.visuals.scope.enable, true}) end) pui.traverse(elements.visuals.zoom.settings, function (ref) ref:depend({elements.visuals.zoom.enable, true}) end) pui.traverse(elements.visuals.aspect_ratio.settings, function (ref) ref:depend({elements.visuals.aspect_ratio.enable, true}) end) pui.traverse(elements.visuals.viewmodel.settings, function (ref) ref:depend({elements.visuals.viewmodel.enable, true}) end) pui.traverse(elements.visuals.watermark.settings, function (ref) ref:depend({elements.visuals.windows, 'Watermark'}) end) elements.visuals.watermark.settings.nickname:depend({elements.visuals.watermark.settings.elements, 'Nickname'}) elements.visuals.watermark.settings.custom:depend({elements.visuals.watermark.settings.elements, 'Nickname'}, {elements.visuals.watermark.settings.nickname, 'Custom'}) pui.traverse(elements.visuals.event_logger.settings, function (ref) ref:depend({elements.visuals.windows, 'Event logger'}) end) pui.traverse(elements.visuals.damage.settings, function (ref) ref:depend({elements.visuals.damage.enable, true}) end) pui.traverse(elements.visuals.markers.settings, function (ref) ref:depend({elements.visuals.markers.enable, true}) end) pui.traverse(elements.visuals.hitrate.settings, function (ref) ref:depend({elements.visuals.hitrate.enable, true}) end) pui.traverse(elements.misc, function (ref) ref:depend({tab.main, ' Module Suite'}, {elements.tab.combo, ' Misc Options'}) end) pui.traverse(elements.misc.drop_nades.settings, function (ref) ref:depend({elements.misc.drop_nades.enable, true}) end) pui.traverse(elements.misc.autobuy.settings, function (ref) ref:depend({elements.misc.autobuy.enable, true}) end) pui.traverse(elements.misc.animations.settings, function (ref) ref:depend({elements.misc.animations.enable, true}) end) pui.traverse(elements.misc.animations.settings.running, function (ref) ref:depend({elements.misc.animations.settings.condition, 'On ground'}) end) pui.traverse(elements.misc.animations.settings.in_air, function (ref) ref:depend({elements.misc.animations.settings.condition, 'In air'}) end) pui.traverse(elements.misc.animations.settings.running.anim_bodylean, function (ref) ref:depend({elements.misc.animations.settings.running.anim_extra_type, 'Body lean'}) end) pui.traverse({elements.misc.animations.settings.running.anim_min_jitter, elements.misc.animations.settings.running.anim_max_jitter}, function (ref) ref:depend({elements.misc.animations.settings.running.anim_type, 'Jitter'}) end) pui.traverse(elements.misc.animations.settings.in_air.anim_bodylean, function (ref) ref:depend({elements.misc.animations.settings.in_air.anim_extra_type, 'Body lean'}) end) pui.traverse({elements.misc.animations.settings.in_air.anim_min_jitter, elements.misc.animations.settings.in_air.anim_max_jitter}, function (ref) ref:depend({elements.misc.animations.settings.in_air.anim_type, 'Jitter'}) end) pui.traverse(elements.misc.trash_talk.settings, function (ref) ref:depend({elements.misc.trash_talk.enable, true}) end) end local colors = { combobox = menu.group.anti_aim.fakelag:combobox('\v \rColor \vcustom', {'Menu', 'Custom'}), custom = { type = menu.group.anti_aim.fakelag:combobox('\v• \rType', {'Solid', 'Gradient'}), color_1 = menu.group.anti_aim.fakelag:color_picker('\nColor 1', 255, 255, 255, 255), color_2 = menu.group.anti_aim.fakelag:color_picker('\nColor 2', 222, 200, 255, 255), color_3 = menu.group.anti_aim.fakelag:color_picker('\nColor 3', 255, 111, 111, 255), color_4 = menu.group.anti_aim.fakelag:color_picker('\nColor 4', 255, 255, 255, 255), select = menu.group.anti_aim.fakelag:multiselect('\v• \rEnabled', {'Text brand', 'Watermark', 'Keybinds', --[['Debug panel', 'Multi panel',]] 'Event logger', 'Crosshair', 'Arrows', 'Scope'}), } } do pui.traverse(colors, function (ref) ref:depend({tab.main, ' Module Suite'}, {elements.tab.combo, ' Visual Options'}) end) pui.traverse(colors.custom, function (ref) ref:depend({colors.combobox, 'Custom'}) end) pui.traverse({colors.custom.color_2, colors.custom.color_3, colors.custom.color_4, colors.custom.select}, function (ref) ref:depend({colors.custom.type, 'Gradient'}) end) end local drag_slider = { crosshair = { y = menu.group.anti_aim.main:slider('Y Crosshair', 0, screen_size_y(), helpers:clamp(screen_size_y() / 2 + 20, 0, screen_size_y() - 76)), }, arrows = { x = menu.group.anti_aim.main:slider('X Arrows', 0, screen_size_x(), helpers:clamp(screen_size_x() / 2 + 30, 0, screen_size_x() - 147)), }, advert = { text_style = menu.group.anti_aim.main:combobox('Text style', {'Default', 'Bold', 'Small'}), x = menu.group.anti_aim.main:slider('X Advert Watermark', 0, screen_size_x(), helpers:clamp(15, 0, screen_size_x() - 147)), y = menu.group.anti_aim.main:slider('Y Advert Watermark', 0, screen_size_y(), helpers:clamp(screen_size_y() / 2 - 20, 0, screen_size_y() - 76)), }, windows = { watermark = { x = menu.group.anti_aim.main:slider('X Watermark', 0, screen_size_x(), helpers:clamp(screen_size_x(), 0, screen_size_x() - 5)), y = menu.group.anti_aim.main:slider('Y Watermark', 0, screen_size_y(), helpers:clamp(screen_size_y(), 0, screen_size_y() / 168)), }, keybinds = { x = menu.group.anti_aim.main:slider('X Keybinds', 0, screen_size_x(), helpers:clamp(screen_size_x(), 0, screen_size_x() * 0.7)), y = menu.group.anti_aim.main:slider('Y Keybinds', 0, screen_size_y(), helpers:clamp(screen_size_y(), 0, screen_size_y() / 2 - 60)), }, event_logger = { x = menu.group.anti_aim.main:slider('X Event logger', 0, screen_size_x(), helpers:clamp(screen_size_x(), 0, screen_size_x() / 2 - 100)), y = menu.group.anti_aim.main:slider('Y Event logger', 0, screen_size_y(), helpers:clamp(screen_size_y(), 0, screen_size_y() / 2 + 400)), }, debug_panel = { x = menu.group.anti_aim.main:slider('X Debug panel', 0, screen_size_x(), helpers:clamp(20, 0, screen_size_x() - 147)), y = menu.group.anti_aim.main:slider('Y Debug panel', 0, screen_size_y(), helpers:clamp(screen_size_y() / 2 - 400, 0, screen_size_y() - 76)), }, multi_panel = { x = menu.group.anti_aim.main:slider('X Multi panel', 0, screen_size_x(), helpers:clamp(screen_size_x() / 2, 0, screen_size_x() - 147)), y = menu.group.anti_aim.main:slider('Y Multi panel', 0, screen_size_y(), helpers:clamp(screen_size_y() / 2 - 400, 0, screen_size_y() - 76)), }, }, damage_indicator = { x = menu.group.anti_aim.main:slider('X Damage indicator', 0, screen_size_x(), helpers:clamp(screen_size_x() / 2 + 5, 0, screen_size_x() - 147)), y = menu.group.anti_aim.main:slider('Y Damage indicator', 0, screen_size_y(), helpers:clamp(screen_size_y() / 2 - 10, 0, screen_size_y() - 76)), }, } do pui.traverse(drag_slider, function (ref) ref:set_visible(false) end) end --- local lc = { last_simtime = 0, origin = vector(0, 0, 0), state = false } local function is_breaking_velocity_lc () local me = entity.get_local_player() local new_origin = vector(entity.get_origin(me)) local simtime = toticks(entity.get_prop(me, 'm_flSimulationTime')) local delta = simtime - lc.last_simtime if delta > 0 then if lc.origin:length() > 0 then lc.state = (lc.origin - new_origin):length2dsqr() > 4096 end lc.origin = new_origin lc.last_simtime = simtime end return lc.state end local fakelag = { choked = 0, active = false }; do fakelag.handle = function (e) fakelag.choked = e.chokedcommands fakelag.active = false if reference.antiaim.fakelag.enabled:get() then if reference.antiaim.fakelag.limit:get() > 2 then if reference.rage.aimbot.double_tap[1].value and reference.rage.aimbot.double_tap[1].hotkey:get() and not reference.rage.other.fake_duck:get() then if fakelag.choked > reference.rage.aimbot.double_tap_limit:get() then fakelag.active = true end elseif reference.antiaim.other.on_shot_anti_aim[1].value and reference.antiaim.other.on_shot_anti_aim[1].hotkey:get() and not reference.rage.other.fake_duck:get() then if fakelag.choked > 1 then fakelag.active = true end else if fakelag.choked ~= nil then fakelag.active = true end end end end end client.set_event_callback('run_command', fakelag.handle) end local anti_backstab = false local builder = { }; do builder.conditions = {'Global', 'Stand', 'Run', 'Walk', 'Crouch', 'Sneak', 'Air', 'Air+', 'Fake lag', 'Freestanding', 'Manual left', 'Manual right'} builder.alternative_conditions = { } for _, condition in ipairs(builder.conditions) do local prefix = coloring.set_color_macro(false) local suffix = coloring.set_color_macro(true) table.insert(builder.alternative_conditions, string.format('\a%s\a%s\v%s', prefix, suffix, condition)) end builder.state = 'Global' builder.d_state = 'Global' elements.conditions = { } elements.conditions.select = menu.group.anti_aim.main:combobox('\v\r  Player \vState', builder.alternative_conditions) local is_tab_antiaim = {tab.main, ' Angle Matrix'} elements.conditions.select:depend(is_tab_antiaim, {elements.anti_aim.tab, ' Debug', true}, {elements.anti_aim.tab, ' Fakelag', true}) elements.conditions.select_2 = menu.group.anti_aim.main:combobox('\v\r  Player state', builder.conditions) elements.conditions.select_2:set_visible(false) elements.conditions.select:set_callback(function (ref) for _, condition in ipairs(builder.alternative_conditions) do if ref:get() == condition then elements.conditions.select_2:set(builder.conditions[_]) end end end) for i, state in pairs(builder.conditions) do local colored_state = builder.alternative_conditions[i] elements.conditions[state] = { enable = menu.group.anti_aim.main:combobox('\v\r  Enable ' .. colored_state, {'Off', 'On'}), yaw_mode = menu.group.anti_aim.main:combobox('\v\r  Yaw \vmode \n' .. state, {'Off', 'Offset', 'Left/Right'}), offset = menu.group.anti_aim.main:slider('\v• \rYaw offset \n' .. state, -180, 180, 0, true, '°'), left = menu.group.anti_aim.main:slider('\v• \rYaw left \n' .. state, -180, 180, 0, true, '°'), left_randomization = menu.group.anti_aim.main:slider('\v• \rYaw left random \n' .. state, 0, 100, 0, true, '%'), right = menu.group.anti_aim.main:slider('\v• \rYaw right \n' .. state, -180, 180, 0, true, '°'), right_randomization = menu.group.anti_aim.main:slider('\v• \rYaw right random \n' .. state, 0, 100, 0, true, '%'), yaw_base = menu.group.anti_aim.main:combobox('\v\r  Yaw \vbase \n' .. state, {'Local view', 'At targets'}), modifier = menu.group.anti_aim.main:combobox('\v\r  Yaw \vmodifier \n' .. state, {'Off', 'Offset', 'Center', 'Ground-based', 'X-way', 'Random'}), ideal_yaw = menu.group.anti_aim.main:checkbox('\v• \rIdeal yaw \n' .. state), modifier_offset = menu.group.anti_aim.main:slider('\v• \rModifier Offset \n' .. state, -180, 180, 0, true, '°'), modifier_offset_2 = menu.group.anti_aim.main:slider('\v• \rModifier Offset #2 \n' .. state, -180, 180, 0, true, '°'), modifier_randomization = menu.group.anti_aim.main:slider('\v• \rRandomization \n' .. state, 0, 100, 0, true, '%'), x_way = { method = menu.group.anti_aim.main:combobox('\v• \rMethod \n' .. state, {'Skitter', 'Tickcount'}), type = menu.group.anti_aim.main:combobox('\v• \rType \n' .. state, {'Auto', 'Custom'}), ways = menu.group.anti_aim.main:slider('\v• \rWays \n' .. state, 3, 10, 3, true, 'w'), auto_offset = menu.group.anti_aim.main:slider('\v• \rAuto offset \n' .. state, -180, 180, 0, true, '°'), first_offset = menu.group.anti_aim.main:slider('\v• \rFirst offset \n' .. state, -180, 180, 0, true, '°'), second_offset = menu.group.anti_aim.main:slider('\v• \rSecond offset \n' .. state, -180, 180, 0, true, '°'), third_offset = menu.group.anti_aim.main:slider('\v• \rThird offset \n' .. state, -180, 180, 0, true, '°'), fourth_offset = menu.group.anti_aim.main:slider('\v• \rFourth offset \n' .. state, -180, 180, 0, true, '°'), fifth_offset = menu.group.anti_aim.main:slider('\v• \rFifth offset \n' .. state, -180, 180, 0, true, '°'), sixth_offset = menu.group.anti_aim.main:slider('\v• \rSixth offset \n' .. state, -180, 180, 0, true, '°'), seventh_offset = menu.group.anti_aim.main:slider('\v• \rSeventh offset \n' .. state, -180, 180, 0, true, '°'), eighth_offset = menu.group.anti_aim.main:slider('\v• \rEighth offset \n' .. state, -180, 180, 0, true, '°'), ninth_offset = menu.group.anti_aim.main:slider('\v• \rNinth offset \n' .. state, -180, 180, 0, true, '°'), tenth_offset = menu.group.anti_aim.main:slider('\v• \rTenth offset \n' .. state, -180, 180, 0, true, '°'), }, body_yaw = menu.group.anti_aim.main:combobox('\v\r  Body \vyaw \n' .. state, {'Off', 'Opposite', 'Static', 'Jitter'}), body_side = menu.group.anti_aim.main:combobox('\v• \rBody side \n' .. state, {'180', '0', '-180'}), fs_body_yaw = menu.group.anti_aim.main:checkbox('\v• \rFreestanding body yaw \n' .. state), addons = menu.group.anti_aim.main:multiselect('\v\r  Delay \voptions \n' .. state, {'Randomize Delay Ticks', 'Freeze-Inverter'}), delay = menu.group.anti_aim.main:slider('\v\r  Body \vdelay \n' .. state, 1, 17, 1, true, 't', 1, {[1] = 'OFF'}), small_delay_min_toggle = menu.group.anti_aim.main:checkbox('\v• \rToggle body small min. delay \n' .. state), small_delay_min = menu.group.anti_aim.main:slider('\v• \rBody small min. delay \n' .. state, 1, 12, 1, true, 't', 0.2), delay_min = menu.group.anti_aim.main:slider('\v• \rBody Min. delay \n' .. state, 1, 17, 1, true, 't', 1, {[1] = 'OFF'}), small_delay_max_toggle = menu.group.anti_aim.main:checkbox('\v• \rToggle body small max. delay \n' .. state), small_delay_max = menu.group.anti_aim.main:slider('\v• \rBody small max. delay \n' .. state, 1, 12, 1, true, 't', 0.2), delay_max = menu.group.anti_aim.main:slider('\v• \rBody Max. delay \n' .. state, 1, 17, 17, true, 't', 1, {[1] = 'OFF'}), freeze_chance = menu.group.anti_aim.main:slider('\v• \rBody freeze chance \n' .. state, 1, 100, 18, true, '%', 1), freeze_time = menu.group.anti_aim.main:slider('\v• \rBody freeze time \n' .. state, 1, 200, 30, true, 'ms', 1) } end do for i, state in pairs(builder.conditions) do local colored_state = builder.alternative_conditions[i] local condition = elements.conditions[state] local is_condition = {elements.conditions.select, colored_state} local disable_shared = {elements.conditions.select, function () return (i ~= 1) end} local is_enabled = {condition.enable, function () if i == 1 then return true else return condition.enable:get() == "On" end end} local fakelag_state = {elements.conditions.select, function () if i == 9 then return false else return true end end} local function not_disabled(val) return function () return condition[val]:get() ~= 'Off' end end condition.enable:depend(is_tab_antiaim, is_condition, disable_shared, {elements.anti_aim.tab, ' Antiaim'}) condition.yaw_base:depend(is_tab_antiaim, is_condition, is_enabled, {elements.anti_aim.tab, ' Antiaim'}) condition.yaw_mode:depend(is_tab_antiaim, is_condition, is_enabled, {elements.anti_aim.tab, ' Antiaim'}) condition.offset:depend(is_tab_antiaim, is_condition, is_enabled, {condition.yaw_mode, 'Offset'}, {elements.anti_aim.tab, ' Antiaim'}) condition.left:depend(is_tab_antiaim, is_condition, is_enabled, {condition.yaw_mode, 'Left/Right'}, {elements.anti_aim.tab, ' Antiaim'}) condition.left_randomization:depend(is_tab_antiaim, is_condition, is_enabled, {condition.yaw_mode, 'Left/Right'}, {elements.anti_aim.tab, ' Antiaim'}) condition.right:depend(is_tab_antiaim, is_condition, is_enabled, {condition.yaw_mode, 'Left/Right'}, {elements.anti_aim.tab, ' Antiaim'}) condition.right_randomization:depend(is_tab_antiaim, is_condition, is_enabled, {condition.yaw_mode, 'Left/Right'}, {elements.anti_aim.tab, ' Antiaim'}) condition.modifier:depend(is_tab_antiaim, is_condition, is_enabled, {elements.anti_aim.tab, ' Antiaim'}) condition.ideal_yaw:depend(is_tab_antiaim, is_condition, is_enabled, {condition.modifier, function () return condition.modifier:get() ~= 'Off' and condition.modifier:get() ~= 'Custom' and condition.modifier:get() ~= 'X-way' end}, {elements.anti_aim.tab, ' Antiaim'}) condition.modifier_offset:depend(is_tab_antiaim, is_condition, is_enabled, {condition.modifier, function () return condition.modifier:get() ~= 'Off' and condition.modifier:get() ~= 'Custom' and condition.modifier:get() ~= 'X-way' end}, {elements.anti_aim.tab, ' Antiaim'}) condition.modifier_offset_2:depend(is_tab_antiaim, is_condition, is_enabled, {condition.modifier, function () return condition.modifier:get() ~= 'Off' and condition.modifier:get() ~= 'Custom' and condition.modifier:get() ~= 'X-way' end}, {condition.ideal_yaw, true}, {elements.anti_aim.tab, ' Antiaim'}) condition.modifier_randomization:depend(is_tab_antiaim, is_condition, is_enabled, {condition.modifier, function () return condition.modifier:get() ~= 'Off' and condition.modifier:get() ~= 'Custom' and condition.modifier:get() ~= 'X-way' end}, {condition.ideal_yaw, false}, {elements.anti_aim.tab, ' Antiaim'}) pui.traverse(condition.x_way, function (ref) ref:depend(is_tab_antiaim, is_condition, is_enabled, {condition.modifier, 'X-way'}, {elements.anti_aim.tab, ' Antiaim'}) end) condition.x_way.auto_offset:depend({condition.x_way.type, 'Auto'}) for n = 1, 10 do local delay_slider = condition.x_way[string.format('%s_offset', ({ 'first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh', 'eighth', 'ninth', 'tenth' })[n])] if delay_slider then delay_slider:depend( {condition.x_way.type, 'Custom'}, {condition.x_way.ways, function (ref) return ref:get() >= n end} ) end end condition.body_yaw:depend(is_tab_antiaim, is_condition, is_enabled, {elements.anti_aim.tab, ' Antiaim'}) condition.body_side:depend(is_tab_antiaim, is_condition, is_enabled, {condition.body_yaw, not_disabled('body_yaw')}, {elements.anti_aim.tab, ' Antiaim'}, {condition.body_yaw, function () if condition.body_yaw:get() == 'Opposite' or condition.body_yaw:get() == 'Jitter' then return false else return true end end}) condition.fs_body_yaw:depend(is_tab_antiaim, is_condition, is_enabled, {condition.body_yaw, not_disabled('body_yaw')}, {elements.anti_aim.tab, ' Antiaim'}) condition.delay:depend(is_tab_antiaim, is_condition, is_enabled, {condition.body_yaw, not_disabled('body_yaw')}, {elements.anti_aim.tab, ' Antiaim'}, {condition.addons, function () if not condition.ideal_yaw:get() and condition.addons:get('Randomize Delay Ticks') then return false else return true end end}) condition.small_delay_min_toggle:depend(is_tab_antiaim, is_condition, is_enabled, {condition.body_yaw, not_disabled('body_yaw')}, {elements.anti_aim.tab, ' Antiaim'}, {condition.ideal_yaw, false}, {condition.addons, 'Randomize Delay Ticks'}) condition.small_delay_min:depend(is_tab_antiaim, is_condition, is_enabled, {condition.body_yaw, not_disabled('body_yaw')}, {elements.anti_aim.tab, ' Antiaim'}, {condition.ideal_yaw, false}, {condition.addons, 'Randomize Delay Ticks'}, {condition.small_delay_min_toggle, true}) condition.delay_min:depend(is_tab_antiaim, is_condition, is_enabled, {condition.body_yaw, not_disabled('body_yaw')}, {elements.anti_aim.tab, ' Antiaim'}, {condition.ideal_yaw, false}, {condition.addons, 'Randomize Delay Ticks'}, {condition.small_delay_min_toggle, false}) condition.small_delay_max_toggle:depend(is_tab_antiaim, is_condition, is_enabled, {condition.body_yaw, not_disabled('body_yaw')}, {elements.anti_aim.tab, ' Antiaim'}, {condition.ideal_yaw, false}, {condition.addons, 'Randomize Delay Ticks'}) condition.small_delay_max:depend(is_tab_antiaim, is_condition, is_enabled, {condition.body_yaw, not_disabled('body_yaw')}, {elements.anti_aim.tab, ' Antiaim'}, {condition.ideal_yaw, false}, {condition.addons, 'Randomize Delay Ticks'}, {condition.small_delay_max_toggle, true}) condition.delay_max:depend(is_tab_antiaim, is_condition, is_enabled, {condition.body_yaw, not_disabled('body_yaw')}, {elements.anti_aim.tab, ' Antiaim'}, {condition.ideal_yaw, false}, {condition.addons, 'Randomize Delay Ticks'}, {condition.small_delay_max_toggle, false}) condition.freeze_chance:depend(is_tab_antiaim, is_condition, is_enabled, {condition.body_yaw, not_disabled('body_yaw')}, {elements.anti_aim.tab, ' Antiaim'}, {condition.ideal_yaw, false}, {condition.addons, 'Freeze-Inverter'}) condition.freeze_time:depend(is_tab_antiaim, is_condition, is_enabled, {condition.body_yaw, not_disabled('body_yaw')}, {elements.anti_aim.tab, ' Antiaim'}, {condition.ideal_yaw, false}, {condition.addons, 'Freeze-Inverter'}) condition.addons:depend(is_tab_antiaim, is_condition, is_enabled, {condition.body_yaw, not_disabled('body_yaw')}, {condition.ideal_yaw, false}, {elements.anti_aim.tab, ' Antiaim'}) end end elements.defensive = { } for i, state in pairs(builder.conditions) do local colored_state = builder.alternative_conditions[i] elements.defensive[state] = { enable = menu.group.anti_aim.main:combobox('\v\r  Enable ' .. colored_state .. ' \nD', {'Off', 'On'}), def = menu.group.anti_aim.other:label('\v \rActivation \vConditions'), space401 = menu.group.anti_aim.other:label('\a464646CC¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯'), defensive_on = menu.group.anti_aim.other:multiselect('\v \rDefensive \vwork \nD_' .. state, {'Double tap', 'Hide shots'}), defensive_mode = menu.group.anti_aim.other:combobox('\v \rDefensive \vmode \nD_' .. state, {'On peek', 'Always on'}), yaw = menu.group.anti_aim.main:combobox('\v\r  Yaw \vtype \nD_' .. state, {'Off', '180', 'Spin', 'Distortion', 'Sway', 'Freestand'}), yaw_mode = menu.group.anti_aim.main:combobox('\v\r  Yaw \vmode \nD_' .. state, {'Off', 'Offset', 'Left/Right'}), yaw_generation = menu.group.anti_aim.main:checkbox('\v• \rYaw min - max mode \nD_' .. state), speed = menu.group.anti_aim.main:slider('\v• \rYaw speed \nD_' .. state, 1, 17, 4, true, 't'), offset = menu.group.anti_aim.main:slider('\v• \rYaw offset \nD_' .. state, -180, 180, 0, true, '°'), left = menu.group.anti_aim.main:slider('\v• \rYaw left \nD_' .. state, -180, 180, 0, true, '°'), right = menu.group.anti_aim.main:slider('\v• \rYaw right \nD_' .. state, -180, 180, 0, true, '°'), min_gen = menu.group.anti_aim.main:slider('\v• \rYaw min \nD_' .. state, -180, 180, -20, true, '°-'), max_gen = menu.group.anti_aim.main:slider('\v• \rYaw max \nD_' .. state, -180, 180, 20, true, '°+'), pitch_mode = menu.group.anti_aim.main:combobox('\v\r  Pitch \vmode \nD_' .. state, {'Off', 'Static', 'Spin', 'Sway', 'Jitter', 'Cycling', 'Random'}), pitch_min_max = menu.group.anti_aim.main:checkbox('\v• \rPitch min - max mode \nD_' .. state), pitch_height_based = menu.group.anti_aim.main:checkbox('\v• \rPitch preset based value \nD_' .. state), pitch_speed = menu.group.anti_aim.main:slider('\v• \rPitch speed \nD_' .. state, 1, 17, 2, true, 't'), pitch = menu.group.anti_aim.main:slider('\v• \rPitch \nD_' .. state, -89, 89, 0, true, '°'), pitch_min = menu.group.anti_aim.main:slider('\v• \rPitch min \nD_' .. state, -89, 89, 0, true, '°'), pitch_max = menu.group.anti_aim.main:slider('\v• \rPitch max \nD_' .. state, -89, 89, 0, true, '°'), addons = menu.group.anti_aim.main:multiselect('\v\r  Delay \voptions \nD_' .. state, {'Randomize Delay Ticks', 'Freeze-Inverter'}), delay = menu.group.anti_aim.main:slider('\v\r  Body \vdelay \nD_' .. state, 1, 34, 1, true, 't', 1, {[1] = 'OFF'}), delay_min = menu.group.anti_aim.main:slider('\v• \rBody Min. delay \nD_' .. state, 1, 34, 1, true, 't', 1, {[1] = 'OFF'}), delay_max = menu.group.anti_aim.main:slider('\v• \rBody Max. delay \nD_' .. state, 1, 34, 34, true, 't', 1, {[1] = 'OFF'}), freeze_chance = menu.group.anti_aim.main:slider('\v• \rBody freeze chance \nD_' .. state, 1, 100, 18, true, '%', 1), freeze_time = menu.group.anti_aim.main:slider('\v• \rBody freeze time \nD_' .. state, 1, 200, 30, true, 'ms', 1), duration = menu.group.anti_aim.main:slider('\v\r  Tick \vduration \nD_' .. state, 1, 15, 12, true, 't', 1, {[1] = 'Off', [12] = 'Default', [15] = 'Maximum'}) } end do for i, state in pairs(builder.conditions) do local colored_state = builder.alternative_conditions[i] local condition = elements.defensive[state] local is_condition = {elements.conditions.select, colored_state} local disable_shared = {elements.conditions.select, function () return (i ~= 1) end} local is_enabled = {condition.enable, function () if i == 1 then return true else return condition.enable:get() == "On" end end} local fakelag_state = {elements.conditions.select, function () if i == 9 then return false else return true end end} local function not_disabled(val) return function () return condition[val]:get() ~= 'Off' end end condition.enable:depend(is_tab_antiaim, is_condition, disable_shared, fakelag_state, {elements.anti_aim.tab, ' Defensive'}) condition.def:depend(is_tab_antiaim, is_condition, fakelag_state, {elements.anti_aim.tab, ' Defensive'}) condition.space401:depend(is_tab_antiaim, is_condition, fakelag_state, {elements.anti_aim.tab, ' Defensive'}) condition.defensive_on:depend(is_tab_antiaim, is_condition, fakelag_state, {elements.anti_aim.tab, ' Defensive'}) condition.defensive_mode:depend(is_tab_antiaim, is_condition, fakelag_state, {elements.anti_aim.tab, ' Defensive'}) condition.duration:depend(is_tab_antiaim, is_condition, is_enabled, fakelag_state, {elements.anti_aim.tab, ' Defensive'}) condition.pitch_min_max:depend(is_tab_antiaim, is_condition, is_enabled, fakelag_state, {condition.pitch_height_based, false}, {condition.pitch_mode, 'Off', true}, {elements.anti_aim.tab, ' Defensive'}) condition.pitch_height_based:depend(is_tab_antiaim, is_condition, is_enabled, fakelag_state, {condition.pitch_mode, 'Off', true}, {elements.anti_aim.tab, ' Defensive'}) condition.yaw_mode:depend(is_tab_antiaim, is_condition, is_enabled, fakelag_state, {condition.yaw, not_disabled('yaw')}, {elements.anti_aim.tab, ' Defensive'}) condition.yaw_generation:depend(is_tab_antiaim, is_condition, is_enabled, fakelag_state, {condition.yaw, not_disabled('yaw')}, {condition.yaw_mode, 'Off', true}, {elements.anti_aim.tab, ' Defensive'}) condition.yaw:depend(is_tab_antiaim, is_condition, is_enabled, fakelag_state, {elements.anti_aim.tab, ' Defensive'}) condition.speed:depend(is_tab_antiaim, is_condition, is_enabled, fakelag_state, {condition.yaw, function () if condition.yaw:get() == 'Off' or condition.yaw:get() == '180' or condition.yaw:get() == 'Spin' or condition.yaw:get() == 'Freestand' then return false else return true end end}, {elements.anti_aim.tab, ' Defensive'}) condition.offset:depend(is_tab_antiaim, is_condition, is_enabled, fakelag_state, {condition.yaw, not_disabled('yaw')}, {condition.yaw_mode, 'Offset'}, {elements.anti_aim.tab, ' Defensive'}) condition.left:depend(is_tab_antiaim, is_condition, is_enabled, fakelag_state, {condition.yaw, not_disabled('yaw')}, {condition.yaw_mode, 'Left/Right'}, {elements.anti_aim.tab, ' Defensive'}) condition.right:depend(is_tab_antiaim, is_condition, is_enabled, fakelag_state, {condition.yaw, not_disabled('yaw')}, {condition.yaw_mode, 'Left/Right'}, {elements.anti_aim.tab, ' Defensive'}) condition.min_gen:depend(is_tab_antiaim, is_condition, is_enabled, fakelag_state, {condition.yaw, not_disabled('yaw')}, {condition.yaw_generation, true}, {condition.yaw_mode, 'Off', true}, {elements.anti_aim.tab, ' Defensive'}) condition.max_gen:depend(is_tab_antiaim, is_condition, is_enabled, fakelag_state, {condition.yaw, not_disabled('yaw')}, {condition.yaw_generation, true}, {condition.yaw_mode, 'Off', true}, {elements.anti_aim.tab, ' Defensive'}) condition.pitch_mode:depend(is_tab_antiaim, is_condition, is_enabled, fakelag_state, {elements.anti_aim.tab, ' Defensive'}) condition.pitch_speed:depend(is_tab_antiaim, is_condition, is_enabled, fakelag_state, {elements.anti_aim.tab, ' Defensive'}, {condition.pitch_mode, function () if condition.pitch_mode:get() == 'Off' or condition.pitch_mode:get() == 'Static' or condition.pitch_mode:get() == 'Random' then return false else return true end end}) condition.pitch:depend(is_tab_antiaim, is_condition, is_enabled, fakelag_state, {condition.pitch_min_max, false}, {condition.pitch_height_based, false}, {condition.pitch_mode, 'Off', true}, {elements.anti_aim.tab, ' Defensive'}) condition.pitch_min:depend(is_tab_antiaim, is_condition, is_enabled, fakelag_state, {condition.pitch_min_max, true}, {condition.pitch_height_based, false}, {condition.pitch_mode, 'Off', true}, {elements.anti_aim.tab, ' Defensive'}) condition.pitch_max:depend(is_tab_antiaim, is_condition, is_enabled, fakelag_state, {condition.pitch_min_max, true}, {condition.pitch_height_based, false}, {condition.pitch_mode, 'Off', true}, {condition.pitch_mode, 'Static', true}, {elements.anti_aim.tab, ' Defensive'}) condition.delay:depend(is_tab_antiaim, is_condition, is_enabled, fakelag_state, {condition.enable, 'On'},{elements.anti_aim.tab, ' Defensive'}, {condition.addons, function () if condition.addons:get('Randomize Delay Ticks') then return false else return true end end}) condition.delay_min:depend(is_tab_antiaim, is_condition, is_enabled, fakelag_state, {elements.anti_aim.tab, ' Defensive'}, {condition.addons, 'Randomize Delay Ticks'}) condition.delay_max:depend(is_tab_antiaim, is_condition, is_enabled, fakelag_state, {elements.anti_aim.tab, ' Defensive'}, {condition.addons, 'Randomize Delay Ticks'}) condition.freeze_chance:depend(is_tab_antiaim, is_condition, is_enabled, fakelag_state, {elements.anti_aim.tab, ' Defensive'}, {condition.addons, 'Freeze-Inverter'}) condition.freeze_time:depend(is_tab_antiaim, is_condition, is_enabled, fakelag_state, {elements.anti_aim.tab, ' Defensive'}, {condition.addons, 'Freeze-Inverter'}) condition.addons:depend(is_tab_antiaim, is_condition, is_enabled, fakelag_state, {elements.anti_aim.tab, ' Defensive'}) end end builder.manual_tick = 0 local function manual () local manual_mode = elements.anti_aim.hotkeys.manual_mode.value if manual_mode == 1 or manual_mode == 2 then builder.selected_manual = builder.selected_manual or 0 local tick = globals.tickcount() local function handle_press(key, value) if elements.anti_aim.hotkeys[key]:get() and (manual_mode == 1 and not builder[key..'_pressed'] or manual_mode == 2 and builder.manual_tick < tick - 11) then builder.selected_manual = builder.selected_manual == value and 0 or value builder.manual_tick = tick end builder[key..'_pressed'] = elements.anti_aim.hotkeys[key]:get() end handle_press('left', 1) handle_press('right', 2) handle_press('forward', 3) if elements.anti_aim.hotkeys.reset:get() and not builder.reset_pressed then builder.selected_manual = 0 end builder.reset_pressed = elements.anti_aim.hotkeys.reset:get() return builder.selected_manual end end builder.side = 1 builder.delay_ticks = { default = 0, defensive = 0 } builder._freeze_state = { active = false, _until = 0 } builder.current_tick = 0 local function inverter (e, state) local me = entity.get_local_player() local body_yaw = math.floor(entity.get_prop(me, 'm_flPoseParameter', 11) * 120 - 60) local condition = elements.conditions local delay_key = 'default' if e.chokedcommands == 0 then builder.current_tick = globals.tickcount() if elements.conditions[state].body_yaw:get() ~= 'Off' then if condition[state].addons:get('Freeze-Inverter') then local freeze_chance = condition[state].freeze_chance:get() local freeze_time = condition[state].freeze_time:get() if not builder._freeze_state.active then if client.random_int(1, 100) <= freeze_chance then builder._freeze_state.active = true builder._freeze_state._until = builder.current_tick + freeze_time end end if builder._freeze_state.active then if builder.current_tick < builder._freeze_state._until then return builder.side else builder._freeze_state.active = false builder._freeze_state._until = 0 end end else builder._freeze_state = { active = false, _until = 0 } end if condition[state].delay:get() > 1 or condition[state].addons:get('Randomize Delay Ticks') or elements.conditions[state].body_yaw:get() ~= 'Jitter' then local delay = condition[state].delay:get() if condition[state].addons:get('Randomize Delay Ticks') then local delay_min = condition[state].delay_min:get() local delay_max = condition[state].delay_max:get() if condition[state].small_delay_min_toggle:get() then delay_min = condition[state].small_delay_min:get() * 0.2 end if condition[state].small_delay_max_toggle:get() then delay_max = condition[state].small_delay_max:get() * 0.2 end math.randomseed(globals.tickcount()) delay = math.random(delay_min, delay_max) end -- print(delay) if builder.delay_ticks[delay_key] < builder.current_tick - delay then builder.delay_ticks[delay_key] = builder.current_tick builder.side = builder.side == 1 and -1 or 1 if builder._freeze_state then builder._freeze_state.active = false builder._freeze_state._until = 0 end end elseif condition[state].delay:get() == 1 and elements.conditions[state].body_yaw:get() == 'Jitter' then builder.side = (body_yaw > 0 and 1 or body_yaw < 0 and -1) if builder._freeze_state then builder._freeze_state.active = false builder._freeze_state._until = 0 end end else if builder._freeze_state then builder._freeze_state.active = false builder._freeze_state._until = 0 end if builder.delay_ticks[delay_key] < builder.current_tick - 1 then builder.delay_ticks[delay_key] = builder.current_tick builder.side = builder.side == 1 and -1 or 1 end end end return builder.side end builder.d_side = 1 local function d_inverter (e, state) local me = entity.get_local_player() local body_yaw = math.floor(entity.get_prop(me, 'm_flPoseParameter', 11) * 120 - 60) local condition = elements.defensive local delay_key = 'defensive' if e.chokedcommands == 0 then local current_tick = globals.tickcount() if elements.conditions[state].body_yaw:get() ~= 'Off' then if condition[state].delay:get() > 1 or condition[state].addons:get('Randomize Delay Ticks') then local delay = condition[state].delay:get() if condition[state].addons:get('Randomize Delay Ticks') then local delay_min = condition[state].delay_min:get() local delay_max = condition[state].delay_max:get() delay = client.random_int(delay_min, delay_max) math.randomseed(globals.tickcount()) delay = math.random(delay_min, delay_max) end --print(builder.delay_ticks[delay_key] < current_tick - delay) if builder.delay_ticks[delay_key] < current_tick - delay then builder.delay_ticks[delay_key] = current_tick builder.d_side = builder.d_side == 1 and -1 or 1 end elseif condition[state].delay:get() == 1 then builder.d_side = (body_yaw > 0 and 1 or body_yaw < 0 and -1) end else if builder.delay_ticks[delay_key] < current_tick - 1 then builder.delay_ticks[delay_key] = current_tick builder.d_side = builder.d_side == 1 and -1 or 1 end end end return builder.d_side end local function is_condition_enabled(table, condition) if table[condition] then local enable_control = table[condition].enable -- 检查enable控件是checkbox还是combobox if type(enable_control.get) == "function" then local enable_value = enable_control:get() -- 如果是combobox,检查是否为"On" if type(enable_value) == "string" then return enable_value == "On" else -- 如果是checkbox,直接返回其值 return enable_value end end end return false end function builder.get_state () local condition = helpers.get_state() if not (is_condition_enabled(elements.conditions, condition)) then condition = 'Global' end if reference.antiaim.fakelag.enabled:get() then if is_condition_enabled(elements.conditions, 'Fake lag') then if fakelag.active then condition = 'Fake lag' end end end if (is_condition_enabled(elements.conditions, 'Freestanding')) and reference.antiaim.angles.freestanding[1]:get() and reference.antiaim.angles.freestanding[1].hotkey:get() then condition = 'Freestanding' end local manual_aa = manual() if manual_aa == 1 then condition = 'Manual left' elseif manual_aa == 2 then condition = 'Manual right' end return condition end function builder.d_get_state () local condition = helpers.get_state() if not (is_condition_enabled(elements.defensive, condition)) then condition = 'Global' end if (is_condition_enabled(elements.defensive, 'Freestanding')) and reference.antiaim.angles.freestanding[1]:get() and reference.antiaim.angles.freestanding[1].hotkey:get() then condition = 'Freestanding' end local manual_aa = manual() if manual_aa == 1 then condition = 'Manual left' elseif manual_aa == 2 then condition = 'Manual right' end return condition end local function angle_diff (a1, a2) local diff = a1 - a2 while diff > 180 do diff = diff - 360 end while diff < -180 do diff = diff + 360 end return diff end local function normalize_yaw (yaw) while yaw > 180 do yaw = yaw - 360 end while yaw < -180 do yaw = yaw + 360 end return yaw end local skitter_per_tick = false local skitter_accumulated_offset = 0 local skitter_goal_feet_yaw = 0 local skitter_last_view_angle = 0 local skitter_initialized = false local function get_skitter_offset_per_tick (base_offset) if not skitter_initialized then skitter_last_view_angle = base_offset skitter_goal_feet_yaw = base_offset skitter_accumulated_offset = 0 skitter_initialized = true return base_offset end skitter_per_tick = not skitter_per_tick local current_view_angle = base_offset + skitter_accumulated_offset local interval_per_tick = globals.tickinterval() local angle_difference = math.abs(angle_diff(current_view_angle, skitter_goal_feet_yaw)) local v43 = angle_difference / interval_per_tick v43 = math.min(v43, 180) local angle_addition = 0 if v43 >= 35 then angle_addition = v43 * (skitter_per_tick and 1 or 0) elseif v43 <= 35 then angle_addition = v43 * (skitter_per_tick and 1 or 0) end skitter_accumulated_offset = skitter_accumulated_offset + angle_addition if math.abs(skitter_accumulated_offset) > 180 then skitter_accumulated_offset = skitter_accumulated_offset * 0.1 end skitter_goal_feet_yaw = normalize_yaw(current_view_angle) return base_offset + math.max(-45, math.min(45, angle_addition)) end local function apply_skitter_direct (base_offset) return get_skitter_offset_per_tick(base_offset) end local pitch_add = 0 local generated_yaw = 0 builder._random_jitter_freeze = { active = false, _until = 0 } builder._random_jitter_tick = 0 builder._random_jitter_value = 0 builder._xway_offsets = { _xway_tick = 0, _xway_last_tick = 0, _xway_idx = 1 } builder._xway_freeze_state = { active = false, _until = 0 } builder._xway_tick = 0 builder._xway_last_tick = 0 builder._xway_idx = 1 function builder.angles (e) builder.state = builder.get_state() local me = entity.get_local_player() local tick = globals.tickcount() local cond = elements.conditions[builder.state] local pitch, pitch_offset = 'down', 89 local yaw = '180' -- 检查enable状态,如果是Off则使用默认值,否则使用用户设置 local yaw_base, offset, yaw_jitter, jitter_offset, body_yaw, body_side, fs_body_yaw local left, right, left_rand, right_rand if cond.enable:get() == 'Off' and builder.state ~= 'Global' then -- 当enable为Off时,使用默认值(但Global模式除外) yaw_base, offset, yaw_jitter, jitter_offset, body_yaw, body_side, fs_body_yaw = 'Local view', 0, 'Off', 0, 'Off', '180', false left, right = 0, 0 left_rand, right_rand = 0, 0 else -- 当enable为On时,或在Global模式下,使用用户设置 yaw_base, offset, yaw_jitter, jitter_offset, body_yaw, body_side, fs_body_yaw = cond.yaw_base:get(), cond.offset:get(), cond.modifier:get(), cond.modifier_offset:get(), cond.body_yaw:get(), cond.body_side:get(), cond.fs_body_yaw:get() left, right = cond.left:get(), cond.right:get() left_rand, right_rand = cond.left_randomization:get(), cond.right_randomization:get() end local body_side_value = 1 if body_yaw == 'Static' then if body_side == '-180' then body_side_value = -1 elseif body_side == '0' then body_side_value = 0 end end local inverted = inverter(e, builder.state) if cond.yaw_mode:get() == 'Left/Right' then local rand_offset = 0 if inverted == 1 and left_rand > 0 then rand_offset = client.random_int(-left_rand, left_rand) elseif inverted == -1 and right_rand > 0 then rand_offset = client.random_int(-right_rand, right_rand) end offset = ((inverted == 1 and left or inverted == -1 and right) or left) + rand_offset elseif cond.yaw_mode:get() == 'Off' then offset = 0 end if (yaw_jitter ~= 'Off' or yaw_jitter ~= 'Custom' or yaw_jitter ~= 'X-way') and cond.modifier_randomization:get() > 0 then local randomization_factor = cond.modifier_randomization:get() local hp = me and entity.get_prop(me, 'm_iHealth') or 100 local velocity = me and (entity.get_prop(me, 'm_vecVelocity', 0) or 0) or 0 local seed = globals.tickcount() + builder.state:byte(1, -1) + hp + math.floor(velocity) math.randomseed(seed) local r1 = math.random(-randomization_factor, randomization_factor) local r2 = math.random(-randomization_factor, randomization_factor) local random_offset = math.floor((r1 + r2) / 2 + math.sin(globals.realtime() * 5) * (randomization_factor / 4)) jitter_offset = jitter_offset + random_offset end if (yaw_jitter ~= 'Off' and yaw_jitter ~= 'Custom' and yaw_jitter ~= 'X-way') and cond.ideal_yaw:get() and cond.enable:get() ~= 'Off' then local body_yaw = math.floor(entity.get_prop(me, 'm_flPoseParameter', 11) * 120 - 60) if body_yaw ~= 'Off' and yaw_jitter ~= 'Ground-based' and cond.delay:get() > 1 then local raw_jitter_offset = (inverted == 1 and jitter_offset / 2 or inverted == -1 and cond.modifier_offset_2:get() / 2) or 0 offset = (offset + raw_jitter_offset) - body_yaw yaw_jitter = 'Off' jitter_offset = 0 else local raw_jitter_offset = (inverted == 1 and -jitter_offset or inverted == -1 and cond.modifier_offset_2:get() - 1) or 0 local compensated_jitter_offset = raw_jitter_offset - body_yaw jitter_offset = compensated_jitter_offset -- print(body_yaw) end end local delay = cond.delay:get() or 1 if delay < 1 then delay = 1 end if cond.addons:get('Randomize Delay Ticks') then local delay_min = cond.delay_min:get() local delay_max = cond.delay_max:get() if cond.small_delay_min_toggle:get() then delay_min = cond.small_delay_min:get() * 0.2 end if cond.small_delay_max_toggle:get() then delay_max = cond.small_delay_max:get() * 0.2 end math.randomseed(tick) delay = math.random(delay_min, delay_max) end if body_yaw ~= 'Off' then if cond.delay:get() > 1 or cond.addons:get('Randomize Delay Ticks') then body_side_value = (inverted == 1 and -1 or inverted == -1 and 1) or 0 body_yaw = cond.body_yaw:get() == 'Jitter' and 'Static' or cond.body_yaw:get() if yaw_jitter ~= 'Off' and yaw_jitter ~= 'Ground-based' and yaw_jitter ~= 'X-way' then if yaw_jitter == 'Offset' then offset = offset + (inverted == -1 and jitter_offset or 0) elseif yaw_jitter == 'Center' then offset = offset + ((inverted == 1 and -jitter_offset / 2 or inverted == -1 and jitter_offset / 2) or 0) elseif yaw_jitter == 'Random' then if cond.addons:get('Freeze-Inverter') then local freeze_chance = cond.freeze_chance:get() local freeze_time = cond.freeze_time:get() if not builder._random_jitter_freeze.active then if client.random_int(1, 100) <= freeze_chance then builder._random_jitter_freeze.active = true builder._random_jitter_freeze._until = tick + freeze_time end end if builder._random_jitter_freeze.active then if tick < builder._random_jitter_freeze._until then offset = offset + builder._random_jitter_value else builder._random_jitter_freeze.active = false builder._random_jitter_freeze._until = 0 end end end if not (builder._random_jitter_freeze and builder._random_jitter_freeze.active) then if tick - (builder._random_jitter_tick or 0) >= delay then builder._random_jitter_value = client.random_int(-jitter_offset, jitter_offset) builder._random_jitter_tick = tick end offset = offset + builder._random_jitter_value end end yaw_jitter = 'Off' jitter_offset = 0 end end end if yaw_jitter == 'Ground-based' then local my_pos = vector(entity.get_origin(me)) local threat = client.current_threat() local height_to_threat = 0 if threat then local enemy_pos = vector(entity.get_origin(threat)) height_to_threat = math.ceil(my_pos.z - enemy_pos.z) end local scale = helpers:clamp((80 - height_to_threat) / 100, 0.15, 1.0) local final_offset = jitter_offset * scale offset = offset + ((inverted == 1 and -final_offset or inverted == -1 and final_offset) or 0) yaw_jitter = 'Off' jitter_offset = 0 elseif yaw_jitter == 'X-way' then local xway = cond.x_way local method = xway.method:get() local xway_type = xway.type:get() local ways = xway.ways:get() local auto_offset = xway.auto_offset:get() / 2 builder._xway_offsets[builder.state] = { _xway_tick = 0, _xway_last_tick = 0, _xway_idx = 1, _tickcount = 0 } local offsets = builder._xway_offsets[builder.state] if xway_type == 'Auto' then local max_spread = 90 local spread = math.min(math.abs(auto_offset), max_spread) local step_size = (spread * 2) / (ways - 1) for i = 1, ways do offsets[i] = -spread + (step_size * (i - 1)) if auto_offset < 0 then offsets[i] = -offsets[i] end end else offsets[1] = xway.first_offset:get() if ways >= 2 then offsets[2] = xway.second_offset:get() end if ways >= 3 then offsets[3] = xway.third_offset:get() end if ways >= 4 then offsets[4] = xway.fourth_offset:get() end if ways >= 5 then offsets[5] = xway.fifth_offset:get() end if ways >= 6 then offsets[6] = xway.sixth_offset:get() end if ways >= 7 then offsets[7] = xway.seventh_offset:get() end if ways >= 8 then offsets[8] = xway.eighth_offset:get() end if ways >= 9 then offsets[9] = xway.ninth_offset:get() end if ways >= 10 then offsets[10] = xway.tenth_offset:get() end end local freeze_chance = cond.freeze_chance:get() local freeze_time = cond.freeze_time:get() local should_freeze = false if cond.addons:get('Freeze-Inverter') then if not builder._xway_freeze_state.active then if client.random_int(1, 100) <= freeze_chance then builder._xway_freeze_state.active = true builder._xway_freeze_state._until = tick + freeze_time end end if builder._xway_freeze_state.active then if tick < builder._xway_freeze_state._until then should_freeze = true else builder._xway_freeze_state.active = false builder._xway_freeze_state._until = 0 end end else builder._xway_freeze_state = { active = false, _until = 0 } end if not should_freeze then if method == 'Tickcount' then builder._tickcount = (builder._tickcount or 0) + 1 if builder._tickcount >= 2 then builder._xway_idx = (builder._xway_idx % ways) + 1 builder._tickcount = 0 end else if builder._xway_last_tick == 0 then builder._xway_last_tick = tick end if tick - builder._xway_last_tick >= delay then builder._xway_idx = (builder._xway_idx % ways) + 1 builder._xway_last_tick = tick end end end local idx = builder._xway_idx if method == 'Skitter' then local base_offset = offsets[idx] or 0 local final_offset = apply_skitter_direct(base_offset) offset = offset + final_offset elseif method == 'Tickcount' then offset = offset + (offsets[idx] or 0) end jitter_offset = 0 yaw_jitter = 'Off' elseif yaw_jitter == 'Custom' then yaw_jitter = 'Off' end local manual_aa = manual() local manual_offsets = {-90, 90, 180} if manual_aa >= 1 and manual_aa <= 3 then reference.antiaim.angles.freestanding[1]:override(false) local condition_met = (manual_aa == 1 and not elements.conditions['Manual left'].enable.value) or (manual_aa == 2 and not elements.conditions['Manual right'].enable.value) or (manual_aa == 3) if condition_met then offset = manual_offsets[manual_aa] yaw_base = 'Local View' yaw_jitter = 'Off' body_yaw = 'Static' body_side_value = 11 end end builder.d_state = builder.d_get_state() local defensive = { yaw = elements.defensive[builder.d_state].yaw:get(), speed = elements.defensive[builder.d_state].speed:get(), offset = elements.defensive[builder.d_state].offset:get(), left = elements.defensive[builder.d_state].left:get(), right = elements.defensive[builder.d_state].right:get(), min_gen = elements.defensive[builder.d_state].min_gen:get(), max_gen = elements.defensive[builder.d_state].max_gen:get(), duration = elements.defensive[builder.d_state].duration:get(), pitch_min_max = elements.defensive[builder.d_state].pitch_min_max:get(), pitch_height_based = elements.defensive[builder.d_state].pitch_height_based:get(), yaw_mode = elements.defensive[builder.d_state].yaw_mode:get(), yaw_generation = elements.defensive[builder.d_state].yaw_generation:get(), pitch_mode = elements.defensive[builder.d_state].pitch_mode:get(), pitch_speed = elements.defensive[builder.d_state].pitch_speed:get(), pitch = elements.defensive[builder.d_state].pitch:get(), pitch_min = elements.defensive[builder.d_state].pitch_min:get(), pitch_max = elements.defensive[builder.d_state].pitch_max:get() } local toggle_defensive = false if builder.d_state ~= 'Global' and elements.defensive[builder.d_state].enable:get() then toggle_defensive = true elseif builder.d_state == 'Global' then toggle_defensive = true else toggle_defensive = false end if toggle_defensive then if (elements.defensive[builder.d_state].defensive_on:get('Double tap') and exploits:is_doubletap()) or (elements.defensive[builder.d_state].defensive_on:get('Hide shots') and exploits:is_hideshots() and not exploits:is_doubletap()) then if elements.defensive[builder.d_state].defensive_mode:get() == 'On peek' then exploits:should_force_defensive(false) elseif elements.defensive[builder.d_state].defensive_mode:get() == 'Always on' then exploits:should_force_defensive(true) end local disable_defensive_aa = false local threat = client.current_threat() if elements.anti_aim.settings.list:get('Low ping disable defensive') and threat then local resource = entity.get_player_resource(threat) if not resource then disable_defensive_aa = true end local ping = entity.get_prop(resource, 'm_iPing', threat) if not ping or (ping < 15) then disable_defensive_aa = true end end if toggle_defensive and exploits:in_defensive(defensive.duration) and not disable_defensive_aa then local d_inverted = d_inverter(e, builder.d_state) pitch = 'custom' pitch_offset = defensive.pitch yaw = defensive.yaw offset = defensive.offset yaw_jitter = 'Off' if defensive.pitch_height_based then local my_pos = vector(entity.get_origin(entity.get_local_player())) local threat = client.current_threat() local height_diff = 0 if threat then local enemy_pos = vector(entity.get_origin(threat)) height_diff = math.ceil(my_pos.z - enemy_pos.z) end local height_based_min = math.max(-89, -89 + height_diff) local height_based_max = math.min(89, 89 + height_diff) if defensive.pitch_mode == 'Off' then pitch = 'down' pitch_offset = 89 elseif defensive.pitch_mode == 'Jitter' then local speed = math.max(1, math.min(defensive.pitch_speed, 15)) local interval = math.floor(math.floor(1 / globals.tickinterval()) / speed) local phase = math.floor(globals.tickcount() / interval) % 2 pitch = 'custom' pitch_offset = (phase == 0) and height_based_min or height_based_max elseif defensive.pitch_mode == 'Random' then pitch = 'custom' pitch_offset = client.random_int(height_based_min, height_based_max) elseif defensive.pitch_mode == 'Cycling' then local cycle_speed = defensive.pitch_speed if pitch_add >= height_based_max then pitch_add = height_based_min else pitch_add = pitch_add + cycle_speed end pitch = 'custom' pitch_offset = pitch_add elseif defensive.pitch_mode == 'Spin' then local spin_speed = defensive.pitch_speed local mid = (height_based_min + height_based_max) / 2 local amp = math.abs(height_based_max - height_based_min) / 2 pitch = 'custom' pitch_offset = mid + math.sin(globals.realtime() * spin_speed) * amp elseif defensive.pitch_mode == 'Sway' then local sway_speed = defensive.pitch_speed local mid = (height_based_min + height_based_max) / 2 local amp = math.abs(height_based_max - height_based_min) / 2 pitch = 'custom' pitch_offset = mid + math.sin(globals.realtime() * sway_speed) * amp * (math.cos(globals.realtime() * sway_speed * 0.5) + 1) / 2 else pitch = 'custom' pitch_offset = height_based_min end elseif defensive.pitch_min_max then if defensive.pitch_mode == 'Jitter' then local speed = math.max(1, math.min(defensive.pitch_speed, 15)) local interval = math.floor(math.floor(1 / globals.tickinterval()) / speed) local phase = math.floor(globals.tickcount() / interval) % 2 pitch = 'custom' pitch_offset = (phase == 0) and defensive.pitch_min or defensive.pitch_max elseif defensive.pitch_mode == 'Random' then pitch = 'custom' pitch_offset = client.random_int(defensive.pitch_min, defensive.pitch_max) elseif defensive.pitch_mode == 'Cycling' then local cycle_speed = defensive.pitch_speed if pitch_add >= defensive.pitch_max then pitch_add = defensive.pitch_min else pitch_add = pitch_add + cycle_speed end pitch = 'custom' pitch_offset = pitch_add elseif defensive.pitch_mode == 'Spin' then local spin_speed = defensive.pitch_speed local mid = (defensive.pitch_min + defensive.pitch_max) / 2 local amp = math.abs(defensive.pitch_max - defensive.pitch_min) / 2 pitch = 'custom' pitch_offset = mid + math.sin(globals.realtime() * spin_speed) * amp elseif defensive.pitch_mode == 'Sway' then local sway_speed = defensive.pitch_speed local mid = (defensive.pitch_min + defensive.pitch_max) / 2 local amp = math.abs(defensive.pitch_max - defensive.pitch_min) / 2 pitch = 'custom' pitch_offset = mid + math.sin(globals.realtime() * sway_speed) * amp * (math.cos(globals.realtime() * sway_speed * 0.5) + 1) / 2 elseif defensive.pitch_mode == 'Off' then pitch = 'down' pitch_offset = 89 else pitch = 'custom' pitch_offset = defensive.pitch_min end else pitch = 'custom' pitch_offset = defensive.pitch if defensive.pitch_mode == 'Off' then pitch = 'down' pitch_offset = 89 elseif defensive.pitch_mode == 'Spin' then local spin_speed = defensive.pitch_speed pitch_offset = math.sin(globals.realtime() * spin_speed) * pitch_offset elseif defensive.pitch_mode == 'Sway' then local sway_speed = defensive.pitch_speed local sway_amplitude = pitch_offset * 0.5 pitch_offset = math.sin(globals.realtime() * sway_speed) * sway_amplitude * (math.cos(globals.realtime() * sway_speed * 0.5) + 1) elseif defensive.pitch_mode == 'Jitter' then local speed = math.max(1, math.min(defensive.pitch_speed, 15)) local interval = math.floor(math.floor(1 / globals.tickinterval()) / speed) local phase = math.floor(globals.tickcount() / interval) % 2 local switch_amount = (phase == 0) and pitch_offset or -pitch_offset pitch_offset = switch_amount elseif defensive.pitch_mode == 'Cycling' then local cycle_speed = defensive.pitch_speed if pitch_add >= -pitch_offset then pitch_add = pitch_offset else pitch_add = pitch_add + cycle_speed end pitch_offset = pitch_add elseif defensive.pitch_mode == 'Random' then pitch_offset = client.random_int(pitch_offset <= 0 and pitch_offset or -pitch_offset, pitch_offset <= 0 and -pitch_offset or pitch_offset) end end if defensive.yaw_mode == 'Left/Right' then offset = (d_inverted == 1 and defensive.left or d_inverted == -1 and defensive.right) or defensive.left elseif defensive.yaw_mode == 'Offset' then offset = defensive.offset elseif defensive.yaw_mode == 'Off' then offset = 0 end if defensive.yaw_generation and defensive.yaw_mode ~= 'Off' then local min_gen, max_gen = defensive.min_gen, defensive.max_gen if exploits.ticks_processed <= 2 then generated_yaw = nil elseif exploits.ticks_processed > 2 then if not generated_yaw then generated_yaw = client.random_int(min_gen, max_gen) end offset = offset + generated_yaw end end if yaw == 'Distortion' then yaw = '180' local distortion_speed = defensive.speed local distortion_amplitude = offset * 1.5 local distortion_time = globals.realtime() * distortion_speed offset = offset + math.sin(distortion_time) * distortion_amplitude elseif yaw == 'Sway' then yaw = '180' local sway_speed = defensive.speed local sway_amplitude = offset local sway_time = globals.realtime() * sway_speed offset = offset + math.sin(sway_time) * sway_amplitude * (math.cos(sway_time * 0.5) + 1) / 2 elseif yaw == 'Freestand' then yaw = '180' offset = helpers.get_freestand_direction(entity.get_local_player()) == -1 and -offset or offset end end end end -- print('builder: forcing defensive - ' .. tostring(e.force_defensive)) return { pitch = pitch, pitch_offset = pitch_offset, yaw = yaw, yaw_base = yaw_base, offset = offset, yaw_jitter = yaw_jitter, jitter_offset = jitter_offset, body_yaw = body_yaw, body_side = body_side_value, fs_body_yaw = fs_body_yaw } end function reset_angles () reference.antiaim.angles.enabled:override(true) reference.antiaim.angles.pitch[1]:override('Down') reference.antiaim.angles.pitch[2]:override(0) reference.antiaim.angles.yaw[1]:override('180') reference.antiaim.angles.yaw_base:override('Local view') reference.antiaim.angles.freestanding[1]:override(false) reference.antiaim.angles.edge_yaw:override(false) reference.antiaim.angles.yaw[2]:override(0) reference.antiaim.angles.yaw_jitter[1]:override('Off') reference.antiaim.angles.yaw_jitter[2]:override(0) reference.antiaim.angles.body_yaw[1]:override('Off') reference.antiaim.angles.body_yaw[2]:override(0) reference.antiaim.angles.fs_body_yaw:override(false) end local function set_angles (e) exploits:should_force_defensive(false) local state = helpers.get_state() local me = entity.get_local_player() if not me or not entity.is_alive(me) then reset_angles() return end local angles = builder.angles(e) reference.antiaim.fakelag.amount:override() reference.antiaim.fakelag.limit:override() reference.misc.settings.anti_untrusted:override() -- 检测是否正在投掷手雷 local local_player = entity.get_local_player() local weapon = entity.get_player_weapon(local_player) local throw_time = weapon and entity.get_prop(weapon, 'm_fThrowTime') or 0 -- 只有在玩家没有投掷手雷时才启用Server\v exploits功能 if elements.anti_aim.exploits.exploit.enable:get() and throw_time == 0 then reference.misc.settings.anti_untrusted:override(false) -- 根据选择的选项设置对应的pitch值 local exploit_option = elements.anti_aim.exploits.exploit.options:get() if exploit_option == 'Fake up \abf3939FF(180)' then e.pitch = 180 elseif exploit_option == 'Fake down \abf3939FF(-180)' then e.pitch = -180 elseif exploit_option == 'Fake zero \abf3939FF(1080)' then e.pitch = 1080 elseif exploit_option == 'Fake down \abf3939FF(-540)' then e.pitch = -540 end e.yaw = e.yaw + 180 + helpers:clamp(angles.offset, -180, 180) reference.antiaim.fakelag.amount:override('Dynamic') reference.antiaim.fakelag.limit:override(14) return end reference.antiaim.angles.enabled:override(true) reference.antiaim.angles.pitch[1]:override(angles.pitch) reference.antiaim.angles.pitch[2]:override(helpers:clamp(angles.pitch_offset, -89, 89)) reference.antiaim.angles.yaw[1]:override(angles.yaw) reference.antiaim.angles.yaw_base:override(angles.yaw_base) reference.antiaim.angles.freestanding[1]:override(not elements.anti_aim.hotkeys.freestanding_disablers:get(state) and elements.anti_aim.hotkeys.freestanding.value and elements.anti_aim.hotkeys.freestanding.hotkey:get() or false) reference.antiaim.angles.freestanding[1]:set_hotkey('Always On') reference.antiaim.angles.edge_yaw:override(elements.anti_aim.hotkeys.edge_yaw.value and elements.anti_aim.hotkeys.edge_yaw.hotkey:get() or false) reference.antiaim.angles.yaw[2]:override(helpers:clamp(angles.offset, -180, 180)) reference.antiaim.angles.yaw_jitter[1]:override(angles.yaw_jitter) reference.antiaim.angles.yaw_jitter[2]:override(helpers:clamp(angles.jitter_offset, -180, 180)) reference.antiaim.angles.body_yaw[1]:override(angles.body_yaw) reference.antiaim.angles.body_yaw[2]:override(angles.body_side) reference.antiaim.angles.fs_body_yaw:override(angles.fs_body_yaw) end local function is_enemies_dead () if not elements.anti_aim.settings.list:get('Spin if enemies dead') then return end local alive = 0 for i = 1, globals.maxplayers() do if entity.get_classname(i) == 'CCSPlayer' and entity.is_alive(i) and entity.is_enemy(i) then alive = alive + 1 end end return alive end local function on_setup_command (e) local me = entity.get_local_player() if not me or not entity.is_alive(me) then return end builder.state = builder.get_state() -- Extended backtrack功能 local maxunlag = ui.reference("MISC", "Settings", "sv_maxunlag2") local maxunlag_value = 200 if elements.aimbot.extended_backtrack.enable:get() then maxunlag_value = 400 end ui.set(maxunlag, maxunlag_value) local weapon = entity.get_player_weapon(me) local weapon_class = entity.get_classname(weapon) if elements.anti_aim.settings.list:get('Safe head') and weapon and weapon_class and manual() ~= 3 then local safe_weapons = { CKnife = 'Knife', CWeaponTaser = 'Taser' } local is_safe_state = (builder.state == 'Air+' or not is_on_ground and builder.state == 'Fake lag' and entity.get_prop(me, 'm_flDuckAmount') == 1) local my_pos = vector(entity.get_origin(me)) local threat = client.current_threat() local height_to_threat = 0 if threat then local enemy_pos = vector(entity.get_origin(threat)) height_to_threat = math.ceil(my_pos.z - enemy_pos.z) end for sel_weapon, weapons in pairs(safe_weapons) do if is_safe_state and ((safe_weapons[weapon_class] and elements.anti_aim.settings.safe_head_options:get(safe_weapons[weapon_class])) or (height_to_threat > 100 and elements.anti_aim.settings.safe_head_options:get('Height advantage'))) then if elements.anti_aim.settings.safe_head_mode:get() == 'Defensive' then if exploits:is_active() and not exploits:in_recharge() then exploits:should_force_defensive(true) reference.antiaim.angles.pitch[1]:override(exploits:in_defensive() and 'Custom' or 'Down') reference.antiaim.angles.pitch[2]:override(0) reference.antiaim.angles.yaw[2]:override(exploits:in_defensive() and 180 or 0) reference.antiaim.angles.body_yaw[1]:override(exploits:in_defensive() and 'Static' or 'Off') reference.antiaim.angles.body_yaw[2]:override(1) else exploits:should_force_defensive(false) reference.antiaim.angles.pitch[1]:override('Down') reference.antiaim.angles.yaw[2]:override(0) reference.antiaim.angles.body_yaw[1]:override('Off') reference.antiaim.angles.body_yaw[2]:override(0) end else exploits:should_force_defensive(false) reference.antiaim.angles.pitch[1]:override('Down') reference.antiaim.angles.yaw[2]:override(0) reference.antiaim.angles.body_yaw[1]:override('Off') reference.antiaim.angles.body_yaw[2]:override(0) end reference.antiaim.angles.yaw_base:override('At Targets') reference.antiaim.angles.yaw[1]:override('180') reference.antiaim.angles.yaw_jitter[1]:override('Off') reference.antiaim.angles.yaw_jitter[2]:override(0) end end end reference.antiaim.fakelag.limit:override() if elements.anti_aim.settings.list:get('Spin if enemies dead') and is_enemies_dead() == 0 or elements.anti_aim.settings.list:get('Spin on warmup') and entity.get_prop(entity.get_all('CCSGameRulesProxy')[1],'m_bWarmupPeriod') == 1 then reference.antiaim.angles.pitch[1]:override('Custom') reference.antiaim.angles.pitch[2]:override(0) reference.antiaim.angles.yaw[1]:override('Spin') reference.antiaim.angles.yaw[2]:override(5) reference.antiaim.angles.yaw_jitter[1]:override('Off') reference.antiaim.angles.yaw_jitter[2]:override(0) reference.antiaim.angles.body_yaw[1]:override('Static') reference.antiaim.angles.body_yaw[2]:override(1) reference.antiaim.fakelag.limit:override(1) end if elements.anti_aim.settings.list:get('Anti backstab') then local players = entity.get_players(true) local local_pos = vector(entity.get_prop(me, 'm_vecOrigin')) for i = 1, #players do local player_pos = vector(entity.get_prop(players[i], 'm_vecOrigin')) local enemy_weapon = entity.get_player_weapon(players[i]) anti_backstab = false if entity.get_classname(enemy_weapon) == 'CKnife' and local_pos:dist(player_pos) <= 450 then local eye_pos = vector(client.eye_position()) local hitbox_pos = vector(entity.hitbox_position(players[i], 4)) local fraction, entindex_hit = client.trace_line(players[i], hitbox_pos.x, hitbox_pos.y, hitbox_pos.z, eye_pos.x, eye_pos.y, eye_pos.z) if entindex_hit == me or fraction == 1 then anti_backstab = true reference.antiaim.angles.pitch[1]:override('Down') reference.antiaim.angles.yaw_base:override('At Targets') reference.antiaim.angles.yaw[1]:override('180') reference.antiaim.angles.yaw[2]:override(180) reference.antiaim.angles.yaw_jitter[1]:override('Off') reference.antiaim.angles.yaw_jitter[2]:override(0) end end end end if elements.anti_aim.exploits.exploit.enable:get() then return end if elements.anti_aim.settings.list:get('Fast ladder') then local pitch, yaw = client.camera_angles() local move_type = entity.get_prop(me, 'm_MoveType') local weapon = entity.get_player_weapon(me) local throw = entity.get_prop(weapon, 'm_fThrowTime') if move_type ~= 9 then return end if weapon == nil then return end if throw ~= nil and throw ~= 0 then return end if e.forwardmove > 0 then if e.pitch < 45 then e.pitch = 89 e.in_moveright = 1 e.in_moveleft = 0 e.in_forward = 0 e.in_back = 1 if e.sidemove == 0 then e.yaw = e.yaw + 90 end if e.sidemove < 0 then e.yaw = e.yaw + 150 end if e.sidemove > 0 then e.yaw = e.yaw + 30 end end elseif e.forwardmove < 0 then e.pitch = 89 e.in_moveleft = 1 e.in_moveright = 0 e.in_forward = 1 e.in_back = 0 if e.sidemove == 0 then e.yaw = e.yaw + 90 end if e.sidemove > 0 then e.yaw = e.yaw + 150 end if e.sidemove < 0 then e.yaw = e.yaw + 30 end end end if elements.anti_aim.settings.list:get('E-Bombsite fix') then if entity.get_prop(me, 'm_iTeamNum') == 2 then if entity.get_prop(me, 'm_bInBombZone') > 0 then if bit.band(e.buttons, 32) == 32 and entity.get_classname(weapon) ~= 'CC4' then e.buttons = bit.band(e.buttons, bit.bnot(32)) reference.antiaim.angles.yaw_base:override('Local View') reference.antiaim.angles.pitch[1]:override('Custom') reference.antiaim.angles.pitch[2]:override(0) reference.antiaim.angles.yaw[1]:override('180') reference.antiaim.angles.yaw[2]:override(180) reference.antiaim.angles.yaw_jitter[1]:override('Off') reference.antiaim.angles.yaw_jitter[2]:override(0) reference.antiaim.angles.body_yaw[1]:override('Static') reference.antiaim.angles.body_yaw[2]:override(1) end end end end end client.set_event_callback('setup_command', set_angles) client.set_event_callback('setup_command', on_setup_command) local function reset_everything () builder.manual_tick = 0 builder.side = 1 builder._freeze_state.active = false builder._freeze_state._until = 0 builder.current_tick = 0 builder.delay_ticks.default = 0 builder.delay_ticks.defensive = 0 builder.d_side = 1 skitter_per_tick = false skitter_accumulated_offset = 0 skitter_goal_feet_yaw = 0 skitter_last_view_angle = 0 skitter_initialized = false builder._xway_offsets = { _xway_tick = 0, _xway_last_tick = 0, _xway_idx = 1 } builder._xway_freeze_state = { active = false, _until = 0 } builder._xway_tick = 0 builder._xway_last_tick = 0 builder._xway_idx = 1 end local function on_player_death (e) if not (e.userid and e.attacker) then return end if entity.get_local_player() ~= client.userid_to_entindex(e.userid) then return end reset_everything() end local function on_level_init () reset_everything() end local function on_round_end () reset_everything() end client.set_event_callback('player_death', on_player_death) client.set_event_callback('level_init', on_level_init) client.set_event_callback('round_end', on_round_end) end local function setSpeed(newSpeed) if client.get_cvar("cl_sidespeed") == 450 and newSpeed == 450 then return end client.set_cvar("cl_sidespeed", newSpeed) client.set_cvar("cl_forwardspeed", newSpeed) client.set_cvar("cl_backspeed", newSpeed) end client.set_event_callback("run_command", function() if elements.anti_aim.settings.list:get('walk speed') then if reference.antiaim.other.slow_motion[1].hotkey:get() then local slider_value = elements.anti_aim.settings.walk_speed_slider:get() local final_val = 250 * slider_value / 500 setSpeed(final_val) else setSpeed(450) end else setSpeed(450) end end) local defensive_flick do local delay = nil local pitch_gen = nil local yaw_gen = nil local side = 0 local cache_tick = 0 local function on_setup_command (e) if not elements.anti_aim.exploits.defensive_flick.enable:get() then return end local condition = builder.get_state() local pitch, pitch_offset = 'Custom', 0 local yaw = '180' local yaw_base, offset, body_yaw, body_side, fs_body_yaw = 'At targets', 0, 'Static', 0, false exploits:should_force_defensive(false) if elements.anti_aim.exploits.defensive_flick.settings.states:get(condition) and (condition ~= 'Fake lag' and not fakelag.active) and not anti_backstab then exploits:should_force_defensive(true) if exploits.ticks_processed <= 2 then delay = nil elseif exploits.ticks_processed > 2 then if not delay then delay = client.random_int(1, 50) end end if exploits:in_defensive() then pitch_offset = 0 body_side, fs_body_yaw = 1, false local current_tick = globals.tickcount() if cache_tick < current_tick - (delay or 1) then cache_tick = current_tick side = side == 1 and -1 or 1 end if side == -1 then offset = -90 else offset = 90 end else pitch_offset = 89 offset = 0 body_side, fs_body_yaw = 0, true end reference.antiaim.angles.pitch[1]:override(pitch) reference.antiaim.angles.pitch[2]:override(helpers:clamp(pitch_offset, -89, 89)) reference.antiaim.angles.yaw[1]:override(yaw) reference.antiaim.angles.yaw_base:override(yaw_base) reference.antiaim.angles.yaw[2]:override(helpers:clamp(offset, -180, 180)) reference.antiaim.angles.yaw_jitter[1]:override('Off') reference.antiaim.angles.yaw_jitter[2]:override(0) reference.antiaim.angles.body_yaw[1]:override(body_yaw) reference.antiaim.angles.body_yaw[2]:override(body_side) reference.antiaim.angles.fs_body_yaw:override(fs_body_yaw) end end client.set_event_callback('setup_command', on_setup_command) end --- local function control_exploits (ctx) reference.rage.aimbot.double_tap[1]:override() reference.rage.aimbot.double_tap[2]:override() reference.rage.aimbot.double_tap[1]:override(ctx) reference.rage.aimbot.double_tap[2]:override('Defensive') end local unsafe_recharge = { timer = globals.tickcount(), ticks = 14 }; do local ref = { aimbot = reference.rage.aimbot.enabled[1], doubletap = { main = reference.rage.aimbot.double_tap, fakelag_limit = reference.rage.aimbot.double_tap_limit }, on_shot_anti_aim = reference.antiaim.other.on_shot_anti_aim[1] } local local_player, callback_reg, dt_charged = nil, false, false local function check_charge() if not elements.aimbot.unsafe_exploit:get() then return end local m_nTickBase = entity.get_prop(local_player, 'm_nTickBase') local client_latency = client.latency() local shift = math.floor(m_nTickBase - globals.tickcount() - 3 - math.floor(client_latency * 10 + 0.5) * 0.5) local wanted = -14 + (ref.doubletap.fakelag_limit:get() - 1) + 3 -- Error margin dt_charged = shift <= wanted end local function on_setup_command() if not elements.aimbot.unsafe_exploit:get() then return end local doubletap_enabled = ref.doubletap.main[1]:get() and ref.doubletap.main[1]:get_hotkey() local osaa_enabled = ref.on_shot_anti_aim:get() and ref.on_shot_anti_aim:get_hotkey() if not doubletap_enabled and not osaa_enabled then ref.aimbot:set(true) if callback_reg then client.unset_event_callback('run_command', check_charge) callback_reg = false end return end local_player = entity.get_local_player() if not local_player or not entity.is_alive(local_player) then return end if not callback_reg then client.set_event_callback('run_command', check_charge) callback_reg = true end local threat = client.current_threat() local in_air = bit.band(entity.get_prop(local_player, 'm_fFlags'), 1) == 0 local is_visible = threat and bit.band(entity.get_esp_data(threat).flags or 0, bit.lshift(1, 11)) == 2048 if not dt_charged and threat and in_air and is_visible then ref.aimbot:set(false) else ref.aimbot:set(true) end end client.set_event_callback('setup_command', on_setup_command) client.set_event_callback('shutdown', function() if not elements.aimbot.unsafe_exploit:get() then return end ref.aimbot:set(true) end) end local weapons = { pistols = {"CWeaponHKP2000","CWeaponElite","CWeaponP250","CWeaponFiveSeven","CWeaponGlock","CWeaponTec9",}, Snipers = {"CWeaponSSG08",}, BIGSnipers = {"CWeaponAWP",}, autoSnipers = {"CWeaponG3SG1","CWeaponSCAR20",}, rifles = {"CWeaponM4A1","CWeaponFamas","CWeaponAug","CWeaponGalilAR","CAK47","CWeaponSG556",}, nades = {"CHEGrenade","CFlashbang","CSmokeGrenade","CMolotovGrenade","CIncendiaryGrenade","CDecoyGrenade",} } local auto_tp = { shift_ticks = 0, wait_dt = 0, landtick = 0,lc_active = false,auto_teleport_active = false,exploit_active = false}; do auto_tp.contains = function(tbl, val) for i = 1, #tbl do if tbl[i] == val then return true end end return false end auto_tp.states = { inair = function() return (bit.band(entity.get_prop(entity.get_local_player(), "m_fFlags"), 1) == 0) end, crouching = function() return (bit.band(entity.get_prop(entity.get_local_player(), "m_fFlags"), 4) == 0) end, velocity = function() local me = entity.get_local_player() local velocity_x, velocity_y = entity.get_prop(me, "m_vecVelocity") return math.sqrt(velocity_x ^ 2 + velocity_y ^ 2) end } auto_tp.flags = {['HIT'] = { 11, 2048 }} auto_tp.has_flag = function(entindex, flag_name) if not entindex or not flag_name then return false end local flag_data = auto_tp.flags[flag_name] if flag_data == nil then return false end local esp_data = entity.get_esp_data(entindex) or {} return bit.band(esp_data.flags or 0, bit.lshift(1, flag_data[1])) == flag_data[2] end auto_tp.is_vulnerable = function() for _, v in ipairs(entity.get_players(true)) do local esp_data = entity.get_esp_data(v) if esp_data then local flags = esp_data.flags if bit.band(flags, bit.lshift(1, 11)) ~= 0 then return true end end end return false end auto_tp.update_real_state = function() local slowwalking = reference.antiaim.other.slow_motion[1].hotkey:get() local crouch = (not auto_tp.states.crouching()) or reference.rage.other.fake_duck:get() local realstate_name = "" if slowwalking then realstate_name = "Slow" else if auto_tp.states.inair() then if crouch then realstate_name = "Jump Duck" else realstate_name = "Jumping" end else if auto_tp.states.velocity() > 5 and not crouch then realstate_name = "Running" elseif auto_tp.states.velocity() <= 5 and not crouch then realstate_name = "Standing" elseif auto_tp.states.velocity() > 5 and crouch then realstate_name = "Duck Running" elseif crouch then realstate_name = "Ducking" end end end return realstate_name end auto_tp.adaptive_hideshot = function(cmd) if auto_tp.states.inair() then auto_tp.landtick = 0 else auto_tp.landtick = auto_tp.landtick + 1 end if globals.tickcount() >= auto_tp.shift_ticks + 17 then reference.rage.aimbot.double_tap[1]:set(true) end local teleport_enabled = elements.aimbot.auto_tp.enable:get() local mode = elements.aimbot.auto_tp.mode:get() auto_tp.lc_active = false auto_tp.auto_teleport_active = false auto_tp.exploit_active = false -- 手动闪现逻辑 if teleport_enabled and mode == "Semi automatic teleport" and elements.aimbot.auto_tp.auto_discharge:get() then local current_threat = client.current_threat() if current_threat and auto_tp.has_flag(current_threat, 'HIT') then local exploit = (reference.rage.aimbot.double_tap[1]:get() and reference.rage.aimbot.double_tap[2]:get()) local fd = reference.rage.other.fake_duck:get() local break_lc = false if elements.aimbot.auto_tp.auto_discharge:get() then if (exploit and not fd) and break_lc then goto skip end end reference.rage.aimbot.double_tap[1]:set(false) auto_tp.shift_ticks = globals.tickcount() auto_tp.lc_active = true auto_tp.exploit_active = false end end ::skip:: -- 自动传送逻辑 if teleport_enabled and mode == "Fully automatic teleport" then local local_player = entity.get_local_player() if local_player then local weapon = entity.get_player_weapon(local_player) if weapon then local weapon_class = entity.get_classname(weapon) if weapon_class and (weapon_class == "CWeaponSSG08" or weapon_class == "CWeaponAWP") then if not reference.rage.other.quickpeek[1]:get_hotkey() and reference.rage.aimbot.double_tap[2]:get() then local vel_z = math.floor(entity.get_prop(local_player, "m_vecVelocity[2]")) if auto_tp.is_vulnerable() and vel_z < 20 then cmd.in_jump = false reference.rage.aimbot.double_tap[1]:set(false) auto_tp.auto_teleport_active = true auto_tp.exploit_active = true else reference.rage.aimbot.double_tap[1]:set(true) auto_tp.exploit_active = true end end end end end end if not elements.aimbot.auto_hs.enable:get() then return end if reference.rage.aimbot.double_tap[2]:get() then local get_weapon = entity.get_player_weapon local local_player = entity.get_local_player() local should_enable = false local weapon_class = entity.get_classname(get_weapon(local_player)) local enablers = elements.aimbot.auto_hs.enablers:get() if #enablers > 0 then if auto_tp.contains(enablers, "Scout") then if auto_tp.contains(weapons.Snipers, weapon_class) then should_enable = true end end if auto_tp.contains(enablers, "Awp") then if auto_tp.contains(weapons.BIGSnipers, weapon_class) then should_enable = true end end if auto_tp.contains(enablers, "Knife") then if weapon_class == "CKnife" then should_enable = true end end if auto_tp.contains(enablers, "Pistols") then if auto_tp.contains(weapons.pistols, weapon_class) then should_enable = true end end if auto_tp.contains(enablers, "Auto Snipers") then if auto_tp.contains(weapons.autoSnipers, weapon_class) then should_enable = true end end if auto_tp.contains(enablers, "Heavy Pistols") then if weapon_class == "CDEagle" then should_enable = true end end if auto_tp.contains(enablers, "Rifles") then if auto_tp.contains(weapons.rifles, weapon_class) then should_enable = true end end else should_enable = false end if not should_enable then reference.antiaim.other.on_shot_anti_aim[1]:set_hotkey("Toggle") return end local realstate_name = auto_tp.update_real_state() local enabled_states = elements.aimbot.auto_hs.states:get() local should_enable_hs = false -- 只有当用户选择了状态时才启用相应的状态 if #enabled_states > 0 then -- 检查当前状态是否在用户选择的启用状态列表中 for _, state in ipairs(enabled_states) do if state == realstate_name then should_enable_hs = true break end end end if should_enable_hs then reference.rage.aimbot.double_tap[1]:set(false) if globals.tickcount() >= auto_tp.shift_ticks + 17 then reference.antiaim.other.on_shot_anti_aim[1]:set(true) end reference.antiaim.other.on_shot_anti_aim[1]:set_hotkey("Always on") else if entity.get_player_weapon(entity.get_local_player()) ~= nil and globals.curtime() < entity.get_prop(entity.get_player_weapon(entity.get_local_player()), "m_fLastShotTime", 0) + globals.tickinterval() * 17 and globals.curtime() > entity.get_prop(entity.get_player_weapon(entity.get_local_player()), "m_fLastShotTime", 0) + globals.tickinterval() * 15 and not auto_tp.contains(weapons.nades, entity.get_classname(entity.get_player_weapon(entity.get_local_player()))) then auto_tp.wait_dt = globals.tickcount() + 20 end if globals.tickcount() >= auto_tp.shift_ticks + 17 then reference.antiaim.other.on_shot_anti_aim[1]:set(true) end reference.antiaim.other.on_shot_anti_aim[1]:set_hotkey("Toggle") end end end auto_tp.on_paint = function() local teleport_enabled = elements.aimbot.auto_tp.enable:get() local mode = elements.aimbot.auto_tp.mode:get() if not teleport_enabled then return end if mode == "Semi automatic teleport" and not elements.aimbot.auto_tp.auto_discharge:get() then return end if (mode == "Semi automatic teleport" and auto_tp.lc_active) or (mode == "Fully automatic teleport" and auto_tp.auto_teleport_active) then if reference.rage.aimbot.double_tap[2]:get() then local r, g, b, a = 255, 0, 50, 255 if auto_tp.exploit_active then r, g, b = 255, 255, 255 end renderer.indicator(r, g, b, a, 'LC') end end end client.set_event_callback("setup_command", auto_tp.adaptive_hideshot) client.set_event_callback("paint", auto_tp.on_paint) end local fakelag_beta do local function in_air() local ent = entity.get_local_player() if not entity.is_alive(ent) then return false end local flag = bit.band(entity.get_prop(ent, "m_fFlags"), 1) return flag == 0 end local function in_move(cmd) return cmd.in_forward == 1 or cmd.in_back == 1 or cmd.in_moveleft == 1 or cmd.in_moveright == 1 end local function get_velocity() local ent = entity.get_local_player() if not entity.is_alive(ent) then return 0 end local vel = vector(entity.get_prop(ent, "m_vecVelocity")) return vel:length2d() end local function fl_modes_func(cmd, mode, amount) if mode == "Adaptive" then reference.antiaim.fakelag.amount:set("Maximum") if in_air() then local val = amount < 13 and amount or 13 reference.antiaim.fakelag.limit:set(val) elseif in_move(cmd) then reference.antiaim.fakelag.limit:set(6) else reference.antiaim.fakelag.limit:set(amount) end elseif mode == "Random" then reference.antiaim.fakelag.amount:set("Maximum") reference.antiaim.fakelag.limit:set(client.random_int(1, amount)) else reference.antiaim.fakelag.amount:set(mode) reference.antiaim.fakelag.limit:set(amount) end end local disablers_tbl = { ["Standing"] = function(cmd) return get_velocity() < 2 end, ["Jittering"] = function(cmd) return globals.tickcount() % 4 < 2 end, ["Ducking"] = function(cmd) return cmd.in_duck == 1 end, } local function fl_func(cmd) if not elements.anti_aim.fakelag.enable:get() then reference.antiaim.fakelag.sv:set(16) return end local local_player = entity.get_local_player() if local_player ~= nil then local local_weapon = entity.get_prop(local_player, "m_hActiveWeapon") if local_weapon then local last_shot_time = entity.get_prop(local_weapon, "m_fLastShotTime") if last_shot_time ~= nil then local time_difference = globals.curtime() - last_shot_time if time_difference <= 0.0413 then local osaa_mode = elements.anti_aim.fakelag.osaa:get() if osaa_mode == "Break LC" then reference.antiaim.fakelag.limit:set(1) fl_modes_func(cmd, "Maximum", 1) elseif osaa_mode == "No Choke" then cmd.no_choke = true elseif osaa_mode == "Send Packet" then cmd.no_choke = 1 cmd.allow_send_packet = 1 reference.antiaim.fakelag.limit:set(15) fl_modes_func(cmd, "Fluctuate", 15) end return end end end end reference.antiaim.fakelag.sv:set(18) reference.antiaim.fakelag.enabled:set(true) reference.antiaim.fakelag.variance:set(0) local mode = elements.anti_aim.fakelag.mode:get() local amount = elements.anti_aim.fakelag.limit:get() local disablers = elements.anti_aim.fakelag.disablers:get() if #disablers > 0 then for _, disabler_name in ipairs(disablers) do if disablers_tbl[disabler_name] and disablers_tbl[disabler_name](cmd) then reference.antiaim.fakelag.enabled:set(false) return end end end fl_modes_func(cmd, mode, amount) end -- 添加脚本卸载处理函数,恢复sv的原始值 local function on_unload() reference.antiaim.fakelag.sv:set(16) end client.set_event_callback("setup_command", fl_func) client.set_event_callback("shutdown", on_unload) end local resolver2 = {} do local animstate_extended_type = ffi.typeof 'struct { int layer_order_preset; bool first_run_since_init; bool first_foot_plant_since_init; int last_update_tick; float eye_position_smooth_lerp; float strafe_change_weight_smooth_fall_off; float stand_walk_duration_state_has_been_valid; float stand_walk_duration_state_has_been_invalid; float stand_walk_how_long_to_wait_until_transition_can_blend_in; float stand_walk_how_long_to_wait_until_transition_can_blend_out; float stand_walk_blend_value; float stand_run_duration_state_has_been_valid; float stand_run_duration_state_has_been_invalid; float stand_run_how_long_to_wait_until_transition_can_blend_in; float stand_run_how_long_to_wait_until_transition_can_blend_out; float stand_run_blend_value; float crouch_walk_duration_state_has_been_valid; float crouch_walk_duration_state_has_been_invalid; float crouch_walk_how_long_to_wait_until_transition_can_blend_in; float crouch_walk_how_long_to_wait_until_transition_can_blend_out; float crouch_walk_blend_value; int cached_model_index; float step_height_left; float step_height_right; void* weapon_last_bone_setup; void* player; void* weapon; void* weapon_last; float last_update_time; int last_update_frame; float last_update_increment; float eye_yaw; float eye_pitch; float abs_yaw; float abs_yaw_last; float move_yaw; float move_yaw_ideal; float move_yaw_current_to_ideal; char pad1[4]; float primary_cycle; float move_weight; float move_weight_smoothed; float anim_duck_amount; float duck_additional; float recrouch_weight; float position_current[3]; float position_last[3]; float velocity[3]; float velocity_normalized[3]; float velocity_normalized_non_zero[3]; float velocity_length_xy; float velocity_length_z; float speed_as_portion_of_run_top_speed; float speed_as_portion_of_walk_top_speed; float speed_as_portion_of_crouch_top_speed; float duration_moving; float duration_still; bool on_ground; bool landing; float jump_to_fall; float duration_in_air; float left_ground_height; float land_anim_multiplier; float walk_run_transition; bool landed_on_ground_this_frame; bool left_the_ground_this_frame; float in_air_smooth_value; bool on_ladder; float ladder_weight; float ladder_speed; bool walk_to_run_transition_state; bool defuse_started; bool plant_anim_started; bool twitch_anim_started; bool adjust_started; char activity_modifiers_server[20]; float next_twitch_time; float time_of_last_known_injury; float last_velocity_test_time; float velocity_last[3]; float target_acceleration[3]; float acceleration[3]; float acceleration_weight; float aim_matrix_transition; float aim_matrix_transition_delay; bool flashed; float strafe_change_weight; float strafe_change_target_weight; float strafe_change_cycle; int strafe_sequence; bool strafe_changing; float duration_strafing; float foot_lerp; bool feet_crossed; bool player_is_accelerating; char pad2[24]; float duration_move_weight_is_too_high; float static_approach_speed; int previous_move_state; float stutter_step; float action_weight_bias_remainder; char pad3[112]; float camera_smooth_height; bool smooth_height_valid; float last_time_velocity_over_ten; float unk; float aim_yaw_min; float aim_yaw_max; float aim_pitch_min; float aim_pitch_max; int animstate_model_version; } **' local anim_layer_type = ffi.typeof 'struct { bool client_blend; float blend_in; void *studio_hdr; int dispatch_sequence; int second_dispatch_sequence; uint32_t order; uint32_t sequence; float prev_cycle; float weight; float weight_delta_rate; float playback_rate; float cycle; void *entity; char pad_0x0038[0x4]; } **' local get_entity_from_index = vtable_bind("client.dll", "VClientEntityList003", 3, "void*(__thiscall*)(void*, int)") ffi.cdef [[ struct animation_layer_t { char pad20[24]; uint32_t m_nSequence; float m_flPrevCycle; float m_flWeight; char pad20[8]; float m_flCycle; void *m_pOwner; char pad_0038[ 4 ]; }; struct c_animstate { char pad[ 3 ]; char m_bForceWeaponUpdate; //0x4 char pad1[ 91 ]; void* m_pBaseEntity; //0x60 void* m_pActiveWeapon; //0x64 void* m_pLastActiveWeapon; //0x68 float m_flLastClientSideAnimationUpdateTime; //0x6C int m_iLastClientSideAnimationUpdateFramecount; //0x70 float m_flAnimUpdateDelta; //0x74 float m_flEyeYaw; //0x78 float m_flPitch; //0x7C float m_flGoalFeetYaw; //0x80 float m_flCurrentFeetYaw; //0x84 float m_flCurrentTorsoYaw; //0x88 float m_flUnknownVelocityLean; //0x8C float m_flLeanAmount; //0x90 char pad2[ 4 ]; float m_flFeetCycle; //0x98 float m_flFeetYawRate; //0x9C char pad3[ 4 ]; float m_fDuckAmount; //0xA4 float m_fLandingDuckAdditiveSomething; //0xA8 char pad4[ 4 ]; float m_vOriginX; //0xB0 float m_vOriginY; //0xB4 float m_vOriginZ; //0xB8 float m_vLastOriginX; //0xBC float m_vLastOriginY; //0xC0 float m_vLastOriginZ; //0xC4 float m_vVelocityX; //0xC8 float m_vVelocityY; //0xCC char pad5[ 4 ]; float m_flUnknownFloat1; //0xD4 char pad6[ 8 ]; float m_flUnknownFloat2; //0xE0 float m_flUnknownFloat3; //0xE4 float m_flUnknown; //0xE8 float m_flSpeed2D; //0xEC float m_flUpVelocity; //0xF0 float m_flSpeedNormalized; //0xF4 float m_flFeetSpeedForwardsOrSideWays; //0xF8 float m_flFeetSpeedUnknownForwardOrSideways; //0xFC float m_flTimeSinceStartedMoving; //0x100 float m_flTimeSinceStoppedMoving; //0x104 bool m_bOnGround; //0x108 bool m_bInHitGroundAnimation; //0x109 float m_flTimeSinceInAir; //0x10A float m_flLastOriginZ; //0x10E float m_flHeadHeightOrOffsetFromHittingGroundAnimation; //0x112 float m_flStopToFullRunningFraction; //0x116 char pad7[ 4 ]; //0x11A float m_flMagicFraction; //0x11E char pad8[ 60 ]; //0x122 float m_flWorldForce; //0x15E char pad9[ 462 ]; //0x162 float m_flMaxYaw; //0x334 }; ]] -- 工具函数 local function clamp(val, min, max) return math.min(math.max(val, min), max) end local function normalize_angle(angle) if angle == nil then return 0 end while angle > 180 do angle = angle - 360 end while angle < -180 do angle = angle + 360 end return angle end local function angle_to_ushort(angle) return (0.0054931640625) * bit.band(math.floor(angle * (182.04444444444445)), 65535) end local function approach_angle(target, value, speed) target = angle_to_ushort(target) value = angle_to_ushort(value) local delta = normalize_angle(target - value) speed = math.abs(speed) if delta > speed then value = value + speed elseif delta < -speed then value = value - speed else value = target end return value end local function deg_to_rad(deg) return deg * (math.pi / 180) end local function rad_to_deg(rad) return rad * (180 / math.pi) end local function get_animstate(entity, extended) if not entity then return false end local ent_ptr = type(entity) == "cdata" and entity or get_entity_from_index(entity) if not ent_ptr or ent_ptr == ffi.NULL then return false end local ent_interface = ffi.cast("void***", ent_ptr) if extended == 1 then return ffi.cast(animstate_extended_type, ffi.cast("char*", ent_interface) + 39264)[0] else return ffi.cast("struct c_animstate**", ffi.cast("char*", ent_interface) + 39264)[0] end end local function get_animlayer(entity, layer_index) if not entity then return false end local ent_ptr = type(entity) == "cdata" and entity or get_entity_from_index(entity) if not ent_ptr or ent_ptr == ffi.NULL then return false end local ent_interface = ffi.cast("void***", ent_ptr) local ent_char = ffi.cast("char*", ent_ptr) return (ffi.cast(anim_layer_type, ent_char + 10640)[0])[layer_index] end local function get_max_rotation(player) local animstate = get_animstate(player, 0) local feet_speed = clamp(animstate.m_flFeetSpeedForwardsOrSideWays, 0, 1) local run_fraction = (animstate.m_flStopToFullRunningFraction * -0.30000001 - 0.19999999) * feet_speed + 1 local duck_amount = animstate.m_fDuckAmount if duck_amount > 0 then local feet_speed_duck = clamp(animstate.m_flFeetSpeedForwardsOrSideWays, 0, 1) local duck_speed = duck_amount * feet_speed_duck run_fraction = run_fraction + (duck_speed * (0.5 - run_fraction)) end return run_fraction end local function get_simulation_times(player) local ent_ptr = get_entity_from_index(player) if ent_ptr and ent_ptr ~= nil and player then return entity.get_prop(player, "m_flSimulationTime") - client.real_latency(), ffi.cast("float*", ffi.cast("uintptr_t", ent_ptr) + 620)[0] - client.real_latency() else return 0, 0 end end local function is_lag_compensation_ending(player) local simulation_time, anim_time = get_simulation_times(player) return toticks(simulation_time - anim_time) <= 1 end -- 玩家数据表 local players_data = {} for i = 1, 64 do players_data[i] = { jitter = {}, } end -- 初始化玩家数据 local function init_player_data(player_index) players_data[player_index] = { jitter = { yaw_cache = {}, yaw_cache_offset = 0, static_ticks = 0, jitter_ticks = 0, is_jitter = false, diff = 0, } } players_data[player_index].animstate1 = get_animstate(player_index, 1) players_data[player_index].jitter.yaw_cache[players_data[player_index].jitter.yaw_cache_offset % 6 + 1] = players_data[player_index].animstate1.eye_yaw players_data[player_index].jitter.yaw_cache_offset = players_data[player_index].jitter.yaw_cache_offset + 1 if players_data[player_index].jitter.yaw_cache_offset >= 7 then players_data[player_index].jitter.yaw_cache_offset = 0 end end -- 处理抖动检测 local function process_jitter_detection(player_index) init_player_data(player_index) players_data[player_index].animstate1 = get_animstate(player_index, 1) players_data[player_index].first_angle = normalize_angle(players_data[player_index].jitter.yaw_cache[6] or 0) players_data[player_index].second_angle = normalize_angle(players_data[player_index].jitter.yaw_cache[5] or 0) players_data[player_index].sin_first = math.sin(deg_to_rad(players_data[player_index].first_angle)) players_data[player_index].sin_second = math.sin(deg_to_rad(players_data[player_index].second_angle)) players_data[player_index].cos_first = math.cos(deg_to_rad(players_data[player_index].first_angle)) players_data[player_index].cos_second = math.cos(deg_to_rad(players_data[player_index].second_angle)) players_data[player_index].avg_yaw = normalize_angle(rad_to_deg(math.atan2( (players_data[player_index].sin_first + players_data[player_index].sin_second) / 2, (players_data[player_index].cos_first + players_data[player_index].cos_second) / 2 ))) players_data[player_index].jitter.diff = normalize_angle((players_data[player_index].avg_yaw - players_data[player_index].animstate1.eye_yaw) / 3) if math.abs(players_data[player_index].jitter.diff) <= 0 then players_data[player_index].jitter.static_ticks = math.min(players_data[player_index].jitter.static_ticks + 1, 3) players_data[player_index].jitter.jitter_ticks = 0 elseif math.abs(players_data[player_index].jitter.diff) >= 10 then players_data[player_index].jitter.jitter_ticks = math.min(players_data[player_index].jitter.jitter_ticks + 1, 3) players_data[player_index].jitter.static_ticks = 0 end players_data[player_index].jitter.is_jitter = players_data[player_index].jitter.jitter_ticks > players_data[player_index].jitter.static_ticks if not players_data[player_index].jitter.is_jitter then players_data[player_index].jitter.diff = 0 end end -- 处理不同步检测 local function process_desync_side(player_index) players_data[player_index].animstate = get_animstate(player_index, 0) players_data[player_index].animstate1 = get_animstate(player_index, 1) players_data[player_index].angle_diff = normalize_angle(players_data[player_index].animstate1.abs_yaw - players_data[player_index].animstate1.eye_yaw) players_data[player_index].desync_delta = normalize_angle(players_data[player_index].angle_diff - get_max_rotation(player_index) * 58) players_data[player_index].legs_jitter = normalize_angle((players_data[player_index].prev_goal_feet_yaw or 0) - players_data[player_index].animstate1.abs_yaw) if math.abs(players_data[player_index].legs_jitter) > 50 then players_data[player_index].side = players_data[player_index].legs_jitter > 0 and 1 or -1 elseif players_data[player_index].desync_delta == 0 then players_data[player_index].side = players_data[player_index].angle_diff > 0 and 1 or -1 else players_data[player_index].side = players_data[player_index].desync_delta > 0 and 1 or -1 end players_data[player_index].prev_goal_feet_yaw = players_data[player_index].animstate1.abs_yaw end -- 主解析函数 local function resolve_player(player_index) process_jitter_detection(player_index) process_desync_side(player_index) players_data[player_index].animstate = get_animstate(player_index, 0) players_data[player_index].animstate1 = get_animstate(player_index, 1) players_data[player_index].max_yaw = math.abs(players_data[player_index].animstate.m_flMaxYaw) players_data[player_index].velocity = vector(entity.get_prop(player_index, "m_vecVelocity")) players_data[player_index].animlayer3 = get_animlayer(player_index, 3) players_data[player_index].animlayer6 = get_animlayer(player_index, 6) players_data[player_index].m_extending = players_data[player_index].animlayer3.cycle == 0 and players_data[player_index].animlayer3.weight == 0 players_data[player_index].invalid_weight = players_data[player_index].velocity:length2dsqr() <= 1 and math.abs(players_data[player_index].velocity.z) <= 100 and (players_data[player_index].animlayer6.weight == 0 or players_data[player_index].animlayer6.weight == 1) players_data[player_index].max_rotation = get_max_rotation(player_index) players_data[player_index].angle_diff = normalize_angle(players_data[player_index].animstate1.abs_yaw - players_data[player_index].animstate1.eye_yaw) players_data[player_index].abs_angle_diff = math.abs(players_data[player_index].angle_diff) players_data[player_index].abs_prev_angle_diff = math.abs(players_data[player_index].prev_angle_diff or 0) players_data[player_index].networked_diff = math.max(players_data[player_index].abs_angle_diff, players_data[player_index].abs_prev_angle_diff) if players_data[player_index].abs_angle_diff <= 10 and players_data[player_index].abs_prev_angle_diff <= 10 then players_data[player_index].networked_desync = players_data[player_index].networked_diff elseif players_data[player_index].abs_angle_diff <= 35 and players_data[player_index].abs_prev_angle_diff <= 35 then players_data[player_index].networked_desync = math.min(29, players_data[player_index].networked_diff) else players_data[player_index].networked_desync = players_data[player_index].max_yaw * players_data[player_index].max_rotation / 1.8 end if is_lag_compensation_ending(player_index) or players_data[player_index].invalid_weight then players_data[player_index].desync = 0 elseif players_data[player_index].m_extending then players_data[player_index].desync = players_data[player_index].max_yaw * players_data[player_index].max_rotation * players_data[player_index].side else players_data[player_index].desync = clamp(players_data[player_index].networked_desync, 0, players_data[player_index].max_yaw * players_data[player_index].max_rotation) * players_data[player_index].side end if players_data[player_index].velocity:length2dsqr() > 1 or math.abs(players_data[player_index].velocity.z) > 100 then players_data[player_index].goal_feet_yaw = normalize_angle(approach_angle( normalize_angle(players_data[player_index].avg_yaw + players_data[player_index].desync), players_data[player_index].animstate1.abs_yaw, (players_data[player_index].animstate.m_flStopToFullRunningFraction * 20 + 30) * players_data[player_index].animstate.m_flLastClientSideAnimationUpdateTime )) else players_data[player_index].goal_feet_yaw = normalize_angle(approach_angle( normalize_angle(players_data[player_index].avg_yaw + players_data[player_index].desync), entity.get_prop(player_index, "m_flLowerBodyYawTarget"), players_data[player_index].animstate.m_flLastClientSideAnimationUpdateTime * 100 )) end players_data[player_index].prev_angle_diff = players_data[player_index].angle_diff end -- Resolver2主功能函数 function resolver2.run() if not elements.aimbot.resolver.enable:get() or elements.aimbot.resolver.settings.mode:get() ~= 'RAM + Animlayer \aD1AA3DFF[BETA]' then return end for player_index = 1, globals.maxplayers() do if player_index ~= entity.get_local_player() and entity.is_enemy(player_index) and entity.is_alive(player_index) and not entity.is_dormant(player_index) then resolve_player(player_index) local original_abs_yaw = players_data[player_index].animstate1.abs_yaw entity.set_prop(player_index, "m_angEyeAngles", players_data[player_index].animstate.m_flPitch, normalize_angle(players_data[player_index].animstate1.eye_yaw + players_data[player_index].desync), 0 ) players_data[player_index].animstate1.abs_yaw = players_data[player_index].goal_feet_yaw end end end -- 注册事件回调 client.set_event_callback("net_update_end", resolver2.run) -- 注册ESP标志:eye_yaw client.register_esp_flag("EYE", 255, 120, 120, function(entity_index) if not elements.aimbot.resolver.enable:get() or elements.aimbot.resolver.settings.mode:get() ~= 'RAM + Animlayer \aD1AA3DFF[BETA]' then return end if players_data[entity_index] == nil then return false end if players_data[entity_index].animstate1 == nil then return false end local eye_yaw = players_data[entity_index].animstate1.eye_yaw or 0 return true, string.format("EYE: %.1f", eye_yaw) end) -- 注册ESP标志:abs_yaw client.register_esp_flag("ABS", 255, 120, 120, function(entity_index) if not elements.aimbot.resolver.enable:get() or elements.aimbot.resolver.settings.mode:get() ~= 'RAM + Animlayer \aD1AA3DFF[BETA]' then return end if players_data[entity_index] == nil then return false end if players_data[entity_index].animstate1 == nil then return false end local abs_yaw = players_data[entity_index].animstate1.abs_yaw or 0 return true, string.format("ABS: %.1f", abs_yaw) end) -- 注册ESP标志:delta client.register_esp_flag("DELTA", 255, 255, 255, function(entity_index) if not elements.aimbot.resolver.enable:get() or elements.aimbot.resolver.settings.mode:get() ~= 'RAM + Animlayer \aD1AA3DFF[BETA]' then return end if players_data[entity_index] == nil then return false end if players_data[entity_index].animstate1 == nil then return false end local eye_yaw = players_data[entity_index].animstate1.eye_yaw or 0 local abs_yaw = players_data[entity_index].animstate1.abs_yaw or 0 local delta = math.abs(normalize_angle(eye_yaw - abs_yaw)) return true, string.format("DELTA[%.1f]", delta) end) end local resolver = { player_pose_data = {},player_memory = {},player_animation_data = {},last_shot_data = { damage = nil, hgroup = nil }}; do local js = panorama.open() local GameStateAPI = js.GameStateAPI local MyPersonaAPI = js.MyPersonaAPI local function contains(table, value) if table == nil then return false end table = ui.get(table) for i=0, #table do if table[i] == value then return true end end return false end local function get_entities(enemy_only, alive_only) local enemy_only = enemy_only ~= nil and enemy_only or false local alive_only = alive_only ~= nil and alive_only or true local result = {} local me = entity.get_local_player() local player_resource = entity.get_player_resource() for player = 1, globals.maxplayers() do local is_enemy, is_alive = true, true if enemy_only and not entity.is_enemy(player) then is_enemy = false end if is_enemy then if alive_only and entity.get_prop(player_resource, 'm_bAlive', player) ~= 1 then is_alive = false end if is_alive then table.insert(result, player) end end end return result end local function CalcAngle(x_src, y_src, z_src, x_dst, y_dst, z_dst) local x_delta = x_src - x_dst local y_delta = y_src - y_dst local z_delta = z_src - z_dst local hyp = math.sqrt(x_delta^2 + y_delta^2) local x = math.atan2(z_delta, hyp) * 57.295779513082 local y = math.atan2(y_delta , x_delta) * 180 / 3.14159265358979323846 if y > 180 then y = y - 180 end if y < -180 then y = y + 180 end return y end local function normalize_yaw(yaw) while yaw > 180 do yaw = yaw - 360 end while yaw < -180 do yaw = yaw + 360 end return yaw end local function get_velocity(player) local x,y,z = entity.get_prop(player, "m_vecVelocity") if x == nil then return end return math.sqrt(x*x + y*y + z*z) end local function get_origin(player) local x = entity.get_prop(player, "m_vecOrigin[0]") or 0 local y = entity.get_prop(player, "m_vecOrigin[1]") or 0 local z = entity.get_prop(player, "m_vecOrigin[2]") or 0 return {x = x, y = y, z = z} end local function is_crouching(player) if player == nil then return end local flags = entity.get_prop(player, "m_fFlags") if flags == nil then return end if bit.band(flags, 4) == 4 then return true end return false end local function in_air(player) if player == nil then return end local flags = entity.get_prop(player, "m_fFlags") if flags == nil then return end if bit.band(flags, 1) == 0 then return true end return false end local function wall_freestand() local data = {side = 1,last_side = 0,last_hit = 0,hit_side = 0} local me = entity.get_local_player() if (not me or entity.get_prop(me, "m_lifeState") ~= 0) then return end local x, y, z = client.eye_position() local _, yaw = client.camera_angles() local trace_data = {left = 0, right = 0} for i = yaw - 120, yaw + 120, 30 do if i ~= yaw then local rad = math.rad(i) local px, py, pz = x + 256 * math.cos(rad), y + 256 * math.sin(rad), z local fraction = client.trace_line(me, x, y, z, px, py, pz) local side = i < yaw and "left" or "right" trace_data[side] = trace_data[side] + fraction end end data.side = trace_data.left < trace_data.right and 1 or -1 if data.side == data.last_side then return end data.last_side = data.side local result = data.side == 1 and 1 or -1 return result end local function max_angle(player) local player_index = c_entity.new(player) local player_animstate = player_index:get_anim_state() local max_yaw = player_animstate.max_yaw local min_yaw = player_animstate.min_yaw local duck_amount = player_animstate.duck_amount local feet_speed_forwards_or_sideways = math.max(0, math.min(1, player_animstate.feet_speed_forwards_or_sideways)) local feet_speed_unknown_forwards_or_sideways = math.max(1, player_animstate.feet_speed_unknown_forwards_or_sideways) local value = ((player_animstate.stop_to_full_running_fraction * -0.30000001 - 0.19999999) * feet_speed_forwards_or_sideways + 1) if duck_amount > 0 then value = value + duck_amount * feet_speed_unknown_forwards_or_sideways * (0.5 - value) end local delta_yaw = math.abs(player_animstate.max_yaw) * value return math.min(math.abs(max_yaw), delta_yaw) end local function animation_data(player, max_yaw, state) local player_index = c_entity.new(player) if resolver.player_animation_data[player] == nil then resolver.player_animation_data[player] = { on_change_cycle_ticks = globals.tickcount(), pervious_feet_cycle = 0, } end local animstate = player_index:get_anim_state() local layer_1 = player_index:get_anim_overlay(1) local layer_3 = player_index:get_anim_overlay(3) local layer_6 = player_index:get_anim_overlay(6) local lby_data = { [47012329101563] = { 58, 1 }, [25012207031250] = { 35, 1 }, [59011840820313] = { 20, 1 }, [43014526367188] = { 58, -1 }, [59014892578125] = { 30, -1 } } local feet_cycle = (animstate.feet_cycle*100000000000000) local playbackrate_1 = layer_1.playback_rate local playbackrate_3 = layer_3.playback_rate local playbackrate_6 = layer_6.playback_rate local is_fake = ((playbackrate_3 == 0.96774184703827) or (playbackrate_6 == 0)) and false or true local side = (playbackrate_1 ~= 1) and 1 or -1 if feet_cycle ~= resolver.player_animation_data[player].pervious_feet_cycle then resolver.player_animation_data[player].on_change_cycle_ticks = globals.tickcount() resolver.player_animation_data[player].pervious_feet_cycle = feet_cycle end local static_cycle = ((globals.tickcount() - resolver.player_animation_data[player].on_change_cycle_ticks) > 5) local opposite_desync = static_cycle and ((lby_data[feet_cycle] ~= nil) and lby_data[feet_cycle][1] or nil) or nil local opposite_side = static_cycle and ((lby_data[feet_cycle] ~= nil) and lby_data[feet_cycle][2] or nil) or nil local default_desync = is_fake and max_yaw or 0 local default_side = is_fake and side or 1 local angle_amount = (opposite_desync ~= nil) and opposite_desync or default_desync local side_amount = (opposite_side ~= nil) and opposite_side or (resolver.player_memory[player].is_jitter and default_side*resolver.player_memory[player].jitter_side*resolver.player_memory[player].stored_mode[state] or default_side) resolver.player_memory[player].opposite = static_cycle and (lby_data[feet_cycle] ~= nil) resolver.player_memory[player].opposite_angle = opposite_desync resolver.player_memory[player].anim_side = default_side local got_new_data = (resolver.player_memory[player].opposite and (resolver.player_memory[player].pervious_opposite_angle ~= opposite_desync)) or (side_amount ~= resolver.player_memory[player].pervious_anim_side) local got_new_data2 = (resolver.player_memory[player].old_weapon_side ~= default_side) if resolver.player_memory[player].anim_down and got_new_data then resolver.player_memory[player].anim_down = false end if got_new_data2 then if resolver.player_memory[player].is_jitter and not resolver.player_memory[player].opposite then if ((resolver.player_memory[player].jitter_side == 1) and (default_side == 1)) or ((resolver.player_memory[player].jitter_side == -1) and (default_side == -1)) then resolver.player_memory[player].stored_mode[state] = 1 else resolver.player_memory[player].stored_mode[state] = -1 end end resolver.player_memory[player].old_weapon_side = default_side end return angle_amount, side_amount end local function optimize_angle_to_yaw(angle, yaw) local abs_yaw = math.abs(yaw) local abs_angle = math.abs(angle) local max_yaw_90 = abs_yaw > 90 and math.abs(180 - abs_yaw) or abs_yaw local yaw_proccent = (max_yaw_90/10)/3.5 local angle_proccent = math.floor(abs_angle/math.max(1, yaw_proccent)) return math.max(0, angle_proccent) end local function create_angle(angle, adaptive, yaw) local angle_s = math.max(0, (angle - adaptive)) return optimize_angle_to_yaw(angle_s, yaw) end local function state(velocity) local cnds if velocity < 5 and not in_air(entity.get_local_player()) and not is_crouching(entity.get_local_player()) then cnds = 1 elseif in_air(entity.get_local_player()) and not is_crouching(entity.get_local_player()) then cnds = 4 elseif in_air(entity.get_local_player()) and is_crouching(entity.get_local_player()) then cnds = 5 elseif is_crouching(entity.get_local_player()) and not in_air(entity.get_local_player()) then cnds = 6 else if velocity <= 78 then cnds = 3 else cnds = 2 end end return cnds end local function is_breaking_lc(player, player_data) if not player_data.position_history or #player_data.position_history < 2 then return false end local cur_pos = get_origin(player) local old_pos = player_data.position_history[#player_data.position_history] local vel = get_velocity(player) local speed = vel or 0 local time_delta = globals.tickinterval() * (globals.tickcount() - player_data.last_tickcount) local max_possible_delta = speed * time_delta local actual_delta = math.sqrt((cur_pos.x - old_pos.x)^2 + (cur_pos.y - old_pos.y)^2 + (cur_pos.z - old_pos.z)^2) return actual_delta > max_possible_delta * 1.5 or actual_delta > 64 end client.set_event_callback("aim_fire", function(e) resolver.last_shot_data.damage = e.damage resolver.last_shot_data.hgroup = e.hitgroup end) client.set_event_callback("aim_miss", function(e) if e.reason ~= "?" then return end local player = e.target if resolver.player_memory[player] == nil then return end resolver.player_memory[player].resolved = false resolver.player_memory[player].consecutive_hits = 0 if not resolver.player_memory[player].anim_down then if resolver.player_memory[player].opposite then resolver.player_memory[player].pervious_opposite_angle = resolver.player_memory[player].opposite_angle end resolver.player_memory[player].pervious_anim_side = resolver.player_memory[player].anim_side resolver.player_memory[player].anim_down = true else resolver.player_memory[player].misses = ((resolver.player_memory[player].misses + 1) > 2) and 0 or (resolver.player_memory[player].misses + 1) end end) client.set_event_callback("aim_hit", function(e) local wanted_damage = resolver.last_shot_data.damage local wanted_hgroup = resolver.last_shot_data.hgroup local player = e.target if resolver.player_memory[player] == nil then return end resolver.player_memory[player].consecutive_hits = resolver.player_memory[player].consecutive_hits + 1 if (wanted_damage == e.damage) then return end local velocity = get_velocity(player) local state_val = state(velocity) local missmatch_amount = math.abs(wanted_damage - e.damage) local step = 4.45 resolver.player_memory[player].adaptive_angle[state_val] = (missmatch_amount/step) local go_store = { [0] = false, [1] = true, [2] = true, [3] = true, [4] = true, [5] = true, [6] = true, [7] = true, [8] = true, [9] = false, [10] = false } if go_store[e.hitgroup] and (resolver.player_memory[player].misses ~= 0) then if (resolver.player_memory[player].stored_mode[state_val] == 1) then resolver.player_memory[player].misses = 0 resolver.player_memory[player].stored_mode[state_val] = -1 else resolver.player_memory[player].misses = 0 resolver.player_memory[player].stored_mode[state_val] = 1 end end end) local function JitterData(player, yaw, world_yaw, pitch) local velocity = get_velocity(player) local state = state(velocity) if (globals.tickcount() - resolver.player_memory[player].on_yaw_change_ticks) < 0 then resolver.player_memory[player].on_yaw_change_ticks = 0 end if yaw ~= resolver.player_memory[player].pervious_yaw then local needs_update = false if (yaw > 0) ~= (resolver.player_memory[player].pervious_yaw > 0) or (yaw > resolver.player_memory[player].pervious_yaw and math.abs(yaw - resolver.player_memory[player].pervious_yaw) > 10) or (yaw < resolver.player_memory[player].pervious_yaw and math.abs(yaw - resolver.player_memory[player].pervious_yaw) > 10) then needs_update = true end if needs_update then resolver.player_memory[player].yaw = resolver.player_memory[player].pervious_world_yaw resolver.player_memory[player].jitter_side = yaw > resolver.player_memory[player].pervious_yaw and -1 or 1 resolver.player_memory[player].on_yaw_change_ticks = globals.tickcount() resolver.player_memory[player].pervious_world_yaw = world_yaw resolver.player_memory[player].pervious_yaw = yaw end end if (pitch > (resolver.player_memory[player].pervious_pitch + 37)) or (pitch < (resolver.player_memory[player].pervious_pitch - 37)) then resolver.player_memory[player].pitch = math.max(resolver.player_memory[player].pervious_pitch, pitch) resolver.player_memory[player].on_pitch_change_ticks = globals.tickcount() resolver.player_memory[player].pervious_pitch = pitch end resolver.player_memory[player].is_jitter = ((globals.tickcount() - resolver.player_memory[player].on_yaw_change_ticks) <= 1) resolver.player_memory[player].is_breaker = ((globals.tickcount() - resolver.player_memory[player].on_pitch_change_ticks) <= 1) end local function AngleData(player, yaw) local resolver_freestand = wall_freestand() local velocity = get_velocity(player) local state_val = state(velocity) local side_freestand = resolver.player_memory[player].is_jitter and resolver.player_memory[player].jitter_side or resolver_freestand local stored_side_mode = side_freestand*resolver.player_memory[player].stored_mode[state_val] local brute_side = (resolver.player_memory[player].misses == 0) and stored_side_mode or -stored_side_mode local brute_side_anim = (resolver.player_memory[player].misses == 0) and 1 or -1 local xuid = GameStateAPI.GetPlayerXuidStringFromEntIndex(player) local is_bot = GameStateAPI.IsFakePlayer(xuid) local max_yaw = max_angle(player) local anim_angle, anim_side = animation_data(player, max_yaw, state_val) local adaptive_angle = resolver.player_memory[player].adaptive_angle[state_val] if is_bot then resolver.player_memory[player].angle = 0 else resolver.player_memory[player].angle = create_angle(anim_angle, adaptive_angle, yaw)*brute_side end end client.set_event_callback("pre_render", function() if not elements.aimbot.resolver.enable:get() or elements.aimbot.resolver.settings.mode:get() ~= 'Entitylayer' then return end local players = get_entities(true, true) for k, player in pairs(players) do if (player == nil) then goto skip end local yaw = entity.get_prop(player, "m_angEyeAngles[1]") local pitch = entity.get_prop(player, "m_angEyeAngles[0]") if resolver.player_pose_data[player] == nil then resolver.player_pose_data[player] = { pitch = pitch, yaw = yaw, } end resolver.player_pose_data[player].pitch = pitch resolver.player_pose_data[player].yaw = yaw ::skip:: end end) client.set_event_callback("setup_command", function() if not elements.aimbot.resolver.enable:get() or elements.aimbot.resolver.settings.mode:get() ~= 'Entitylayer' then return end local players = get_entities(true, true) for k, player in pairs(players) do if (player == nil) then goto skip end if (resolver.player_pose_data[player] == nil) then goto skip end local world_yaw = resolver.player_pose_data[player].yaw local world_pitch = resolver.player_pose_data[player].pitch local hitbox_pos_x, hitbox_pos_y, hitbox_pos_z = entity.hitbox_position(player, 0) local local_x, local_y, local_z = entity.get_prop(entity.get_local_player(), "m_vecOrigin") local dynamic = CalcAngle(local_x, local_y, local_z, hitbox_pos_x, hitbox_pos_y, hitbox_pos_z) local fake_yaw = math.floor(normalize_yaw(world_yaw)) local yaw = ((math.floor(normalize_yaw(dynamic)) - fake_yaw) > 0 and (math.floor(normalize_yaw(dynamic)) - fake_yaw) - 180 or (math.floor(normalize_yaw(dynamic)) - fake_yaw) + 180)*-1 local velocity = get_velocity(player) local state_val = state(velocity) if (resolver.player_memory[player] == nil) then resolver.player_memory[player] = { misses = 0, angle = 0, yaw = 0, pitch = 0, opposite = false, opposite_angle = 0, old_weapon_side = 0, anim_side = 0, pervious_opposite_angle = 0, pervious_anim_side = 0, anim_down = false, on_yaw_change_ticks = 0, on_pitch_change_ticks = 0, pervious_world_yaw = world_yaw, pervious_yaw = yaw, pervious_pitch = world_pitch, is_jitter = false, is_breaker = false, stored_mode = {1,1,1,1,1,1,}, adaptive_angle = {0,0,0,0,0,0,}, resolved = false, consecutive_hits = 0, position_history = {}, last_tickcount = 0, is_breaking_lc = false } end local origin = get_origin(player) table.insert(resolver.player_memory[player].position_history, 1, origin) if #resolver.player_memory[player].position_history > 16 then table.remove(resolver.player_memory[player].position_history) end resolver.player_memory[player].is_breaking_lc = is_breaking_lc(player, resolver.player_memory[player]) resolver.player_memory[player].last_tickcount = globals.tickcount() JitterData(player, yaw, world_yaw, world_pitch) AngleData(player, yaw) ::skip:: end end) client.set_event_callback("paint", function() local player = client.current_threat() if player == nil then return end if not entity.is_alive(entity.get_local_player()) then return end if not elements.aimbot.resolver.enable:get() or elements.aimbot.resolver.settings.mode:get() ~= 'Entitylayer' then plist.set(player, "Force body yaw", false) plist.set(player, "Force pitch", false) return end if (resolver.player_memory[player] == nil) then return end local player_index = c_entity.new(player) plist.set(player, "Correction active", true) plist.set(player, "Force body yaw", true) plist.set(player, "Force pitch", resolver.player_memory[player].is_breaker) plist.set(player, "Force body yaw value", resolver.player_memory[player].angle) plist.set(player, "Force pitch value", resolver.player_memory[player].pitch) if resolver.player_memory[player].is_jitter then player_index:set_prop("m_angEyeAngles[1]", resolver.player_memory[player].yaw) end player_index:set_prop("m_angEyeAngles[2]", 0) end) client.set_event_callback("player_death", function(e) local player = client.userid_to_entindex(e.userid) local killer = client.userid_to_entindex(e.attacker) if killer == entity.get_local_player() then if resolver.player_memory[player] == nil then return end resolver.player_memory[player].misses = 0 resolver.player_memory[player].anim_down = false resolver.player_memory[player].consecutive_hits = 0 if e.headshot then resolver.player_memory[player].resolved = true end end end) client.set_event_callback("round_start", function() local players = get_entities(true, false) for k, player in pairs(players) do if resolver.player_memory[player] == nil then return end resolver.player_memory[player].misses = 0 resolver.player_memory[player].anim_down = false resolver.player_memory[player].resolved = false resolver.player_memory[player].consecutive_hits = 0 end end) client.register_esp_flag("RESOLVING", 255, 150, 150, function(entity_index) if not elements.aimbot.resolver.enable:get() or elements.aimbot.resolver.settings.mode:get() ~= 'Entitylayer' then return end if resolver.player_memory[entity_index] == nil then return false end return not resolver.player_memory[entity_index].resolved end) client.register_esp_flag("RESOLVED", 200, 255, 175, function(entity_index) if not elements.aimbot.resolver.enable:get() or elements.aimbot.resolver.settings.mode:get() ~= 'Entitylayer' then return end if resolver.player_memory[entity_index] == nil then return false end return resolver.player_memory[entity_index].resolved end) client.register_esp_flag("STORED FS SIDE", 255, 190, 135, function(entity_index) if not elements.aimbot.resolver.enable:get() or elements.aimbot.resolver.settings.mode:get() ~= 'Entitylayer' then return end if resolver.player_memory[entity_index] == nil then return false end if entity.is_dormant(entity_index) then return false end local velocity = get_velocity(entity_index) local state = state(velocity) local mode = (resolver.player_memory[entity_index].stored_mode[state] == 1) and "+" or "-" return true, "STATE [ "..mode.." ]" end) client.register_esp_flag("ANTI-AIM DATA", 255, 255, 255, function(entity_index) if not elements.aimbot.resolver.enable:get() or elements.aimbot.resolver.settings.mode:get() ~= 'Entitylayer' then return end if resolver.player_memory[entity_index] == nil then return false end if entity.is_dormant(entity_index) then return false end local mode = resolver.player_memory[entity_index].is_breaker and "DEFENSIVE" or (resolver.player_memory[entity_index].is_jitter and "JITTER" or "STATIC") return true, mode end) client.register_esp_flag("LC", 255, 120, 120, function(entity_index) if not elements.aimbot.resolver.enable:get() or elements.aimbot.resolver.settings.mode:get() ~= 'Entitylayer' then return end if resolver.player_memory[entity_index] == nil then return false end if entity.is_dormant(entity_index) then return false end return resolver.player_memory[entity_index].is_breaking_lc end) client.register_esp_flag("RESOLVING TYPE", 210, 255, 160, function(entity_index) if not elements.aimbot.resolver.enable:get() or elements.aimbot.resolver.settings.mode:get() ~= 'Entitylayer' then return end local player = client.current_threat() if player ~= entity_index then return false end if entity.is_dormant(entity_index) then return false end if resolver.player_memory[entity_index] == nil then return false end local xuid = GameStateAPI.GetPlayerXuidStringFromEntIndex(player) local is_bot = GameStateAPI.IsFakePlayer(xuid) local mode = is_bot and "BOT" or (resolver.player_memory[entity_index].anim_down and "BRUTE" or "ANIM") local max_yaw = math.floor(max_angle(entity_index)) return true, mode.." [ "..max_yaw.." ]" end) end local aim_punch_fix = { last_health = 100, override_active = false }; do local function on_setup_command() if not elements.aimbot.aim_punch_fix:get() then return end local me = entity.get_local_player() if not me or not entity.is_alive(me) then aim_punch_fix.last_health = 100 if aim_punch_fix.override_active then reference.rage.aimbot.minimum_hitchance:override() aim_punch_fix.override_active = false end return end local current_health = entity.get_prop(me, 'm_iHealth') or 100 if current_health < aim_punch_fix.last_health then reference.rage.aimbot.minimum_hitchance:override(100) aim_punch_fix.override_active = true elseif aim_punch_fix.override_active then reference.rage.aimbot.minimum_hitchance:override() aim_punch_fix.override_active = false end aim_punch_fix.last_health = current_health end elements.aimbot.aim_punch_fix:set_event('setup_command', on_setup_command) end -- 定义全局变量用于跟踪auto airstop状态 local auto_air_stop_active = false local auto_air_stop do local delay_ticks = 13 local last_air_tick = 0 local function can_shoot (me, gun) if not me or not gun then return false end local next_attack = entity.get_prop(me, 'm_flNextAttack') or 0 local next_primary = entity.get_prop(gun, 'm_flNextPrimaryAttack') or 0 local curtime = globals.curtime() local clip = entity.get_prop(gun, 'm_iClip1') or 0 return (math.max(next_attack, next_primary) <= curtime) and clip > 0 end local function is_enemy_visible (local_player, enemy) local local_player_origin = {entity.get_origin(local_player)} local enemy_origin = {entity.get_origin(enemy)} if local_player_origin[1] == nil or enemy_origin[1] == nil then return false end local trace_fraction, _ = client.trace_bullet(local_player, local_player_origin[1], local_player_origin[2], local_player_origin[3] + 16, enemy_origin[1], enemy_origin[2], enemy_origin[3] + 16) return trace_fraction end local function estimate_hitchance (me, gun) local weapon_class = entity.get_classname(gun) if weapon_class ~= 'CWeaponSSG08' then return 0 end local scoped = entity.get_prop(me, 'm_bIsScoped') == 1 local duck = entity.get_prop(me, 'm_flDuckAmount') or 0 local velocity = vector(entity.get_prop(me, 'm_vecVelocity')) local speed = velocity:length2d() local dist = 0 local threat = client.current_threat() if threat then local my_pos = vector(entity.get_origin(me)) local enemy_pos = vector(entity.get_origin(threat)) dist = my_pos:dist(enemy_pos) end local base_spread = 0.002 if not scoped then base_spread = 0.08 end if duck == 1 then base_spread = base_spread * 0.7 end if speed > 5 then base_spread = base_spread + (speed / 300) * 0.08 end if dist > 1000 then base_spread = base_spread + (dist - 1000) / 4000 end local hc = 100 - (base_spread * 1000) if hc > 100 then hc = 100 end if hc < 0 then hc = 0 end return hc end local function angle_math (x, y) local angle_x_sin = math.sin(math.rad(x)) local angle_x_cos = math.cos(math.rad(x)) local angle_y_sin = math.sin(math.rad(y)) local angle_y_cos = math.cos(math.rad(y)) return angle_x_cos * angle_y_cos, angle_x_cos * angle_y_sin, -angle_x_sin end local function on_setup_command (e) if not elements.aimbot.auto_air_stop.enable:get() then return end local me = entity.get_local_player() if not me or not entity.is_alive(me) then last_air_tick = 0 return end local gun = entity.get_player_weapon(me) if not gun or entity.get_classname(gun) ~= 'CWeaponSSG08' then return end local tick = globals.tickcount() if not is_on_ground then if last_air_tick == 0 then last_air_tick = tick end else last_air_tick = 0 return end if tick - last_air_tick < delay_ticks then return end if not can_shoot(me, gun) then return end local local_team = entity.get_prop(me, 'm_iTeamNum') local enemies = entity.get_players(true) for i = 1, #enemies do local enemy = enemies[i] if entity.get_prop(enemy, 'm_iTeamNum') ~= local_team and entity.is_alive(enemy) then if is_enemy_visible(me, enemy) then local distance_check_passed = false local actual_distance = 0 local distance_limit = 0 if elements.aimbot.auto_air_stop.settings.addons:get('Distance to enemy stopping') then local local_origin = vector(entity.get_origin(me)) local enemy_origin = vector(entity.get_origin(enemy)) actual_distance = local_origin:dist(enemy_origin) distance_limit = elements.aimbot.auto_air_stop.settings.distance:get() if actual_distance <= distance_limit then distance_check_passed = true end else distance_check_passed = true end if distance_check_passed then local auto_scope_executed = false if elements.aimbot.auto_air_stop.settings.addons:get('Auto scope when stopping') then local weapon_class = entity.get_classname(gun) if weapon_class == 'CWeaponSSG08' then local is_scoped = entity.get_prop(me, 'm_bIsScoped') ~= 0 if not is_scoped then e.in_attack2 = true auto_scope_executed = true end end end local hc = estimate_hitchance(me, gun) local is_scoped = entity.get_prop(me, 'm_bIsScoped') ~= 0 local hitchance_limit = 25 if elements.aimbot.auto_air_stop.settings.addons:get('Hitchance limit') then hitchance_limit = elements.aimbot.auto_air_stop.settings.hitchance:get() end if hc < hitchance_limit and not is_scoped then if not auto_scope_executed then return end end local velocity = vector(entity.get_prop(me, 'm_vecVelocity')) local speed = velocity:length2d() e.quick_stop = true auto_air_stop_active = true local velocity_angles = vector(velocity:angles()) local camera_angles = vector(client.camera_angles()) local calc_x, calc_y = angle_math(velocity_angles.x, velocity_angles.y) local sidespeed = -cvar.cl_sidespeed:get_float() local final_x = sidespeed * calc_x local final_y = sidespeed * calc_y e.in_speed = 1 e.forwardmove = final_x e.sidemove = final_y return end end end end end local original_on_setup_command = on_setup_command on_setup_command = function(e) auto_air_stop_active = false original_on_setup_command(e) end local function on_paint() if auto_air_stop_active then renderer.indicator(255, 255, 255, 255, 'AIR') end end client.set_event_callback('setup_command', on_setup_command) client.set_event_callback('paint', on_paint) end local aimbot_helper do local helper_miss_counter = 0 client.set_event_callback('aim_miss', function (e) if e.reason ~= 'prediction error' then helper_miss_counter = helper_miss_counter + 1 end end) client.set_event_callback('round_prestart', function () helper_miss_counter = 0 end) local function check_trigger (triggers, hp, miss_count, hp_threshold, miss_threshold, height_diff) for _, trigger in ipairs(triggers) do if (trigger == 'Enemy HP < X' and hp < hp_threshold) or (trigger == 'X Missed Shots' and miss_count > miss_threshold) or (trigger == 'Lethal' and hp <= 30) or (trigger == 'Height advantage' and height_diff > 70) or (trigger == 'Enemy higher than you' and height_diff < -70) then return true else return false end end return false end local function on_setup_command () if not elements.aimbot.aimbot_helper.enable:get() then return end local me = entity.get_local_player() if not me or not entity.is_alive(me) then reference.playerlist.reset:set(true) helper_miss_counter = 0 return end local gun = entity.get_player_weapon(me) if not gun then return end local weapon = entity.get_classname(gun) local weapon_config = (weapon == 'CWeaponSSG08' and elements.aimbot.aimbot_helper.settings.ssg) or (weapon == 'CWeaponAWP' and elements.aimbot.aimbot_helper.settings.awp) or ((weapon == 'CWeaponG3SG1' or weapon == 'CWeaponSCAR20') and elements.aimbot.aimbot_helper.settings.auto) if not weapon_config then return end local my_pos = vector(entity.get_origin(me)) local players = entity.get_players(true) for _, target in ipairs(players) do if not target or not entity.is_alive(target) or entity.is_dormant(target) then reference.playerlist.reset:set(true) helper_miss_counter = 0 return end local hp = entity.get_prop(target, 'm_iHealth') or 100 local enemy_pos = vector(entity.get_origin(target)) local height_diff = math.ceil(my_pos.z - enemy_pos.z) if weapon_config.select:get('Force safe point') and check_trigger(weapon_config.force_safe:get(), hp, helper_miss_counter, weapon_config.force_safe_hp:get(), weapon_config.force_safe_miss:get(), height_diff) then plist.set(target, 'Override safe point', 'On') else plist.set(target, 'Override safe point', '-') end local prefer_body = weapon_config.select:get('Prefer body aim') and check_trigger(weapon_config.prefer_body:get(), hp, helper_miss_counter, weapon_config.prefer_body_hp:get(), weapon_config.prefer_body_miss:get(), height_diff) local force_body = weapon_config.select:get('Force body aim') and check_trigger(weapon_config.force_body:get(), hp, helper_miss_counter, weapon_config.force_body_hp:get(), weapon_config.force_body_miss:get(), height_diff) if force_body then plist.set(target, 'Override prefer body aim', 'Force') elseif prefer_body then plist.set(target, 'Override prefer body aim', 'On') else plist.set(target, 'Override prefer body aim', '-') end if weapon_config.select:get('Ping spike') then reference.rage.ps[1]:override(true) reference.rage.ps[2]:override(weapon_config.ping_spike_value:get()) else reference.rage.ps[1]:override() reference.rage.ps[2]:override() end end end elements.aimbot.aimbot_helper.enable:set_event('setup_command', function () client.update_player_list() on_setup_command() end) end local distance_based_multipoint = { }; do local function vec2_distance(f_x, f_y, t_x, t_y) local delta_x, delta_y = f_x - t_x, f_y - t_y return math.sqrt(delta_x*delta_x + delta_y*delta_y) end local function get_all_player_positions(ctx, screen_width, screen_height, enemies_only) local player_indexes = {} local player_positions = {} local players = entity.get_players(enemies_only) if #players == 0 then return end for i=1, #players do local player = players[i] local px, py, pz = entity.get_prop(player, "m_vecOrigin") local vz = entity.get_prop(player, "m_vecViewOffset[2]") if pz ~= nil and vz ~= nil then pz = pz + (vz*0.5) local sx, sy = client.world_to_screen(ctx, px, py, pz) if sx ~= nil and sy ~= nil then if sx >= 0 and sx <= screen_width and sy >= 0 and sy <= screen_height then player_indexes[#player_indexes+1] = player player_positions[#player_positions+1] = {sx, sy} end end end end return player_indexes, player_positions end local function check_fov(ctx) local screen_width, screen_height = client.screen_size() local screen_center_x, screen_center_y = screen_width*0.5, screen_height*0.5 if get_all_player_positions(ctx, screen_width, screen_height, true) == nil then return end local enemy_indexes, enemy_coords = get_all_player_positions(ctx, screen_width, screen_height, true) if #enemy_indexes <= 0 then return true end if #enemy_coords == 0 then return true end local closest_fov = 133337 local closest_entindex = 133337 for i=1, #enemy_coords do local x = enemy_coords[i][1] local y = enemy_coords[i][2] local current_fov = vec2_distance(x, y, screen_center_x, screen_center_y) if current_fov < closest_fov then closest_fov = current_fov closest_entindex = enemy_indexes[i] end end return closest_entindex end local function getDistance(ctx) local target_index = check_fov(ctx) if not target_index or target_index == 133337 then return nil end local lp_index = entity.get_local_player() if not lp_index then return nil end local lp_x, lp_y, lp_z = entity.get_prop(lp_index,"m_vecOrigin") local target_x, target_y, target_z = entity.get_prop(target_index,"m_vecOrigin") if not lp_x or not target_x then return nil end local dx, dy, dz = lp_x - target_x, lp_y - target_y, lp_z - target_z local dist = math.sqrt(dx*dx + dy*dy + dz*dz) if (dist ~= nil and dist > 0) then local meters = dist * 0.0254 local feet = meters * 3.281 return feet end return nil end distance_based_multipoint.handle = function(ctx) -- 检查是否启用了aimbot helper功能 if not elements.aimbot.aimbot_helper.enable:get() then return end local local_player = entity.get_local_player() if not local_player then return end local weapon = entity.get_player_weapon(local_player) if not weapon then return end local weapon_class = entity.get_classname(weapon) if not weapon_class then return end -- 根据实际装备的武器类型选择对应的设置 local weapon_settings = nil if weapon_class == 'CWeaponSSG08' then weapon_settings = elements.aimbot.aimbot_helper.settings.ssg elseif weapon_class == 'CWeaponAWP' then weapon_settings = elements.aimbot.aimbot_helper.settings.awp elseif weapon_class == 'CWeaponG3SG1' or weapon_class == 'CWeaponSCAR20' then weapon_settings = elements.aimbot.aimbot_helper.settings.auto end -- 如果不是支持的武器或者没有启用自适应多点,则返回 if not weapon_settings or not weapon_settings.select:get('Adaptive multipoint') then return end local distance = getDistance(ctx) local maxmp = weapon_settings.mp_upper:get() local minmp = weapon_settings.mp_lower:get() local min_distance = 40 local max_distance = 120 local distance_range = max_distance - min_distance local mp_range = maxmp - minmp local mp = ui.reference('rage', 'aimbot', 'Multi-point scale') if distance ~= nil and mp then local value if (distance <= min_distance) then value = maxmp elseif (distance >= max_distance) then value = minmp else value = maxmp - (distance - min_distance) / distance_range * mp_range end -- 正确设置多点值 if type(mp) == "table" then -- 尝试设置可能的引用 if mp[1] then ui.set(mp[1], value) end if mp[2] then ui.set(mp[2], value) end else -- 直接设置引用 ui.set(mp, value) end end end client.set_event_callback('paint', distance_based_multipoint.handle) elements.aimbot.aimbot_helper.enable:set_event('paint', distance_based_multipoint.handle) end local ai_peek = { }; do ai_peek.set_movement = function (e, destination, local_player) local move_yaw = vector(vector(entity.get_origin(local_player)):to(destination):angles()).y e.in_forward = 1 e.in_back = 0 e.in_moveleft = 0 e.in_moveright = 0 e.in_speed = 0 e.forwardmove = 800 e.sidemove = 0 e.move_yaw = move_yaw end ai_peek.extrapolate_position = function (ent, origin, ticks, inverted) local tickinterval = globals.tickinterval() local sv_gravity = cvar.sv_gravity:get_float() * tickinterval local sv_jump_impulse = cvar.sv_jump_impulse:get_float() * tickinterval local p_origin, prev_origin = origin, origin local velocity = vector(entity.get_prop(ent, 'm_vecVelocity')) local gravity = velocity.z > 0 and -sv_gravity or sv_jump_impulse for i = 1, ticks do prev_origin = p_origin p_origin = vector( p_origin.x + (inverted and -(velocity.x * tickinterval) or (velocity.x * tickinterval)), p_origin.y + (inverted and -(velocity.y * tickinterval) or (velocity.y * tickinterval)), p_origin.z + (inverted and -((velocity.z + gravity) * tickinterval) or (velocity.z + gravity) * tickinterval) ) local fraction = client.trace_line(-1, prev_origin.x, prev_origin.y, prev_origin.x, p_origin.x, p_origin.y, p_origin.x ) if fraction <= .99 then return prev_origin end end return p_origin end ai_peek.extend_vector = function (pos, length, angle) local rad = math.rad(angle) return vector( pos.x + (math.cos(rad) * length), pos.y + (math.sin(rad) * length), pos.z ) end ai_peek.get_players = function (include_enemies, include_teammates, include_localplayer, include_dormant, include_invisible) local result = { } local player_resource = entity.get_player_resource() local maxplayers = globals.maxplayers() local plocal = entity.get_local_player() for player = 1, maxplayers do if entity.get_prop(player_resource, 'm_bConnected', player) ~= 1 then goto skip end if entity.get_prop(player_resource, 'm_bAlive', player) ~= 1 then goto skip end if not include_localplayer and player == plocal then goto skip end if include_teammates then if not include_enemies and entity.is_enemy(player) then goto skip end elseif not entity.is_enemy(player) then goto skip end if not include_dormant and entity.is_dormant(player) then goto skip end if not include_invisible and select(5, entity.get_bounding_box(player)) <= 0 then goto skip end result[#result + 1] = player ::skip:: end return result end local calc = function (xdelta, ydelta) if xdelta == 0 and ydelta == 0 then return 0 end return math.deg(math.atan2(ydelta, xdelta)) end ai_peek.get_nearest_player = function (players) local lp_eyepos = vector(client.eye_position()) local lp_camera_angles = vector(client.camera_angles()) local bestenemy = nil local fov = 180 for i = 1, #players do local player = players[i] local player_origin = vector(entity.get_origin(player)) local cur_fov = math.abs( aa_func.normalize_angle( calc(lp_eyepos.x - player_origin.x, lp_eyepos.y - player_origin.y) - lp_camera_angles.y + 180 ) ) if cur_fov < fov then fov = cur_fov bestenemy = player end end return bestenemy end ai_peek.hitgroups_to_hitboxes = { ['Head'] = { 0 }, ['Chest'] = { 4, 5, 6 }, ['Stomach'] = { 2, 3 }, ['Arms'] = { 13, 14, 15, 16, 17, 18 }, ['Legs'] = { 7, 8, 9, 10 }, ['Feet'] = { 11, 12 } } ai_peek.allowed_hitboxes = { 0, 4, 5, 6, 2, 3, 13, 14, 15, 16, 17, 18, 7, 8, 9, 10, 11, 12 } ai_peek.hitgroup_data = { ['Head'] = 1, ['Neck'] = 8, ['Pelvis'] = 3, ['Stomach'] = 3, ['Lower Chest'] = 2, ['Chest'] = 2, ['Upper Chest'] = 2, ['Left Upper Leg'] = 6, ['Right Upper Leg'] = 7, ['Left Lower Leg'] = 6, ['Right Lower Leg'] = 7, ['Left Foot'] = 6, ['Right Foot'] = 7, ['Left Hand'] = 4, ['Right Hand'] = 5, ['Left Upper Arm'] = 4, ['Left Lower Arm'] = 4, ['Right Upper Arm'] = 5, ['Right Lower Arm'] = 5 } ai_peek.hitboxes_names = { [0] = 'Head', 'Neck', 'Pelvis', 'Stomach', 'Lower Chest', 'Chest', 'Upper Chest', 'Left Upper Leg', 'Right Upper Leg', 'Left Lower Leg', 'Right Lower Leg', 'Left Foot', 'Right Foot', 'Left Hand', 'Right Hand', 'Left Upper Arm', 'Left Lower Arm', 'Right Upper Arm', 'Right Lower Arm', } ai_peek.active_hitboxes = { } ai_peek.returning = false ai_peek.targeting = false ai_peek.should_return = false ai_peek.dt_teleport = false ai_peek.disable_dt = false ai_peek.cache = { hotkeys = { autopeek = { enabled = nil, hotkey_mode = nil, mode = nil, distance = nil }, }, middle_pos = vector(), active_point_index = 0, positions = { }, vectors_to_target = { }, draw_data = { }, last_returning_time = 0, current_target = 0 } ai_peek.hotkeys = { main = false, force_baim = false } ai_peek.amount = 4 ai_peek.step_distance = 50 ai_peek.visual = { data = { }, active = false } ai_peek.skip_func = function (entindex, contents_mask) local ent_classname = entity.get_classname(entindex) if ent_classname == 'CCSPlayer' and entity.is_enemy(entindex) then return false end return true end ai_peek.create_values = function () for i = 0, ai_peek.amount do ai_peek.cache.vectors_to_target[i] = { } ai_peek.visual.data[i] = false end end ai_peek.update_hitboxes = function (ref, force_baim) local new_hitboxes = { } local target_hitboxes = ref:get() local force_baim_disabled_hitgroups = { 'Head', 'Arms', 'Legs', 'Feet' } for i = 1, #target_hitboxes do if force_baim and table_contains(force_baim_disabled_hitgroups, target_hitboxes[i]) then goto continue end local curr_hitgroup = ai_peek.hitgroups_to_hitboxes[target_hitboxes[i]] for j = 1, #curr_hitgroup do local hitbox = curr_hitgroup[j] if table_contains(ai_peek.allowed_hitboxes, hitbox) then table.insert(new_hitboxes, hitbox) end end ::continue:: end ai_peek.active_hitboxes = new_hitboxes end reference.rage.aimbot.target_hitbox:set_callback(function (ref) ai_peek.update_hitboxes(ref) end) ai_peek.handle_point = function (position, prev_position, angle, step_distance, index, view_offset, vec_mins, vec_maxs, max_step) local start_pos = prev_position and (prev_position - view_offset) or position local pos = ai_peek.extend_vector(start_pos, index == 0 and 0 or step_distance, angle) local trace_up = trace.hull( start_pos, start_pos + vector(0, 0, max_step), vec_mins, vec_maxs, {skip = skip_func, mask = 0x201400B} ).end_pos local trace_horizontal = trace.hull( vector(start_pos.x, start_pos.y, trace_up.z), vector(pos.x, pos.y, trace_up.z), vec_mins, vec_maxs, {skip = ai_peek.skip_func, mask = 0x201400B} ).end_pos if pos:dist2d(trace_horizontal) >= step_distance * .97 then return false end local trace_down = trace.hull( trace_horizontal, vector(trace_horizontal.x, trace_horizontal.y, position.z - 240), vec_mins, vec_maxs, {skip = ai_peek.skip_func, mask = 0x201400B} ).end_pos return trace_down + view_offset end local max_step = 18 ai_peek.setup_points = function (local_player, position, angle, amount, step_distance) local view_offset = vector(entity.get_prop(local_player, 'm_vecViewOffset')) local vec_mins = vector(entity.get_prop(local_player, 'm_vecMins')) local vec_maxs = vector(entity.get_prop(local_player, 'm_vecMaxs')) ai_peek.cache.positions[0] = ai_peek.handle_point( position, nil, 0, step_distance, 0, view_offset, vec_mins, vec_maxs, max_step ) for i = 1, amount do local angle = i % 2 == 0 and angle - 90 or angle + 90 local prev_point = ai_peek.cache.positions[i <= 2 and 0 or i - 2] if not prev_point then goto continue end local point = ai_peek.handle_point( position, prev_point, angle, step_distance, i, view_offset, vec_mins, vec_maxs, max_step ) if not point or (prev_point and math.abs(prev_point.z - point.z) > max_step) then for k = i, amount, 2 do ai_peek.cache.positions[k] = false end goto continue end ai_peek.cache.positions[i] = point ::continue:: end return ai_peek.cache.positions end ai_peek.trace_enemy = function (positions, local_player, target, hitboxes) local target_health = entity.get_prop(target, 'm_iHealth') local minimum_damage = (reference.rage.aimbot.minimum_damage_override[1].value and reference.rage.aimbot.minimum_damage_override[1].hotkey:get() and reference.rage.aimbot.minimum_damage_override[2].value) or reference.rage.aimbot.minimum_damage.value for i = 1, #positions do local pos = positions[i] if not pos then goto continue end for j = 1, #hitboxes do local hitbox = hitboxes[j] local hitbox_pos = vector(entity.hitbox_position(target, hitbox)) local entindex, damage = client.trace_bullet( local_player, pos.x, pos.y, pos.z, hitbox_pos.x, hitbox_pos.y, hitbox_pos.z, hitbox == 0 ) if hitbox == 0 then damage = damage * 4 end if damage >= math.min(minimum_damage, target_health) and damage > 0 then return pos, i end end ::continue:: end return nil, 0 end ai_peek.weapon_can_fire = function (player, weapon) local lp_NextAttack = entity.get_prop(player, 'm_flNextAttack') local wpn_NextPrimaryAttack = entity.get_prop(weapon, 'm_flNextPrimaryAttack') if math.max(0, lp_NextAttack or 0, wpn_NextPrimaryAttack or 0) > globals.curtime() or entity.get_prop(weapon, 'm_iClip1') <= 0 then return false end return true end ai_peek.can_target = function (local_player, target) if not target then return false end local lp_wpn = entity.get_player_weapon(local_player) if not ai_peek.weapon_can_fire(local_player, lp_wpn) then return false end local need_scope = false do local scope_weapons = { 'CWeaponSSG08', 'CWeaponAWP', 'CWeaponG3SG1', 'CWeaponSCAR20' } if not reference.rage.aimbot.auto_scope:get() and table_contains(scope_weapons, entity.get_classname(lp_wpn)) then need_scope = entity.get_prop(local_player, 'm_bIsScoped') ~= 1 end end if need_scope then return false end local need_charge = false do if reference.rage.aimbot.double_tap[1].hotkey:get() then need_charge = not exploits:can_recharge() end end if need_charge then return false end local velocity_modifier = entity.get_prop(local_player, 'm_flVelocityModifier') if velocity_modifier ~= 1 then return false end local esp_data = entity.get_esp_data(target) or {alpha = 0} if esp_data.alpha < .75 then return false end return true end ai_peek.handle = function (e) local local_player = entity.get_local_player() local weapon = entity.get_player_weapon(local_player) if not weapon then return end if csgo_weapons(weapon).is_revolver then return end local main_key = elements.aimbot.ai_peek.enable:get() and elements.aimbot.ai_peek.enable.hotkey:get() if main_key and not ai_peek.hotkeys.main then ai_peek.cache.hotkeys.autopeek.enabled = reference.rage.other.quickpeek[1]:get() ai_peek.cache.hotkeys.autopeek.hotkey_mode = { reference.rage.other.quickpeek[1]:get_hotkey() } ai_peek.cache.hotkeys.autopeek.mode = reference.rage.other.quickpeek_assist_mode[1]:get() ai_peek.cache.hotkeys.autopeek.distance = reference.rage.other.quickpeek_assist_distance:get() local lp_origin = vector(entity.get_origin(local_player)) local lp_pos = ai_peek.extrapolate_position(local_player, lp_origin, 13, true) ai_peek.cache.middle_pos = lp_pos ai_peek.hotkeys.main = true elseif not main_key and ai_peek.hotkeys.main then local mode_number = ai_peek.cache.hotkeys.autopeek.hotkey_mode[2] local mode_new = 'On hotkey' if mode_number == 0 then mode_new = 'Always on' elseif mode_number == 1 then mode_new = 'On hotkey' elseif mode_number == 2 then mode_new = 'Toggle' elseif mode_number == 3 then mode_new = 'Off hotkey' end reference.rage.other.quickpeek[1]:override() reference.rage.other.quickpeek[1]:set_hotkey(mode_new) reference.rage.other.quickpeek_assist_mode[1]:override() reference.rage.other.quickpeek_assist_distance:override() ai_peek.hotkeys.main = false end if reference.rage.aimbot.force_body:get() and not ai_peek.hotkeys.force_baim then ai_peek.update_hitboxes(reference.rage.aimbot.target_hitbox, true) ai_peek.hotkeys.force_baim = true elseif not reference.rage.aimbot.force_body:get() and ai_peek.hotkeys.force_baim then ai_peek.update_hitboxes(reference.rage.aimbot.target_hitbox) ai_peek.hotkeys.force_baim = false end if not main_key then ai_peek.returning = false ai_peek.targeting = false ai_peek.should_return = false ai_peek.dt_teleport = false ai_peek.disable_dt = false ai_peek.visual.active = false return end local move_mode = elements.aimbot.ai_peek.settings.peek_mode local distance_mode = elements.aimbot.ai_peek.settings.distance:get() if distance_mode == 'Long' then ai_peek.step_distance = 50 elseif distance_mode == 'Medium' then ai_peek.step_distance = 40 elseif distance_mode == 'Short' then ai_peek.step_distance = 30 end reference.rage.other.quickpeek[1]:override(true) reference.rage.other.quickpeek[1]:set_hotkey('Always On') reference.rage.other.quickpeek_assist_distance:override(math.floor((ai_peek.amount * ai_peek.step_distance) / 2) + 30) local m_vecVelocity = vector(entity.get_prop(local_player, 'm_vecVelocity')) local lp_velocity = m_vecVelocity:length2d() local local_override = bit.band(entity.get_prop(local_player, 'm_fFlags'), bit.lshift(1, 0)) ~= 1 or (e.in_forward == 1 or e.in_moveleft == 1 or e.in_moveright == 1 or e.in_back == 1 or e.in_jump == 1) local middle_pos = ai_peek.cache.middle_pos local lp_origin = vector(entity.get_origin(local_player)) local dist_to_middle = middle_pos:dist2d(lp_origin) if (not move_mode:get('Automatically Teleport')) and not ai_peek.targeting and not ai_peek.returning or (dist_to_middle > .15 and (lp_velocity > 1.011 and lp_velocity ~= 0)) then ai_peek.cache.middle_pos = lp_origin end local target = elements.aimbot.ai_peek.settings.mode:get() == 'Current threat' and client.current_threat() or ai_peek.get_nearest_player(ai_peek.get_players(true, false, false, true, false)) ai_peek.cache.current_target = target local angle = target and vector(middle_pos:to(vector(entity.get_origin(target))):angles()).y or vector(client.camera_angles()).y local positions = ai_peek.setup_points(local_player, middle_pos, angle, ai_peek.amount, ai_peek.step_distance) ai_peek.visual.active = true local active_point_pos, active_point_index = nil, 0 if target and not local_override and ai_peek.can_target(local_player, target) then active_point_pos, active_point_index = ai_peek.trace_enemy(positions, local_player, target, ai_peek.active_hitboxes) end ai_peek.cache.active_point_index = active_point_index ai_peek.targeting = active_point_pos ~= nil if move_mode:get('Automatically teleport') then ai_peek.should_return = true end if ai_peek.targeting then ai_peek.set_movement(e, active_point_pos, local_player) ai_peek.returning = false ai_peek.should_return = true ai_peek.disable_dt = false elseif local_override then ai_peek.returning = false ai_peek.should_return = false ai_peek.dt_teleport = false ai_peek.disable_dt = false elseif ai_peek.should_return then ai_peek.returning = true ai_peek.dt_teleport = true end if not ai_peek.returning then ai_peek.cache.last_returning_time = globals.tickcount() end if ai_peek.returning then if dist_to_middle < .15 then ai_peek.returning = false ai_peek.should_return = false ai_peek.dt_teleport = false ai_peek.disable_dt = false elseif ai_peek.dt_teleport then if not exploits:can_recharge() and ai_peek.weapon_can_fire(local_player, entity.get_player_weapon(local_player)) then if globals.tickcount() - ai_peek.cache.last_returning_time == 1 then if move_mode:get('Force defensive') then e.force_defensive = true else e.force_defensive = false end elseif ai_peek.cache.last_returning_time >= globals.tickcount() - 7 then e.discharge_pending = true control_exploits(false) ai_peek.dt_teleport = false ai_peek.disable_dt = true end end end end reference.rage.other.quickpeek_assist_mode[1]:override(ai_peek.returning and { 'Retreat on shot', 'Retreat on key release' } or ai_peek.cache.hotkeys.autopeek.mode) if ai_peek.disable_dt then control_exploits(false) end end ai_peek.render = function () local local_player = entity.get_local_player() if not entity.is_alive(local_player) then return end -- 只有在AI peek真正激活并且有有效目标时才显示 if not ai_peek.visual.active then return end local alpha = lerp('ai_peek_alpha', elements.aimbot.ai_peek.settings.peek_mode:get('Peek indicators') and 255 or 0, 12) if alpha <= 0 then return end -- 获取当前目标 local target = ai_peek.cache.current_target if not target or not entity.is_alive(target) then return end -- 检查目标是否在ESP中可见 local esp_data = entity.get_esp_data(target) if not esp_data or esp_data.alpha <= 0 then return end -- 检查是否真正找到了目标点(这是关键检查) if not ai_peek.targeting then return end -- 使用红色绘制框架 local r, g, b = 255, 0, 0 -- 获取目标的3D边界框坐标 local origin_x, origin_y, origin_z = entity.get_prop(target, "m_vecOrigin") if not origin_x then return end local vec_mins = vector(entity.get_prop(target, 'm_vecMins')) local vec_maxs = vector(entity.get_prop(target, 'm_vecMaxs')) if not vec_mins or not vec_maxs then return end -- 计算8个顶点的3D坐标 local vertices = { -- 底部四个顶点 {origin_x + vec_mins.x, origin_y + vec_mins.y, origin_z + vec_mins.z}, {origin_x + vec_maxs.x, origin_y + vec_mins.y, origin_z + vec_mins.z}, {origin_x + vec_maxs.x, origin_y + vec_maxs.y, origin_z + vec_mins.z}, {origin_x + vec_mins.x, origin_y + vec_maxs.y, origin_z + vec_mins.z}, -- 顶部四个顶点 {origin_x + vec_mins.x, origin_y + vec_mins.y, origin_z + vec_maxs.z}, {origin_x + vec_maxs.x, origin_y + vec_mins.y, origin_z + vec_maxs.z}, {origin_x + vec_maxs.x, origin_y + vec_maxs.y, origin_z + vec_maxs.z}, {origin_x + vec_mins.x, origin_y + vec_maxs.y, origin_z + vec_maxs.z} } -- 转换为屏幕坐标 local screen_coords = {} for i = 1, 8 do local x, y = renderer.world_to_screen(vertices[i][1], vertices[i][2], vertices[i][3]) if not x then return end -- 如果任何一个点无法转换则不绘制 screen_coords[i] = {x, y} end -- 绘制底部矩形 renderer.line(screen_coords[1][1], screen_coords[1][2], screen_coords[2][1], screen_coords[2][2], r, g, b, alpha) renderer.line(screen_coords[2][1], screen_coords[2][2], screen_coords[3][1], screen_coords[3][2], r, g, b, alpha) renderer.line(screen_coords[3][1], screen_coords[3][2], screen_coords[4][1], screen_coords[4][2], r, g, b, alpha) renderer.line(screen_coords[4][1], screen_coords[4][2], screen_coords[1][1], screen_coords[1][2], r, g, b, alpha) -- 绘制顶部矩形 renderer.line(screen_coords[5][1], screen_coords[5][2], screen_coords[6][1], screen_coords[6][2], r, g, b, alpha) renderer.line(screen_coords[6][1], screen_coords[6][2], screen_coords[7][1], screen_coords[7][2], r, g, b, alpha) renderer.line(screen_coords[7][1], screen_coords[7][2], screen_coords[8][1], screen_coords[8][2], r, g, b, alpha) renderer.line(screen_coords[8][1], screen_coords[8][2], screen_coords[5][1], screen_coords[5][2], r, g, b, alpha) -- 连接顶部和底部 renderer.line(screen_coords[1][1], screen_coords[1][2], screen_coords[5][1], screen_coords[5][2], r, g, b, alpha) renderer.line(screen_coords[2][1], screen_coords[2][2], screen_coords[6][1], screen_coords[6][2], r, g, b, alpha) renderer.line(screen_coords[3][1], screen_coords[3][2], screen_coords[7][1], screen_coords[7][2], r, g, b, alpha) renderer.line(screen_coords[4][1], screen_coords[4][2], screen_coords[8][1], screen_coords[8][2], r, g, b, alpha) -- 在框架上方显示"peek target"文本 -- 计算框架顶部中心点的屏幕坐标 local top_center_x = (screen_coords[5][1] + screen_coords[6][1] + screen_coords[7][1] + screen_coords[8][1]) / 4 local top_center_y = (screen_coords[5][2] + screen_coords[6][2] + screen_coords[7][2] + screen_coords[8][2]) / 4 -- 在框架顶部中心点上方显示文本 renderer.text(top_center_x, top_center_y - 20, r, g, b, alpha, "cb", 0, "Peek Target") end ai_peek.create_values() ai_peek.update_hitboxes(reference.rage.aimbot.target_hitbox) client.set_event_callback('setup_command', ai_peek.handle) client.set_event_callback('paint', ai_peek.render) elements.aimbot.ai_peek.enable:set_event('setup_command', ai_peek.handle) elements.aimbot.ai_peek.enable:set_event('paint', ai_peek.render) end -- Dormant aimbot功能实现开始 local dormant_aimbot do local ui_refs = { mindmg = ui.reference("RAGE", "Aimbot", "Minimum damage"), dormantEsp = ui.reference("VISUALS", "Player ESP", "Dormant") } local function calculate_angles(from, to, distance) local pitch, yaw = from:to(to):angles() local angle_rad = math.rad(yaw + 90) local offset_vector = vector(math.cos(angle_rad), math.sin(angle_rad), 0) * distance local height_vector = vector(0, 0, distance) return {{text = "Middle",vec = to},{text = "Left",vec = to + offset_vector},{text = "Right",vec = to - offset_vector}} end local function table_contains(table, value) for i = 1, #table do if table[i] == value then return true end end return false end local function normalize_movement(cmd, speed) local move_length = math.sqrt(cmd.forwardmove * cmd.forwardmove + cmd.sidemove * cmd.sidemove) if speed <= 0 or move_length <= 0 then return end if cmd.in_duck == 1 then speed = speed * 2.94117647 end if move_length <= speed then return end local factor = speed / move_length cmd.forwardmove = cmd.forwardmove * factor cmd.sidemove = cmd.sidemove * factor end local function get_active_players() local players = {} local player_resource = entity.get_player_resource() for i = 1, globals.maxplayers() do if entity.get_prop(player_resource, "m_bConnected", i) == 1 and i ~= entity.get_local_player() and entity.is_enemy(i) then players[#players + 1] = i end end return players end local function get_dormant_players() local players = {} local player_resource = entity.get_player_resource() for i = 1, globals.maxplayers() do if entity.get_prop(player_resource, "m_bConnected", i) ~= 1 or plist.get(i, "Add to whitelist") then elseif entity.is_dormant(i) and entity.is_enemy(i) then players[#players + 1] = i end end return players end local function table_contains_player(table, player) for i, v in ipairs(table) do if v[1] == player then return true end end return false end local delay_ticks = 0 local dormant_targets = {} local player_last_seen = {} local hitbox_offsets = {{scale = 5,hitbox = "Stomach",vec = vector(0, 0, 40)},{scale = 6,hitbox = "Chest",vec = vector(0, 0, 50)},{scale = 3,hitbox = "Head",vec = vector(0, 0, 58)},{scale = 4,hitbox = "Legs",vec = vector(0, 0, 20)}} local hitbox_mapping = {[0] = "Head",nil,"Stomach",nil,"Stomach","Chest","Chest","Legs","Legs"} local current_target_index = 1 local can_shoot = false local target_hitbox = nil local target_point = nil local target_player = nil local target_accuracy = nil local shot_fired = false local function dormant_aimbot_func(cmd) local possible_targets = {} for i, player in ipairs(get_active_players()) do local _, _, _, _, accuracy = entity.get_bounding_box(player) if accuracy < 1 then if not table_contains_player(player_last_seen, player) then table.insert(player_last_seen, { player, globals.tickcount() }) end elseif table_contains_player(player_last_seen, player) then for j, entry in ipairs(player_last_seen) do if entry[1] == player then table.remove(player_last_seen, j) end end end end if not elements.aimbot.dormant_aimbot.enable:get() then return end local local_player = entity.get_local_player() local player_weapon = entity.get_player_weapon(local_player) if not player_weapon then return end local weapon_entity = get_client_entity(player_weapon) if not weapon_entity or not is_weapon(weapon_entity) then return end local weapon_inaccuracy = get_inaccuracy(weapon_entity) if not weapon_inaccuracy then return end local eye_pos = vector(client.eye_position()) local simulation_time = entity.get_prop(local_player, "m_flSimulationTime") local current_tick = globals.tickcount() local weapon_data = csgo_weapons(player_weapon) local is_scoped = entity.get_prop(local_player, "m_bIsScoped") == 1 local flags = bit.band(entity.get_prop(local_player, "m_fFlags"), bit.lshift(1, 0)) local dormant_players = get_dormant_players() if current_tick % #dormant_players ~= 0 then current_target_index = current_target_index + 1 else current_target_index = 1 end local target_player_ent = dormant_players[current_target_index] if not target_player_ent then dormant_targets = {} return end if current_tick < delay_ticks then dormant_targets = {} return end if weapon_data.type == "grenade" or weapon_data.type == "knife" then dormant_targets = {} return end if cmd.in_jump == 1 and flags == 0 then dormant_targets = {} return end local possible_hitboxes = {} local selected_hitboxes = {"Head", "Chest", "Stomach"} local accuracy_setting = 90 local target_health = entity.get_esp_data(target_player_ent).health local mindmg_value = 15 local duck_amount = entity.get_prop(target_player_ent, "m_flDuckAmount") for i, hitbox_data in ipairs(hitbox_offsets) do if table_contains(selected_hitboxes, hitbox_data.hitbox) then if hitbox_data.hitbox == "Head" then table.insert(possible_hitboxes, { vec = hitbox_data.vec - vector(0, 0, duck_amount * 10), scale = hitbox_data.scale, hitbox = hitbox_data.hitbox }) elseif hitbox_data.hitbox == "Chest" then table.insert(possible_hitboxes, { vec = hitbox_data.vec - vector(0, 0, duck_amount * 4), scale = hitbox_data.scale, hitbox = hitbox_data.hitbox }) else table.insert(possible_hitboxes, { vec = hitbox_data.vec, scale = hitbox_data.scale, hitbox = hitbox_data.hitbox }) end end end local next_primary_attack if weapon_data.is_revolver then next_primary_attack = simulation_time > entity.get_prop(player_weapon, "m_flNextPrimaryAttack") else next_primary_attack = simulation_time > math.max( entity.get_prop(local_player, "m_flNextAttack"), entity.get_prop(player_weapon, "m_flNextPrimaryAttack"), entity.get_prop(player_weapon, "m_flNextSecondaryAttack") ) end if not next_primary_attack then return end local target_origin = vector(entity.get_origin(target_player_ent)) local target_head_pos = vector(entity.hitbox_position(target_player_ent, 4)) local _, _, _, _, target_accuracy_val = entity.get_bounding_box(target_player_ent) dormant_targets[target_player_ent] = nil for i = 1, 7 do if #selected_hitboxes ~= 0 and table_contains(selected_hitboxes, hitbox_mapping[i - 1]) and entity.is_alive(target_player_ent) and target_accuracy_val > 0 and math.abs(target_origin.x - target_head_pos.x) < 7 then table.insert(possible_targets, { scale = 3, hitbox = hitbox_mapping[i - 1], vec = vector(entity.hitbox_position(target_player_ent, i - 1)) }) end end if target_origin.x and target_accuracy_val > 0 then local target_pos local damage local hitbox_name if elements.aimbot.dormant_aimbot.enable:get() then for i, hitbox_info in ipairs(possible_targets) do local angle_positions = calculate_angles(eye_pos, hitbox_info.vec, 3) local hit_pos local hit_damage local hit_hitbox local hit_point for j, angle_pos in ipairs(angle_positions) do local end_pos = angle_pos.vec local _, traced_damage = client.trace_bullet(local_player, eye_pos.x, eye_pos.y, eye_pos.z, end_pos.x, end_pos.y, end_pos.z, true) if hitbox_info.hitbox == "Head" then traced_damage = traced_damage * 4 end if traced_damage ~= 0 and mindmg_value < traced_damage then target_pos = end_pos damage = traced_damage hitbox_name = hitbox_info.hitbox break end end end end if not (accuracy_setting < math.floor(target_accuracy_val * 100) + 5) then return end local final_target_pos local final_damage local final_hitbox local final_point if damage ~= nil then final_target_pos = target_pos final_damage = damage target_hitbox = hitbox_name target_point = nil target_player = target_player_ent target_accuracy = target_accuracy_val else for i, hitbox_info in ipairs(possible_hitboxes) do local hitbox_pos = target_origin + hitbox_info.vec local angle_positions = calculate_angles(eye_pos, hitbox_pos, hitbox_info.scale) for j, angle_pos in ipairs(angle_positions) do local end_pos = angle_pos.vec local _, traced_damage = client.trace_bullet(local_player, eye_pos.x, eye_pos.y, eye_pos.z, end_pos.x, end_pos.y, end_pos.z, true) if traced_damage ~= 0 and mindmg_value < traced_damage then final_target_pos = end_pos final_damage = traced_damage target_hitbox = hitbox_info.hitbox target_point = angle_pos.text target_player = target_player_ent target_accuracy = target_accuracy_val break end end if final_target_pos and final_damage then break end end end if not final_damage then return end if not final_target_pos then return end if client.visible(final_target_pos.x, final_target_pos.y, final_target_pos.z) then return end normalize_movement(cmd, (is_scoped and weapon_data.max_player_speed_alt or weapon_data.max_player_speed) * 0.33) local pitch, yaw = eye_pos:to(final_target_pos):angles() if not is_scoped and weapon_data.type == "sniperrifle" and cmd.in_jump == 0 and flags == 1 then cmd.in_attack2 = 1 end dormant_targets[target_player_ent] = true if weapon_inaccuracy < 0.01 then cmd.pitch = pitch cmd.yaw = yaw cmd.in_attack = 1 can_shoot = true end end end client.register_esp_flag("DA", 255, 255, 255, function(player) if elements.aimbot.dormant_aimbot.enable:get() and entity.is_alive(entity.get_local_player()) then return dormant_targets[player] end end) client.set_event_callback("weapon_fire", function(event) client.delay_call(0.03, function() local local_player = entity.get_local_player() if client.userid_to_entindex(event.userid) == local_player then shot_fired = false can_shoot = false target_hitbox = nil target_point = nil target_player = nil target_accuracy = nil end end) end) local function on_player_hurt(event) local victim = client.userid_to_entindex(event.userid) local attacker = client.userid_to_entindex(event.attacker) local _, _, _, _, accuracy = entity.get_bounding_box(client.userid_to_entindex(event.userid)) if attacker == entity.get_local_player() and victim ~= nil and can_shoot == true then shot_fired = true end end local function on_round_prestart() local freeze_time = (cvar.mp_freezetime:get_float() + 1) / globals.tickinterval() delay_ticks = globals.tickcount() + freeze_time end local function dormant_aimbot_callback(state) local callback_func = state and client.set_event_callback or client.unset_event_callback if state then ui.set(ui_refs.dormantEsp, true) else ui.set(ui_refs.dormantEsp, false) end callback_func("setup_command", dormant_aimbot_func) callback_func("round_prestart", on_round_prestart) callback_func("player_hurt", on_player_hurt) end elements.aimbot.dormant_aimbot.enable:set_callback(dormant_aimbot_callback) client.set_event_callback("paint", function() if not entity.is_alive(entity.get_local_player()) then return end if elements.aimbot.dormant_aimbot.enable:get() then local indicator_color = {255,255,255,200} for target, is_valid in pairs(dormant_targets) do if is_valid then indicator_color = {143,194,21,255} break end end if #get_dormant_players() == 0 then indicator_color = {255,0,50,255} end renderer.indicator(indicator_color[1], indicator_color[2], indicator_color[3], indicator_color[4], "DA") end end) end local predict do local function on_paint_ui () -- 添加游戏状态检查 if not entity.get_local_player() or not entity.is_alive(entity.get_local_player()) then return end if not is_in_game() then return end if not elements.aimbot.predict_enemies.enable:get() then return end cvar.cl_interp_ratio:set_int(2) cvar.cl_interpolate:set_int(1) end local function on_pre_render () if not is_in_game() then cvar.cl_extrapolate_amount:set_raw_float(0.25) cvar.cl_interpolate:set_int(1) cvar.cl_interp_ratio:set_int(2) return end if not elements.aimbot.predict_enemies.enable:get() then cvar.cl_extrapolate_amount:set_raw_float(0.25) cvar.cl_interpolate:set_int(1) cvar.cl_interp_ratio:set_int(2) return end cvar.cl_extrapolate_amount:set_raw_float(0.7) cvar.cl_interpolate:set_int(0) cvar.cl_interp_ratio:set_int(1) end client.set_event_callback('paint_ui', on_paint_ui) client.set_event_callback('pre_render', on_pre_render) end local game_enhancer do local fps_cvars = { ['Fix chams color'] = {'mat_autoexposure_max_multiplier', 0.2, 1}, ['Disable dynamic Lighting'] = {'r_dynamiclighting', 0, 1}, ['Disable dynamic Shadows'] = {'r_dynamic', 0, 1}, ['Disable first-person tracers'] = {'r_drawtracers_firstperson', 0, 1}, ['Disable ragdolls'] = {'cl_disable_ragdolls', 1, 0}, ['Disable eye gloss'] = {'r_eyegloss', 0, 1}, ['Disable eye movement'] = {'r_eyemove', 0, 1}, ['Disable muzzle flash light'] = {'muzzleflash_light', 0, 1}, ['Enable low CPU audio'] = {'dsp_slow_cpu', 1, 0}, ['Disable bloom'] = {'mat_disable_bloom', 1, 0}, ['Disable particles'] = {'r_drawparticles', 0, 1}, ['Reduce breakable objects'] = {'func_break_max_pieces', 0, 15} } local function on_setup_command () if not elements.aimbot.game_enhancer.enable:get() then for name, data in pairs(fps_cvars) do local cvar_name, boost_value, default_value = unpack(data) cvar[cvar_name]:set_int(default_value) end return end local selected_boosts = elements.aimbot.game_enhancer.settings.list:get() for name, data in pairs(fps_cvars) do local cvar_name, boost_value, default_value = unpack(data) cvar[cvar_name]:set_int(table_contains(selected_boosts, name) and boost_value or default_value) end end client.set_event_callback('setup_command', on_setup_command) end --- coloring.parse = function () if colors.combobox:get() == 'Custom' then local r, g, b = colors.custom.color_1:get() if colors.custom.type:get() == 'Gradient' then local r2, g2, b2 = colors.custom.color_2:get() local r3, g3, b3 = colors.custom.color_3:get() local r4, g4, b4 = colors.custom.color_4:get() return {r = r, g = g, b = b, r2 = r2, g2 = g2, b2 = b2, r3 = r3, g3 = g3, b3 = b3, r4 = r4, g4 = g4, b4 = b4} else return {r = r, g = g, b = b} end return {r = r, g = g, b = b} else local r, g, b = reference.misc.settings.menu_color:get() return {r = r, g = g, b = b} end end local function create_interface (x, y, w, h, r, g, b, a, options) options = options or { } local side = options.side or 'down' local item = options.item or '' local outline_y = side == 'up' and y + 8 or y + 2 local custom = coloring.parse() renderer.blur(x, y, w, h, 4, 25, 25, 25, 255 * (a / 255)) if side == 'up' or side == 'down' then local reverse = side == 'up' local gradient_colors = { use_gradient = colors.combobox:get() == 'Custom' and colors.custom.type:get() == 'Gradient' and colors.custom.select:get(item), col1_start = {r = custom.r, g = custom.g, b = custom.b, a = a}, col1_end = {r = custom.r3, g = custom.g3, b = custom.b3, a = a}, col2_start = {r = custom.r4, g = custom.g4, b = custom.b4, a = a}, col2_end = {r = custom.r2, g = custom.g2, b = custom.b2, a = a} } helpers.semi_outlined_rectangle(x + 1, outline_y, w - 1, 14, 4, 2, gradient_colors, reverse) elseif side == 'left' then if colors.combobox:get() == 'Custom' and colors.custom.type:get() == 'Gradient' and colors.custom.select:get(item) then draw_animated_gradient(x + 5, y + 4, 3, h - 8, 25, {r = custom.r, g = custom.g, b = custom.b, a = a}, {r = custom.r3, g = custom.g3, b = custom.b3, a = a}, {r = custom.r4, g = custom.g4, b = custom.b4, a = a}, {r = custom.r2, g = custom.g2, b = custom.b2, a = a}, true ) else renderer.gradient(x + 5, y + 4, 3, h - 8, r, g, b, a, r, g, b, 0, false) end elseif side == 'right' then if colors.combobox:get() == 'Custom' and colors.custom.type:get() == 'Gradient' and colors.custom.select:get(item) then draw_animated_gradient(x + w - 8, y + 4, 3, h - 8, 25, {r = custom.r, g = custom.g, b = custom.b, a = a}, {r = custom.r3, g = custom.g3, b = custom.b3, a = a}, {r = custom.r4, g = custom.g4, b = custom.b4, a = a}, {r = custom.r2, g = custom.g2, b = custom.b2, a = a}, true ) else renderer.gradient(x + w - 8, y + 4, 3, h - 8, r, g, b, 0, r, g, b, a, false) end elseif side == 'left + right' then if colors.combobox:get() == 'Custom' and colors.custom.type:get() == 'Gradient' and colors.custom.select:get(item) then draw_animated_gradient(x + 5, y + 4, 3, h - 8, 25, {r = custom.r, g = custom.g, b = custom.b, a = a}, {r = custom.r3, g = custom.g3, b = custom.b3, a = a}, {r = custom.r4, g = custom.g4, b = custom.b4, a = a}, {r = custom.r2, g = custom.g2, b = custom.b2, a = a}, true, true ) draw_animated_gradient(x + w - 8, y + 4, 3, h - 8, 25, {r = custom.r, g = custom.g, b = custom.b, a = a}, {r = custom.r3, g = custom.g3, b = custom.b3, a = a}, {r = custom.r4, g = custom.g4, b = custom.b4, a = a}, {r = custom.r2, g = custom.g2, b = custom.b2, a = a}, true, false ) else renderer.gradient(x + 5, y + 4, 3, h - 8, r, g, b, a, r, g, b, 0, false) renderer.gradient(x + w - 8, y + 4, 3, h - 8, r, g, b, 0, r, g, b, a, false) end end helpers.rounded_outlined_rectangle(x, y, w, h, 4, 1, 12, 12, 12, a) end local watermark = { width = 220, height = 32 }; do local fps_cache = { value = 0, last_update = 0 } local icons = { Nickname = { icon = '', height = 17 }, ['Frames Per Second'] = { icon = '', height = 18 }, Ping = { icon = '', height = 18 }, Tickrate = { icon = '', height = 17 }, Time = { icon = '', height = 17 } } local function get_watermark_elements () local t, settings = { }, elements.visuals.watermark.settings if settings.elements:get('Nickname') then local nick_type = settings.nickname:get() local nick = '' if nick_type == 'Loader' then nick = lua.username elseif nick_type == 'Steam' then nick = panorama.open().MyPersonaAPI.GetName() or lua.username elseif nick_type == 'Custom' then nick = settings.custom:get() local trimmed_nick = (nick or ''):gsub('^%s*(.-)%s*$', '%1'):lower() if trimmed_nick == '' then nick = lua.username else local special_names = { admin = '3a6bIJl_kAk_CpaTb', developer = 'uc/7oBegb_/7ugopaca', dev = 'uc/7oBegb_/7ugopaca' } nick = special_names[trimmed_nick] or nick end end t[#t+1] = {icon = icons.Nickname.icon, height = icons.Nickname.height, text = nick} end if settings.elements:get('Frames Per Second') then local now = globals.realtime() if now - fps_cache.last_update > 1.5 then fps_cache.value = math.floor(1 / globals.frametime() + 0.5) fps_cache.last_update = now end t[#t+1] = {icon = icons['Frames Per Second'].icon, height = icons['Frames Per Second'].height, text = string.format('%d fps', fps_cache.value)} end if settings.elements:get('Ping') then local ping = math.floor(client.latency() * 1000) if ping >= 150 then icons.Ping.icon = '' elseif ping >= 100 then icons.Ping.icon = '' elseif ping >= 50 then icons.Ping.icon = '' else icons.Ping.icon = '' end t[#t+1] = {icon = icons.Ping.icon, height = icons.Ping.height, text = string.format('%d ms', ping)} end if settings.elements:get('Tickrate') then t[#t+1] = {icon = icons.Tickrate.icon, height = icons.Tickrate.height, text = string.format('%d tick', math.floor(1 / globals.tickinterval() + 0.5))} end if settings.elements:get('Time') then local h, m, s = client.system_time() t[#t+1] = {icon = icons.Time.icon, height = icons.Time.height, text = string.format('%02d:%02d', h, m)} end return t end local drag = drag_system.new( 'windows_watermark', drag_slider.windows.watermark.x, drag_slider.windows.watermark.y, screen_size_x() - 5, 24, 'xy', { w = function () return watermark.width end, h = function () return watermark.height end, align_x = 'right', expand_dir = 'left', snap_distance = 10, show_guides = true, show_default_dot = true, show_highlight = true, align_center = true, show_center_dot = true } ) local alpha, anim_width = 0, 0 local windows_gap = -10 -- 从16减小到8,使间距更紧凑 local anim_elements_show, anim_elements_width, anim_elements_alpha = 0, 0, 0 local element_alphas = { } local function on_paint_ui () -- 添加游戏状态检查,确保只在游戏内显示 if not entity.get_local_player() or not entity.is_alive(entity.get_local_player()) then return end -- 修复问题1: 只有在明确启用Watermark时才显示watermark local wm_enabled = elements.visuals.windows:get('Watermark') local target_alpha = wm_enabled and 255 or 0 alpha = lerp('windows_watermark', target_alpha, 10, 0.001, 'ease_out') if alpha < 1 then return end local screen_w = screen_size_x() local max_allowed_width = math.min(screen_w * 0.3, 400) local elements_list = get_watermark_elements() local show_elements = #elements_list > 0 local info_text = string.format('%s ', lua.name) local build_text = tostring(lua.build) local info_icon = '' local info_measure = renderer.measure_text('b', info_text) local icon_measure = renderer.measure_text('b', info_icon) local build_measure = renderer.measure_text('b', build_text) -- 计算整个左侧部分的宽度(包括图标、图标与文本间的空隙、文本、版本号) local left_part_width = icon_measure + 2 + info_measure + 2 + build_measure local custom = coloring.parse() local icon_color = {custom.r, custom.g, custom.b} local element_parts = { } local element_widths = { } local total_elements_width = 0 for i, v in ipairs(elements_list) do local icon = v.icon or '' local text = v.text or '' local icon_height = v.height or 16 local key = tostring(i) .. '_' .. text -- 修复问题1: 使用wm_enabled而不是force text watermark的状态 local target_elem_alpha = wm_enabled and 255 or 0 element_alphas[key] = element_alphas[key] or 0 element_alphas[key] = lerp('wm_elem_alpha_' .. key, target_elem_alpha, 10, 0.001, 'ease_out') local icon_hex = coloring.rgba_to_hex(icon_color[1], icon_color[2], icon_color[3], math.floor(element_alphas[key])) local icon_w = icon ~= '' and renderer.measure_text('b', icon) or 0 local text_w = renderer.measure_text('b', text) local padding = (icon ~= '' and text ~= '') and 2 or 0 element_widths[i] = icon_w + text_w + padding element_parts[i] = { icon = icon, icon_hex = icon_hex, icon_height = icon_height, text = text, key = key, icon_w = icon_w, text_w = text_w, padding = padding } total_elements_width = total_elements_width + element_widths[i] + (i > 1 and 8 or 0) end if #element_parts > 0 then total_elements_width = total_elements_width + 16 end local left_w = left_part_width + 16 -- 左侧部分宽度加上一些内边距 local right_w = total_elements_width local total_width = left_w + (right_w > 0 and (windows_gap + right_w) + 2 or 0) anim_width = math.floor(lerp('wm_anim_width', total_width, 60, 0.1, 'ease_in_out')) watermark.width = anim_width local drag_x, drag_y = drag:get_pos() local x, y = drag_x, drag_y drag:update(alpha) drag:draw_guides(alpha) local h = 28 -- 合并两个框为一个整体框 create_interface( x + 2, y + 2, anim_width, h, custom.r, custom.g, custom.b, alpha, { side = 'up', item = 'Watermark' } ) renderer.text(x + 10 + icon_measure + 2, y + 10, 255, 255, 255, alpha, 'b', nil, info_text) if colors.combobox:get() == 'Custom' and colors.custom.type:get() == 'Gradient' and colors.custom.select:get('Watermark') then -- 绘制带颜色的符号 local color = prepare_gradient_cache(25, {r = custom.r, g = custom.g, b = custom.b, a = alpha}, {r = custom.r3, g = custom.g3, b = custom.b3, a = alpha}, {r = custom.r4, g = custom.g4, b = custom.b4, a = alpha}, {r = custom.r2, g = custom.g2, b = custom.b2, a = alpha}, false ) renderer.text(x + 10, y + 10, color.r, color.g, color.b, alpha, 'b', nil, info_icon) draw_gradient_text( x + 10 + icon_measure + 2 + info_measure, y + 10, 'b', nil, build_text, 25, {r = custom.r, g = custom.g, b = custom.b, a = alpha}, {r = custom.r3, g = custom.g3, b = custom.b3, a = alpha}, {r = custom.r4, g = custom.g4, b = custom.b4, a = alpha}, {r = custom.r2, g = custom.g2, b = custom.b2, a = alpha} ) else -- 绘制带颜色的符号 renderer.text(x + 10, y + 10, custom.r, custom.g, custom.b, alpha, 'b', nil, info_icon) renderer.text(x + 10 + icon_measure + 2 + info_measure, y + 10, custom.r, custom.g, custom.b, alpha, 'b', nil, build_text ) end if #element_parts > 0 and right_w > 0 then local right_x = x + left_w + windows_gap -- 移除单独的元素框,因为现在已经合并到主框中了 -- create_interface( -- right_x, y + 2, right_w, h, -- custom.r, custom.g, custom.b, alpha, -- { side = 'up', item = 'Watermark' } -- ) local draw_x = right_x + 8 local base_y = y + 11 for i, part in ipairs(element_parts) do local elem_alpha = math.floor(element_alphas[part.key]) if elem_alpha > 0 then local icon_y = base_y + (16 - part.icon_height) / 2 if part.icon ~= '' then if colors.combobox:get() == 'Custom' and colors.custom.type:get() == 'Gradient' and colors.custom.select:get('Watermark') then local color = prepare_gradient_cache(25, {r = custom.r, g = custom.g, b = custom.b, a = alpha}, {r = custom.r3, g = custom.g3, b = custom.b3, a = alpha}, {r = custom.r4, g = custom.g4, b = custom.b4, a = alpha}, {r = custom.r2, g = custom.g2, b = custom.b2, a = alpha}, false ) renderer.text(draw_x, icon_y, color.r, color.g, color.b, elem_alpha, 'b', nil, part.icon) else renderer.text(draw_x, icon_y, custom.r, custom.g, custom.b, elem_alpha, 'b', nil, part.icon) end draw_x = draw_x + part.icon_w + part.padding end if part.text ~= '' then renderer.text(draw_x, base_y, 255, 255, 255, elem_alpha, 'b', nil, part.text) draw_x = draw_x + part.text_w + 8 end end end end end -- client.set_event_callback('paint_ui', on_paint_ui) elements.visuals.windows:set_event('paint_ui', on_paint_ui, function (ref) return ref:get('Watermark') or ref:get('Text brand') or elements.visuals.crosshair.enable:get() end) end local keybinds = { width = 160, height = 22 }; do local drag = drag_system.new( 'windows_keybinds', drag_slider.windows.keybinds.x, drag_slider.windows.keybinds.y, screen_size_x() * 0.7, screen_size_y() / 2 - 60, 'xy', { w = function () return keybinds.width end, h = function () return keybinds.height end, snap_distance = 0, show_guides = true, show_default_dot = false, show_highlight = true, align_center = false, show_center_dot = false } ) local alpha = 0 local anim_show = 0 local anim_height = 0 local anim_width = 0 local bind_anim = { } local bind_order = { } local function get_mode_name (hotkey) if not hotkey then return 'holding' end local mode_number = hotkey[2] if mode_number == 0 then return 'always on' elseif mode_number == 1 then return 'holding' elseif mode_number == 2 then return 'toggled' elseif mode_number == 3 then return 'off hotkey' end return 'holding' end local all_binds = { { name = 'Double tap', ref = reference.rage.aimbot.double_tap[1], variant = '1', key = 'Double tap' }, { name = 'Hide shots', ref = reference.antiaim.other.on_shot_anti_aim[1], variant = '1', key = 'Hide shots' }, { name = 'Ping spike', ref = reference.rage.ps[1], variant = '1', key = 'Ping spike' }, { name = 'Fake duck', ref = reference.rage.other.fake_duck, variant = '2', key = 'Fake duck' }, { name = 'Slow walk', ref = reference.antiaim.other.slow_motion[1], variant = '1', key = 'Slow walk' }, { name = 'Force body aim', ref = reference.rage.aimbot.force_body, variant = '2', key = 'Force body aim' }, { name = 'Force safe point', ref = reference.rage.aimbot.force_safe, variant = '2', key = 'Force safe point' }, { name = 'Min. damage', ref = reference.rage.aimbot.minimum_damage_override[1], variant = '1', key = 'Min. damage' }, { name = 'Freestanding', ref = elements.anti_aim.hotkeys.freestanding, variant = '1', key = 'Freestanding' }, { name = 'Edge yaw', ref = elements.anti_aim.hotkeys.edge_yaw, variant = '1', key = 'Edge yaw' } } for i, v in ipairs(all_binds) do bind_order[v.key] = i end local function any_bind_active() for _, b in ipairs(all_binds) do local ref = b.ref local variant = b.variant if variant == '1' and (ref and ref.hotkey and ref.hotkey:get()) then if get_mode_name({ref:get_hotkey()}) ~= 'always on' then return true end elseif variant == '2' and (ref and ref:get()) then if get_mode_name({ref:get()}) ~= 'always on' then return true end end end -- 检查auto_hide_shots是否激活了OSAA if elements.aimbot.auto_hs.enable:get() then local _, osaa_mode = reference.antiaim.other.on_shot_anti_aim[1]:get_hotkey() if osaa_mode == 0 then -- Always on return true end end return false end local function on_paint_ui() -- 添加游戏状态检查,确保只在游戏内显示 if not entity.get_local_player() or not entity.is_alive(entity.get_local_player()) then return end local wm_enabled = elements.visuals.windows:get('Watermark') local target_alpha = wm_enabled and 255 or 0 alpha = lerp('windows_watermark', target_alpha, 10, 0.001, 'ease_out') -- 移除这一行,因为它错误地导致了keybinds的隐藏 -- if alpha < 1 then return end local should_show = elements.visuals.windows:get('Keybinds') and (ui.is_menu_open() or any_bind_active()) local target_alpha = should_show and 255 or 0 alpha = lerp('windows_keybinds', target_alpha, 10, 0.001, 'ease_out') anim_show = lerp('kb_anim_show', target_alpha > 0 and 1 or 0, 10, 0.001, 'ease_out') if alpha < 1 then return end drag:update(alpha) drag:draw_guides(alpha) local x, y = drag:get_pos() local custom = coloring.parse() for _, b in ipairs(all_binds) do local ref = b.ref local variant = b.variant local active = false local mode = 'holding' if variant == '1' then if ref and ref.hotkey then mode = get_mode_name({ref:get_hotkey()}) active = ref.hotkey:get() and mode ~= 'always on' end elseif variant == '2' then if ref then mode = get_mode_name({ref:get()}) active = ref:get() and mode ~= 'always on' end end -- 特殊处理OSAA,检查auto_hide_shots是否激活了它 if b.key == 'Hide shots' and elements.aimbot.auto_hs.enable:get() then local _, osaa_mode = reference.antiaim.other.on_shot_anti_aim[1]:get_hotkey() if osaa_mode == 0 then -- Always on (由auto_hide_shots激活) active = true mode = 'always on' end end bind_anim[b.key] = bind_anim[b.key] or { alpha = 0, y = 0, target_row = 0, cur_row = 0 } local target = active and 1 or 0 bind_anim[b.key].alpha = lerp('kb_bind_alpha_' .. b.key, target, 10, 0.001, 'ease_out') bind_anim[b.key].mode = mode bind_anim[b.key].active = active bind_anim[b.key].name = b.name bind_anim[b.key].key = b.key end local visible_binds = { } local row = 0 for _, b in ipairs(all_binds) do local anim = bind_anim[b.key] if anim.alpha > 0.01 then row = row + 1 anim.target_row = row table.insert(visible_binds, anim) else anim.target_row = 0 end end for _, b in ipairs(all_binds) do local anim = bind_anim[b.key] local target_y = anim.target_row > 0 and anim.target_row or (#visible_binds - 1) anim.cur_row = lerp('kb_bind_row_' .. b.key, target_y, 7, 0.01, 'ease_out') end keybinds.height = 32 + (#visible_binds) * 16 keybinds.width = 140 for _, anim in ipairs(visible_binds) do local w = renderer.measure_text('b', anim.name .. ' [' .. anim.mode .. ']') if w + 24 > keybinds.width then keybinds.width = w + 24 end end anim_height = math.floor(lerp('kb_anim_height', keybinds.height - 4, 10, 0.1, 'ease_out')) anim_width = math.floor(lerp('kb_anim_width', keybinds.width - 4, 10, 0.1, 'ease_out')) create_interface( x + 2, y + 2, anim_width, anim_height, custom.r, custom.g, custom.b, alpha * anim_show, { side = 'up', item = 'Keybinds' } ) renderer.text(x + keybinds.width / 2, y + 16, 255, 255, 255, alpha * anim_show, 'cb', nil, 'Keybinds') for _, b in ipairs(all_binds) do local anim = bind_anim[b.key] if anim.alpha > 0.01 then local row_y = y + 10 + math.floor(anim.cur_row * 16) local a = math.floor(alpha * anim_show * anim.alpha) renderer.text(x + 10, row_y, 200, 200, 200, a, '', nil, anim.name) renderer.text(x + keybinds.width - 10, row_y, 200, 200, 200, a, 'r', nil, '[' .. anim.mode .. ']') end end end elements.visuals.windows:set_event('paint_ui', on_paint_ui, function (ref) return ref:get('Keybinds') end) end local debug_panel = { width = 100, height = 20 }; do local drag = drag_system.new( 'debug_panel', drag_slider.windows.debug_panel.x, drag_slider.windows.debug_panel.y, 20, screen_size_y() / 2 - 390, 'xy', { w = function () return debug_panel.width end, h = function () return debug_panel.height end, align_x = 'left', snap_distance = 10, show_guides = true, show_default_dot = true, show_highlight = true, align_center = true, show_center_dot = true } ) local function debug_text (x, y, alpha, label, value, show_percent) show_percent = show_percent or false local flag = 'b' local tooltip = type(value) == 'number' and (show_percent and '%' or '°') or '' local custom = coloring.parse() local color = nil if colors.combobox:get() == 'Custom' and colors.custom.type:get() == 'Gradient' and colors.custom.select:get('Debug panel') then color = prepare_gradient_cache(25, {r = custom.r, g = custom.g, b = custom.b, a = alpha}, {r = custom.r3, g = custom.g3, b = custom.b3, a = alpha}, {r = custom.r4, g = custom.g4, b = custom.b4, a = alpha}, {r = custom.r2, g = custom.g2, b = custom.b2, a = alpha}, false ) end local measure = renderer.measure_text(flag, label) local measure_arrow = renderer.measure_text(flag, '⬥') + 4 local r, g, b = custom.r, custom.g, custom.b if color then r, g, b = color.r, color.g, color.b end renderer.text(x, y, r, g, b, alpha, flag, nil, '⬥') renderer.text(x + measure_arrow, y, 255, 255, 255, alpha, flag, nil, label) renderer.text(x + measure_arrow + measure, y, 255, 255, 255, alpha, '', nil, tostring(value) .. tooltip) end local function make_debug_drawer (y_start, alpha, line_height) line_height = line_height or 15 local y_offset = 0 return function (x, label, value, show_percent) debug_text(x, y_start + y_offset, alpha, label, value, show_percent) y_offset = y_offset + line_height end end local pitch, pitch_offset, yaw, offset, yaw_base, yaw_jitter, jitter_offset, body_yaw, body_side, fs_body_yaw = '', 0, '', 0, '', '', 0, '', 0, false local function on_setup_command (e) local angles = builder.angles(e) pitch = angles.pitch pitch_offset = angles.pitch_offset yaw = angles.yaw offset = angles.offset yaw_base = angles.yaw_base yaw_jitter = angles.yaw_jitter jitter_offset = angles.jitter_offset body_yaw = angles.body_yaw body_side = angles.body_side fs_body_yaw = angles.fs_body_yaw end -- Debug indicator功能实现开始 stats = {total_shots = 0,hits = 0} best_enemy = nil function get_best_enemy() local enemies = entity.get_players(true) local best_distance = math.huge local lp = entity.get_local_player() if not lp then return end for _, enemy in ipairs(enemies) do local ex, ey, ez = entity.get_prop(enemy, "m_vecOrigin") local lx, ly, lz = entity.get_prop(lp, "m_vecOrigin") if ex and lx then local dist = (lx - ex)^2 + (ly - ey)^2 + (lz - ez)^2 if dist < best_distance then best_distance = dist best_enemy = enemy end end end end function table_contains(tbl, val) for i = 1, #tbl do if tbl[i] == val then return true end end return false end client.set_event_callback("paint", function() if not elements.visuals.hitrate.enable:get() then return end local selected_options = elements.visuals.hitrate.settings.type:get() local lp = entity.get_local_player() if type(selected_options) ~= "table" then selected_options = {selected_options} end if not lp or entity.get_prop(lp, "m_lifeState") ~= 0 then return end if table_contains(selected_options, "Accuracy Rate") then renderer.indicator(255, 255, 255, 255, string.format("%s/%s (%s%%)", stats.hits, stats.total_shots, string.format("%.1f", stats.total_shots ~= 0 and (stats.hits / stats.total_shots * 100) or 0))) end if table_contains(selected_options, "Detection Focus") then get_best_enemy() local target = best_enemy and entity.get_player_name(best_enemy) or "wait" renderer.indicator(255, 255, 255, 255, "Target: " .. target) end end) client.set_event_callback("aim_hit", function() stats.total_shots = stats.total_shots + 1 stats.hits = stats.hits + 1 end) client.set_event_callback("aim_miss", function(e) if e.reason ~= "death" and e.reason ~= "unregistered shot" then stats.total_shots = stats.total_shots + 1 end end) client.set_event_callback("player_connect_full", function(e) if client.userid_to_entindex(e.userid) == entity.get_local_player() then stats = { total_shots = 0, hits = 0 } end end) client.set_event_callback("player_death", function(e) local dead_player = client.userid_to_entindex(e.userid) if dead_player == best_enemy then best_enemy = nil end end) -- Debug indicator功能实现结束 local function on_paint_ui () -- 添加游戏状态检查,确保只在游戏内显示 if not entity.get_local_player() or not entity.is_alive(entity.get_local_player()) then return end local enabled = elements.visuals.windows:get('Debug panel') local alpha = lerp('debug_panel_alpha', enabled and 255 or 0, 10, 0.001, 'ease_out') if alpha < 1 then return end local condition = builder.get_state() local custom = coloring.parse() local width = renderer.measure_text('b', string.format('%s / Debug panel', lua.name)) + 8 debug_panel.width = width drag:update(alpha) drag:draw_guides(alpha) local x, y = drag:get_pos() if colors.combobox:get() == 'Custom' and colors.custom.type:get() == 'Gradient' and colors.custom.select:get('Debug panel') then draw_gradient_text( x + 4, y + 4, 'b', nil, string.format('%s', lua.name), 25, {r = custom.r, g = custom.g, b = custom.b, a = alpha}, {r = custom.r3, g = custom.g3, b = custom.b3, a = alpha}, {r = custom.r4, g = custom.g4, b = custom.b4, a = alpha}, {r = custom.r2, g = custom.g2, b = custom.b2, a = alpha} ) local gradient_width = renderer.measure_text('b', string.format('%s', lua.name)) renderer.text(x + gradient_width + 7, y + 4, 255, 255, 255, alpha, 'b', nil, '/ Debug panel') else renderer.text(x + 4, y + 4, 255, 255, 255, alpha, 'b', nil, string.format('\a%s%s\a%s / Debug panel', coloring.rgba_to_hex(custom.r, custom.g, custom.b, alpha), lua.name, coloring.rgba_to_hex(255, 255, 255, alpha))) end local draw_debug = make_debug_drawer(y + 20, alpha) draw_debug(x + 4, 'State: ', condition) draw_debug(x + 4, 'B. Modifier: ', elements.conditions[condition].modifier:get()) draw_debug(x + 4, 'B. Mod. offset: ', elements.conditions[condition].modifier_offset:get()) draw_debug(x + 4, 'B. Mod. randomization: ', elements.conditions[condition].modifier_randomization:get(), true) draw_debug(x + 4, 'O. Offset: ', offset) draw_debug(x + 4, 'O. Modifier: ', reference.antiaim.angles.yaw_jitter[1]:get()) draw_debug(x + 4, 'O. Mod. offset: ', reference.antiaim.angles.yaw_jitter[2]:get()) draw_debug(x + 4, 'O. Body yaw: ', reference.antiaim.angles.body_yaw[1]:get()) draw_debug(x + 4, 'O. Body side: ', reference.antiaim.angles.body_yaw[2]:get()) draw_debug(x + 4, 'O. Delay: ', elements.conditions[condition].delay:get()) end client.set_event_callback('setup_command', on_setup_command) client.set_event_callback('paint_ui', on_paint_ui) end -- 独立状态指示器 local predict_active = false local predict_last_check = 0 client.set_event_callback("paint", function() local current_time = globals.realtime() if current_time - predict_last_check > 0.5 then predict_last_check = current_time if elements.aimbot.predict_enemies.enable:get() and is_in_game() then local extrapolate_ok, extrapolate = pcall(function() return cvar.cl_extrapolate_amount:get_float() end) local interpolate_ok, interpolate = pcall(function() return cvar.cl_interpolate:get_int() end) local interp_ratio_ok, interp_ratio = pcall(function() return cvar.cl_interp_ratio:get_int() end) if extrapolate_ok and interpolate_ok and interp_ratio_ok then predict_active = (math.abs(extrapolate - 0.7) < 0.01 and interpolate == 0 and interp_ratio == 1) else predict_active = false end else predict_active = false end end end) local multi_panel = { width = 100, height = 100 }; do local drag = drag_system.new( 'multi_panel', drag_slider.windows.multi_panel.x, drag_slider.windows.multi_panel.y, screen_size_x() / 2, screen_size_y() / 2 - 400, 'xy', { w = function () return multi_panel.width end, h = function () return multi_panel.height end, align_x = 'center', snap_distance = 10, show_guides = true, show_default_dot = true, show_highlight = true, align_center = true, show_center_dot = true } ) local defensive_ticks, defensive_max_ticks = { }, 15 local lc_broken_max, lc_broken_show, lc_broken_ticks, lc_broken_timer, lc_broken_delay = 15, false, 0, 0, 1.5 local anim_height = 0 multi_panel._slowed_cache = { last_velocity = 0, last_modifier = 1, last_slow = 0, last_hit_tick = 0 } local indicator_anim = { slowed = { }, defensive = { }, lc = { }, resolver = { }, predict = { }, backtrack = { }, air_stop = { } } local function get_slowed_down_percent () local me = entity.get_local_player() if not me or not entity.is_alive(me) then multi_panel._slowed_cache.last_velocity = 0 multi_panel._slowed_cache.last_modifier = 1 multi_panel._slowed_cache.last_slow = 0 return 0 end local modifier = entity.get_prop(me, 'm_flVelocityModifier') or 1 local velocity = { entity.get_prop(me, 'm_vecVelocity') } local speed = math.sqrt((velocity[1] or 0)^2 + (velocity[2] or 0)^2) local on_ground = bit.band(entity.get_prop(me, 'm_fFlags') or 0, 1) == 1 if modifier < 1 then if speed < (multi_panel._slowed_cache.last_velocity or 0) - 1 then multi_panel._slowed_cache.last_slow = 1 - modifier multi_panel._slowed_cache.last_hit_tick = globals.tickcount() end multi_panel._slowed_cache.last_modifier = modifier multi_panel._slowed_cache.last_velocity = speed return 1 - modifier else if on_ground and speed < 1 then multi_panel._slowed_cache.last_slow = 0 end multi_panel._slowed_cache.last_modifier = 1 multi_panel._slowed_cache.last_velocity = speed return 0 end end local function on_paint_ui () -- 添加游戏状态检查,使其行为与real debug.lua一致 if not entity.get_local_player() or not entity.is_alive(entity.get_local_player()) then return end local enabled = elements.visuals.windows:get('Multi panel') local alpha = lerp('multi_panel_alpha', enabled and 255 or 0, 10, 0.001, 'ease_out') if alpha < 1 then return end local menu_open = ui.is_menu_open() local me = entity.get_local_player() local is_alive = me and entity.is_alive(me) local slow_val, slowed_active = 0, false if is_alive then slow_val = get_slowed_down_percent() slowed_active = slow_val > 0.01 else multi_panel._slowed_cache.last_velocity = 0 multi_panel._slowed_cache.last_modifier = 1 multi_panel._slowed_cache.last_slow = 0 end local is_defensive = exploits:in_defensive() table.insert(defensive_ticks, 1, is_defensive and 1 or 0) if #defensive_ticks > defensive_max_ticks then table.remove(defensive_ticks) end local defensive_active = is_alive and is_defensive or false local is_lc_broken = is_alive and exploits:is_lagcomp_broken() or false local lc_ticks = 0 if is_lc_broken then lc_broken_timer = globals.realtime() lc_ticks = helpers:clamp(exploits.ticks_processed, 0, lc_broken_max) lc_broken_ticks = lc_ticks lc_broken_show = true elseif lc_broken_show and globals.realtime() - lc_broken_timer < lc_broken_delay then lc_ticks = lc_broken_ticks else lc_ticks = 0 lc_broken_show = false end local lc_active = lc_broken_show and lc_ticks -- Resolver状态 local resolver_active = (elements.aimbot.resolver.enable:get() and (elements.aimbot.resolver.settings.mode:get() == 'Entitylayer' or elements.aimbot.resolver.settings.mode:get() == 'RAM + Animlayer \aD1AA3DFF[BETA]')) and is_alive local current_threat = client.current_threat() local resolver_state = "OFF" if resolver_active then if current_threat and entity.is_alive(current_threat) and not entity.is_dormant(current_threat) then resolver_state = "ACTIVE" else resolver_state = "WAITING" end end -- Predict状态 (使用全局变量,与原始实现一致) local predict_enabled = elements.aimbot.predict_enemies.enable:get() local predict_state = "OFF" local predict_extrapolating = false if not is_in_game() then predict_state = "NOT IN GAME" elseif not predict_enabled then predict_state = "OFF" elseif predict_active then -- 使用全局变量predict_active predict_state = "ACTIVE" predict_extrapolating = true else predict_state = "SETTING" end local show = menu_open or slowed_active or defensive_active or lc_active or resolver_active or (predict_enabled and is_in_game()) or elements.aimbot.extended_backtrack.enable:get() local animate = lerp('multi_panel_show', show and 1 or 0, 10, 0.001, 'ease_out') local indicators = { } local pad_top, pad_bottom, pad_between, section_h = 20, 30, 6, 30 if slowed_active or menu_open then table.insert(indicators, 'slowed') end if defensive_active or menu_open then table.insert(indicators, 'defensive') end if lc_active or menu_open then table.insert(indicators, 'lc') end if resolver_active or menu_open then table.insert(indicators, 'resolver') end if (predict_enabled and is_in_game()) or menu_open then table.insert(indicators, 'predict') end if elements.aimbot.extended_backtrack.enable:get() or menu_open then table.insert(indicators, 'backtrack') end local indicator_y = { } local active_names = { } local indicator_delay_state = multi_panel._indicator_delay_state or {defensive = {active = false, timer = 0}, lc = {active = false, timer = 0}} multi_panel._indicator_delay_state = indicator_delay_state local function delay_insert (name, is_active, delay) local now = globals.realtime() if is_active then indicator_delay_state[name].active = true indicator_delay_state[name].timer = now table.insert(active_names, name) else if indicator_delay_state[name].active then if now - indicator_delay_state[name].timer < delay then table.insert(active_names, name) else indicator_delay_state[name].active = false end end end end for _, name in ipairs({'slowed', 'defensive', 'lc', 'resolver', 'predict', 'backtrack'}) do local is_active = false for _, v in ipairs(indicators) do if v == name then is_active = true break end end if name == 'defensive' or name == 'lc' then delay_insert(name, is_active, 0.5) else if is_active then table.insert(active_names, name) end end end local visible_count = #active_names for i, name in ipairs({'slowed', 'defensive', 'lc', 'resolver', 'predict', 'backtrack'}) do local active = false for _, v in ipairs(active_names) do if v == name then active = true break end end local target_alpha = active and 1 or 0 indicator_anim[name].alpha = lerp('multi_panel_' .. name .. '_alpha', target_alpha, 10, 0.001, 'ease_out') local idx = 0 for j, v in ipairs(active_names) do if v == name then idx = j break end end local actual_padding = pad_top if name == 'slowed' then if visible_count == 1 then actual_padding = pad_top + 7 -- 原来是19,现在基于pad_top计算 else actual_padding = pad_top + 3 -- 原来是15,现在基于pad_top计算 end elseif name == 'defensive' then if visible_count > 2 then actual_padding = pad_top - 1 -- 原来是11,现在基于pad_top计算 else actual_padding = pad_top + 4 -- 原来是16,现在基于pad_top计算 end elseif name == 'resolver' or name == 'predict' or name == 'backtrack' then if visible_count == 1 then actual_padding = pad_top + 2 -- 原来是14,现在基于pad_top计算 end end if indicator_anim[name].alpha > 0.01 and idx > 0 then -- 为特定指示器之间添加额外间距 local extra_spacing = 0 if name == 'resolver' and idx > 1 then -- 检查前一个元素是否是lagcomp local prev_name = active_names[idx - 1] if prev_name == 'lc' then extra_spacing = 10 -- 添加额外10像素间距 end elseif name == 'predict' and idx > 1 then -- 检查前一个元素是否是lagcomp或resolver local prev_name = active_names[idx - 1] if prev_name == 'lc' or prev_name == 'resolver' then extra_spacing = 10 -- 添加额外10像素间距 end elseif name == 'backtrack' and idx > 1 then -- 检查前一个元素是否是lagcomp、resolver或predict local prev_name = active_names[idx - 1] if prev_name == 'lc' or prev_name == 'resolver' or prev_name == 'predict' then extra_spacing = 10 -- 添加额外10像素间距 end end indicator_anim[name].target_y = actual_padding + (idx - 1) * (section_h + pad_between) + extra_spacing else indicator_anim[name].target_y = actual_padding + (visible_count) * (section_h + pad_between) + 10 end indicator_anim[name].y = lerp('multi_panel_' .. name .. '_y', indicator_anim[name].target_y, 10, 0.01, 'ease_out') indicator_y[name] = indicator_anim[name].y end local target_height, actual_visible = pad_top + pad_bottom, 0 for _, name in ipairs({'slowed', 'defensive', 'lc', 'resolver', 'predict', 'backtrack'}) do if indicator_anim[name].alpha > 0.01 then target_height = target_height + section_h actual_visible = actual_visible + 1 end end if actual_visible > 1 then target_height = target_height + 5 * (actual_visible - 1) end anim_height = lerp('multi_panel_height', target_height, 10, 0.01, 'ease_out') multi_panel.height = anim_height drag:update(alpha) drag:draw_guides(alpha) local x, y = drag:get_pos() local custom = coloring.parse() local color -- 获取主题色 local theme_r, theme_g, theme_b, theme_a = 179, 190, 214, 255 if colors.combobox:get() == 'Custom' and colors.custom.type:get() == 'Gradient' and colors.custom.select:get('Event logger') then local gradient_custom = custom -- 复用之前获取的custom local color = prepare_gradient_cache(25, {r = gradient_custom.r, g = gradient_custom.g, b = gradient_custom.b, a = 255}, {r = gradient_custom.r3, g = gradient_custom.g3, b = gradient_custom.b3, a = 255}, {r = gradient_custom.r4, g = gradient_custom.g4, b = gradient_custom.b4, a = 255}, {r = gradient_custom.r2, g = gradient_custom.g2, b = gradient_custom.b2, a = 255}, false ) theme_r, theme_g, theme_b = color.r, color.g, color.b else -- 移除重复的coloring.parse()调用,复用之前获取的custom theme_r, theme_g, theme_b = custom.r, custom.g, custom.b end if colors.combobox:get() == 'Custom' and colors.custom.type:get() == 'Gradient' and colors.custom.select:get('Multi panel') then color = prepare_gradient_cache(25, {r = custom.r, g = custom.g, b = custom.b, a = alpha}, {r = custom.r3, g = custom.g3, b = custom.b3, a = alpha}, {r = custom.r4, g = custom.g4, b = custom.b4, a = alpha}, {r = custom.r2, g = custom.g2, b = custom.b2, a = alpha}, false ) end create_interface( x + 2, y + 2, math.max(multi_panel.width - 4, 0), math.max(anim_height - 4, 0), theme_r, theme_g, theme_b, alpha * animate, { side = 'left + right', item = 'Multi panel' } ) local INDICATOR_BAR_W = 60 local INDICATOR_BAR_H = 7 local INDICATOR_GRAPH_H = 10 local INDICATOR_FONT_SIZE = 'cb' local INDICATOR_RADIUS = 2 if indicator_anim.slowed.alpha > 0.01 then local y_off = y + indicator_y.slowed renderer.text(x + (multi_panel.width / 2), y_off, 255, 255, 255, alpha * animate * indicator_anim.slowed.alpha, INDICATOR_FONT_SIZE, nil, 'Slowed down') local bar_w, bar_h = INDICATOR_BAR_W, INDICATOR_BAR_H local bar_x, bar_y = x + (multi_panel.width - bar_w) / 2, y_off + 8 local gradient_colors = { use_gradient = colors.combobox:get() == 'Custom' and colors.custom.type:get() == 'Gradient' and colors.custom.select:get('Multi panel'), col1_start = {r = custom.r, g = custom.g, b = custom.b, a = alpha * animate * indicator_anim.slowed.alpha}, col1_end = {r = custom.r3, g = custom.g3, b = custom.b3, a = alpha * animate * indicator_anim.slowed.alpha}, col2_start = {r = custom.r4, g = custom.g4, b = custom.b4, a = alpha * animate * indicator_anim.slowed.alpha}, col2_end = {r = custom.r2, g = custom.g2, b = custom.b2, a = alpha * animate * indicator_anim.slowed.alpha} } helpers.rounded_rectangle(bar_x, bar_y, bar_w, bar_h, INDICATOR_RADIUS, 80, 80, 80, (alpha * 0.7) * animate * indicator_anim.slowed.alpha) helpers.rounded_rectangle(bar_x, bar_y, math.max(bar_w * slow_val, 3), bar_h, INDICATOR_RADIUS, custom.r, custom.g, custom.b, alpha * animate * indicator_anim.slowed.alpha, gradient_colors ) end if indicator_anim.defensive.alpha > 0.01 then local y_off = y + indicator_y.defensive renderer.text(x + (multi_panel.width / 2), y_off, 255, 255, 255, alpha * animate * indicator_anim.defensive.alpha, INDICATOR_FONT_SIZE, nil, 'Defensive') local bar_w, bar_h = INDICATOR_BAR_W, INDICATOR_GRAPH_H local bar_x, bar_y = x + (multi_panel.width - bar_w) / 2, y_off + 8 helpers.rounded_rectangle(bar_x, bar_y, bar_w, bar_h, INDICATOR_RADIUS, 80, 80, 80, (alpha * 0.7) * animate * indicator_anim.defensive.alpha) local points = { } local tick_w = bar_w / (defensive_max_ticks - 1) for i = 1, defensive_max_ticks do local value = defensive_ticks[i] == 1 and 1 or 0 local anim_val = lerp('defensive_graph_' .. i, value, 10, 0.01, 'ease_out') local px = bar_x + (i - 1) * tick_w local py = bar_y + bar_h - anim_val * (bar_h - 3) points[#points+1] = {px, py, anim_val} end for i = 2, #points do if colors.combobox:get() == 'Custom' and colors.custom.type:get() == 'Gradient' and colors.custom.select:get('Multi panel') then local c = {color.r, color.g, color.b, math.floor(alpha * animate * indicator_anim.defensive.alpha)} renderer.line(points[i-1][1], points[i-1][2], points[i][1], points[i][2], c[1], c[2], c[3], c[4]) else local c = {custom.r, custom.g, custom.b, math.floor(alpha * animate * indicator_anim.defensive.alpha)} renderer.line(points[i-1][1], points[i-1][2], points[i][1], points[i][2], c[1], c[2], c[3], c[4]) end end end if indicator_anim.lc.alpha > 0.01 then local y_off = y + indicator_y.lc renderer.text(x + (multi_panel.width / 2), y_off, 255, 255, 255, alpha * animate * indicator_anim.lc.alpha, INDICATOR_FONT_SIZE, nil, 'Lagcomp') local lc_bar_w, lc_bar_h = INDICATOR_BAR_W, INDICATOR_BAR_H local lc_bar_x, lc_bar_y = x + (multi_panel.width - lc_bar_w) / 2, y_off + 10 local lc_percent = helpers:clamp(lc_ticks / lc_broken_max, 0, 1) helpers.rounded_rectangle(lc_bar_x, lc_bar_y, lc_bar_w, lc_bar_h, INDICATOR_RADIUS, 80, 80, 80, (alpha * 0.7) * animate * indicator_anim.lc.alpha) helpers.rounded_rectangle(lc_bar_x, lc_bar_y, math.max(lc_bar_w * lc_percent, 3), lc_bar_h, INDICATOR_RADIUS, 255, 62, 62, alpha * animate * lc_percent * indicator_anim.lc.alpha) renderer.text(x + (multi_panel.width / 2), lc_bar_y + lc_bar_h + 8, 255, 62, 62, alpha * animate * indicator_anim.lc.alpha, INDICATOR_FONT_SIZE, nil, string.format('%d ticks', lc_ticks)) end -- Resolver指示器 if indicator_anim.resolver.alpha > 0.01 then local y_off = y + indicator_y.resolver renderer.text(x + (multi_panel.width / 2), y_off, 255, 255, 255, alpha * animate * indicator_anim.resolver.alpha, INDICATOR_FONT_SIZE, nil, 'Resolver') local bar_w, bar_h = INDICATOR_BAR_W, INDICATOR_GRAPH_H local bar_x, bar_y = x + (multi_panel.width - bar_w) / 2, y_off + 8 -- 绘制背景条 helpers.rounded_rectangle(bar_x, bar_y, bar_w, bar_h, INDICATOR_RADIUS, 80, 80, 80, (alpha * 0.7) * animate * indicator_anim.resolver.alpha) -- 根据resolver状态绘制不同的动态效果 local points = { } local tick_w = bar_w / 14 -- 15个点,14个间隔 if resolver_state == "OFF" then -- OFF状态:绘制一条静态的红色水平线 for i = 1, 15 do local px = bar_x + (i - 1) * tick_w local py = bar_y + bar_h/2 points[#points+1] = {px, py} end -- 绘制线条 for i = 2, #points do renderer.line( points[i-1][1], points[i-1][2], points[i][1], points[i][2], 255, 0, 0, alpha * animate * indicator_anim.resolver.alpha ) end elseif resolver_state == "WAITING" then -- WAITING状态:绘制一条波动的黄色线条,模拟等待状态 for i = 1, 15 do local wave = math.sin(globals.realtime() * 10 + (i-1) * 0.5) * (bar_h/3) local px = bar_x + (i - 1) * tick_w local py = bar_y + bar_h/2 + wave points[#points+1] = {px, py} end -- 绘制线条 for i = 2, #points do renderer.line( points[i-1][1], points[i-1][2], points[i][1], points[i][2], 255, 255, 0, alpha * animate * indicator_anim.resolver.alpha ) end else -- ACTIVE状态 -- ACTIVE状态:绘制绿色的动态波浪线 for i = 1, 15 do local wave = math.sin(globals.realtime() * 20 + (i-1) * 0.7) * (bar_h/3) local px = bar_x + (i - 1) * tick_w local py = bar_y + bar_h/2 + wave points[#points+1] = {px, py} end -- 绘制线条 for i = 2, #points do renderer.line( points[i-1][1], points[i-1][2], points[i][1], points[i][2], 0, 255, 0, alpha * animate * indicator_anim.resolver.alpha ) end end end -- Predict指示器 if indicator_anim.predict.alpha > 0.01 then local y_off = y + indicator_y.predict renderer.text(x + (multi_panel.width / 2), y_off, 255, 255, 255, alpha * animate * indicator_anim.predict.alpha, INDICATOR_FONT_SIZE, nil, 'Predict') local bar_w, bar_h = INDICATOR_BAR_W, INDICATOR_GRAPH_H local bar_x, bar_y = x + (multi_panel.width - bar_w) / 2, y_off + 8 -- 绘制背景条 helpers.rounded_rectangle(bar_x, bar_y, bar_w, bar_h, INDICATOR_RADIUS, 80, 80, 80, (alpha * 0.7) * animate * indicator_anim.predict.alpha) -- 根据predict状态绘制不同的网格效果 local grid_size = 3 if predict_state == "OFF" then -- OFF状态:绘制红色的静态网格 for i = 0, math.floor(bar_w/grid_size) do local x_pos = bar_x + i * grid_size renderer.line(x_pos, bar_y, x_pos, bar_y + bar_h, 255, 0, 0, alpha * animate * indicator_anim.predict.alpha * 0.3) end for i = 0, math.floor(bar_h/grid_size) do local y_pos = bar_y + i * grid_size renderer.line(bar_x, y_pos, bar_x + bar_w, y_pos, 255, 0, 0, alpha * animate * indicator_anim.predict.alpha * 0.3) end elseif predict_state == "NOT IN GAME" then -- NOT IN GAME状态:绘制灰色的静态网格 for i = 0, math.floor(bar_w/grid_size) do local x_pos = bar_x + i * grid_size renderer.line(x_pos, bar_y, x_pos, bar_y + bar_h, 128, 128, 128, alpha * animate * indicator_anim.predict.alpha * 0.3) end for i = 0, math.floor(bar_h/grid_size) do local y_pos = bar_y + i * grid_size renderer.line(bar_x, y_pos, bar_x + bar_w, y_pos, 128, 128, 128, alpha * animate * indicator_anim.predict.alpha * 0.3) end elseif predict_state == "SETTING" then -- SETTING状态:绘制黄色的滚动网格 local offset = (globals.realtime() * 20) % (grid_size * 2) for i = -1, math.floor((bar_w + offset)/grid_size) do local x_pos = bar_x + i * grid_size - offset if x_pos >= bar_x and x_pos <= bar_x + bar_w then renderer.line(x_pos, bar_y, x_pos, bar_y + bar_h, 255, 255, 0, alpha * animate * indicator_anim.predict.alpha * 0.3) end end for i = 0, math.floor(bar_h/grid_size) do local y_pos = bar_y + i * grid_size renderer.line(bar_x, y_pos, bar_x + bar_w, y_pos, 255, 255, 0, alpha * animate * indicator_anim.predict.alpha * 0.3) end else -- ACTIVE状态 -- ACTIVE状态:绘制动态反复滚动的网格 local offset = (globals.realtime() * 40) % (bar_w * 2) if offset > bar_w then offset = bar_w * 2 - offset end for i = -1, math.floor((bar_w + offset)/grid_size) do local x_pos = bar_x + i * grid_size - offset if x_pos >= bar_x and x_pos <= bar_x + bar_w then renderer.line(x_pos, bar_y, x_pos, bar_y + bar_h, 0, 255, 0, alpha * animate * indicator_anim.predict.alpha * 0.3) end end for i = 0, math.floor(bar_h/grid_size) do local y_pos = bar_y + i * grid_size renderer.line(bar_x, y_pos, bar_x + bar_w, y_pos, 0, 255, 0, alpha * animate * indicator_anim.predict.alpha * 0.3) end end end -- Backtrack指示器 (基于Extended backtrack功能) if indicator_anim.backtrack.alpha > 0.01 then local y_off = y + indicator_y.backtrack renderer.text(x + (multi_panel.width / 2), y_off, 255, 255, 255, alpha * animate * indicator_anim.backtrack.alpha, INDICATOR_FONT_SIZE, nil, 'Backtrack') local bar_w, bar_h = INDICATOR_BAR_W, INDICATOR_GRAPH_H local bar_x, bar_y = x + (multi_panel.width - bar_w) / 2, y_off + 8 -- 绘制背景条 helpers.rounded_rectangle(bar_x, bar_y, bar_w, bar_h, INDICATOR_RADIUS, 80, 80, 80, (alpha * 0.7) * animate * indicator_anim.backtrack.alpha) -- Extended Backtrack指示器动画 local extended_enabled = elements.aimbot.extended_backtrack.enable:get() -- 绘制代表backtrack时间的进度条 local max_backtrack_time = 200 -- 标准backtrack时间 local current_backtrack_time = extended_enabled and 400 or 200 -- Extended启用时为400 local progress = current_backtrack_time / 400 -- 相对于最大值400的比例 -- 绘制主进度条(表示当前backtrack时间) local progress_w = bar_w * progress local progress_color = extended_enabled and {0, 200, 255} or {128, 128, 128} -- 蓝色表示Extended启用,灰色表示标准 helpers.rounded_rectangle(bar_x, bar_y, progress_w, bar_h, INDICATOR_RADIUS, progress_color[1], progress_color[2], progress_color[3], alpha * animate * indicator_anim.backtrack.alpha) -- 如果启用了Extended Backtrack,添加动态效果 if extended_enabled then -- 添加脉冲效果,模拟数据包的传输 local pulse_pos = (globals.realtime() * 20) % bar_w renderer.rectangle(bar_x + pulse_pos - 2, bar_y, 4, bar_h, 255, 255, 255, alpha * animate * indicator_anim.backtrack.alpha * 0.7) -- 添加一些小的波动效果,模拟网络延迟变化 for i = 1, 5 do local dot_x = bar_x + (i * bar_w/6) local dot_y = bar_y + bar_h/2 + math.sin(globals.realtime() * 20 + i) * (bar_h/4) renderer.circle(dot_x, dot_y, 255, 255, 255, alpha * animate * indicator_anim.backtrack.alpha, 2, 0, 1) end else -- 标准backtrack模式,显示静态点 for i = 1, 3 do local dot_x = bar_x + (i * bar_w/4) local dot_y = bar_y + bar_h/2 end end -- 显示当前backtrack时间数值 renderer.text(x + (multi_panel.width / 2), bar_y + bar_h + 8, 255, 255, 255, alpha * animate * indicator_anim.backtrack.alpha, INDICATOR_FONT_SIZE, nil, string.format('%d ms', current_backtrack_time)) end end elements.visuals.windows:set_event('paint_ui', on_paint_ui, function (ref) return ref:get('Multi panel') end) end local event_logger = { width = 200, height = 30 }; do local drag = drag_system.new( 'event_logger', drag_slider.windows.event_logger.x, drag_slider.windows.event_logger.y, screen_size_x() / 2, screen_size_y() / 2 + 650, 'xy', { w = function () return event_logger.width end, h = function () return event_logger.height end, align_x = 'center', snap_distance = 10, show_guides = true, show_default_dot = true, show_highlight = true, align_center = true, show_center_dot = true } ) local MISS_COLOR = { r = 255, g = 0, b = 50, a = 255 } local MISS_SPREAD_COLOR = { r = 255, g = 205, b = 0, a = 255 } local last_aim_data = { backtrack = 0, hitgroup = 'unknown', damage = 0 } local last_hit_data = { hit_chance = 70 } local hitgroup_names = { [0] = 'generic', 'head', 'chest', 'stomach', 'left arm', 'right arm', 'left leg', 'right leg', 'neck', '?', 'gear' } local notifications = { list = {}, max_notifications = 6, width = 300, height = 50 } -- 添加新通知 local function add_notification(text, r, g, b) table.insert(notifications.list, 1, { text = text, color = { r = r, g = g, b = b }, time = globals.realtime(), y = 0, active = true, alpha = 0, start_y = nil -- 添加起始Y位置标记 }) -- 限制通知数量 if #notifications.list > notifications.max_notifications then table.remove(notifications.list) end end -- 渲染通知 local function render_notifications() -- 添加游戏状态检查,确保只在游戏内显示 if not entity.get_local_player() or not entity.is_alive(entity.get_local_player()) then return end drag:update(255) drag:draw_guides(255) local base_x, base_y = drag:get_pos() -- 如果没有通知,且菜单打开时,显示提示文字告知用户这是hitlog位置调整框 if #notifications.list == 0 and ui.is_menu_open() then local width, height = event_logger.width, event_logger.height local x, y = base_x, base_y -- 显示提示文字,居中显示 local text = "Hitlog Position (Drag to move)" local text_width, text_height = renderer.measure_text("c", text) renderer.text(x + width/2, y + height/2, 255, 255, 255, 255, "cb", "center", text) elseif #notifications.list > 0 then base_x = base_x + event_logger.width / 2 -- Center the notifications base_y = base_y + event_logger.height for i, notification in ipairs(notifications.list) do if notification.active then local elapsed = globals.realtime() - notification.time local target_y = base_y - (i - 1) * 40 -- 减小间距到25 -- 动画处理 - 类似Meteor的动画效果 local animation_modifier = 0 local animation_text_modifier = 0 -- 初始化通知的起始Y位置在目标位置之上 if not notification.start_y then notification.start_y = target_y - 40 -- 从目标位置上方40像素开始 notification.y = notification.start_y end if elapsed < 0.5 then -- 淡入和滑入动画 (透明度渐增 + 位置滑动) animation_modifier = elapsed / 0.5 animation_text_modifier = animation_modifier notification.alpha = math.min(255, 255 * animation_modifier) -- 从上方滑入到目标位置 notification.y = notification.start_y + (target_y - notification.start_y) * animation_modifier elseif elapsed > 4.5 then -- 淡出动画 (透明度渐减) animation_modifier = 1 - (elapsed - 4.5) / 0.5 animation_text_modifier = animation_modifier notification.alpha = math.max(0, 255 * animation_modifier) -- 保持在原位置 notification.y = target_y if notification.alpha <= 0 then notification.active = false end else -- 保持显示 animation_modifier = 1 animation_text_modifier = 1 notification.alpha = 255 notification.y = target_y end if notification.alpha > 0 then local text_width, text_height = renderer.measure_text("b", notification.text) -- 改为cb字体 local width = math.max(100, text_width + 52) -- 减小最小宽度到100,内边距减小到12 local height = 28 -- 减小高度到18 local x = base_x - width / 2 local y = notification.y -- 获取主题色 local theme_r, theme_g, theme_b, theme_a = 179, 190, 214, 255 if colors.combobox:get() == 'Custom' and colors.custom.type:get() == 'Gradient' and colors.custom.select:get('Event logger') then local custom = coloring.parse() local color = prepare_gradient_cache(25, {r = custom.r, g = custom.g, b = custom.b, a = 255}, {r = custom.r3, g = custom.g3, b = custom.b3, a = 255}, {r = custom.r4, g = custom.g4, b = custom.b4, a = 255}, {r = custom.r2, g = custom.g2, b = custom.b2, a = 255}, false ) theme_r, theme_g, theme_b = color.r, color.g, color.b else local custom = coloring.parse() theme_r, theme_g, theme_b = custom.r, custom.g, custom.b end -- 绘制背景和边框,与keybinds保持一致 -- 绘制图标背景框 local icon_size = height - 4 local icon_x = x + 2 local icon_y = y + 2 local icon_alpha = math.floor(notification.alpha) local bg_alpha = notification.alpha or 0 -- 绘制顶部颜色边框(在Solid和Gradient模式下都显示) local custom = coloring.parse() local gradient_colors = { use_gradient = colors.combobox:get() == 'Custom' and colors.custom.type:get() == 'Gradient' and colors.custom.select:get('Event logger'), col1_start = {r = custom.r, g = custom.g, b = custom.b, a = bg_alpha * animation_modifier}, col1_end = {r = custom.r3 or custom.r, g = custom.g3 or custom.g, b = custom.b3 or custom.b, a = bg_alpha * animation_modifier}, col2_start = {r = custom.r4 or custom.r, g = custom.g4 or custom.g, b = custom.b4 or custom.b, a = bg_alpha * animation_modifier}, col2_end = {r = custom.r2 or custom.r, g = custom.g2 or custom.g, b = custom.b2 or custom.b, a = bg_alpha * animation_modifier} } -- 使用create_interface绘制图标背景框 create_interface( icon_x, icon_y, icon_size, icon_size, theme_r * animation_modifier, theme_g * animation_modifier, theme_b * animation_modifier, bg_alpha * animation_modifier, { side = 'up', item = 'Event logger' } ) -- 绘制图标(勾号或叉号) if notification.text:sub(1, 3) == "Hit" then -- 绘制勾号 renderer.text(icon_x + icon_size/2, icon_y + icon_size/2, 0, 255, 0, icon_alpha * animation_modifier, "cb", "center", "✓") else -- 绘制叉号 renderer.text(icon_x + icon_size/2, icon_y + icon_size/2, 255, 0, 0, icon_alpha * animation_modifier, "cb", "center", "✗") end -- 绘制文本背景框(与图标框分离) local text_x = x + icon_size + 8 local text_background_width = width - icon_size - 16 -- 减去图标宽度和间距 create_interface( text_x, y + 2, text_background_width, height - 4, theme_r * animation_modifier, theme_g * animation_modifier, theme_b * animation_modifier, bg_alpha * animation_modifier, { side = 'up', item = 'Event logger' } ) -- 绘制文本 local text_alpha = math.floor(notification.alpha * animation_text_modifier) renderer.text(text_x + 6, y + height/2 - text_height/2, notification.color.r * animation_modifier, notification.color.g * animation_modifier, notification.color.b * animation_modifier, text_alpha, "b", nil, notification.text) -- 使用cb字体 end end end end -- 清理非活动通知 for i = #notifications.list, 1, -1 do if not notifications.list[i].active then table.remove(notifications.list, i) end end end local function log_miss_to_console(e, victim_name, wanted_hitgroup, wanted_damage, hit_chance, backtrack, color) client.color_log(color.r, color.g, color.b, string.format('%s » \0', lua.name:lower())) client.color_log(255, 255, 255, 'missed \0') client.color_log(color.r, color.g, color.b, string.format('%s \0', victim_name:lower())) client.color_log(255, 255, 255, 'in \0') client.color_log(color.r, color.g, color.b, string.format('%s \0', wanted_hitgroup)) client.color_log(255, 255, 255, 'due to \0') client.color_log(color.r, color.g, color.b, string.format('%s \0', e.reason)) client.color_log(255, 255, 255, '/ estimated damage - \0') client.color_log(color.r, color.g, color.b, string.format('%s \0', wanted_damage)) client.color_log(255, 255, 255, string.format('[hc: %s%% / bt: %st]', math.ceil(hit_chance), backtrack)) end local function log_hit_to_console(e, victim_name, group, damage, health, hit_chance, backtrack, wanted_hitgroup, wanted_damage, color) local weapon = e.weapon local hit_type = 'hit' if weapon == 'hegrenade' then hit_type = 'naded' elseif weapon == 'inferno' then hit_type = 'burned' elseif weapon == 'knife' then hit_type = 'knifed' end client.color_log(color.r, color.g, color.b, string.format('%s » \0', lua.name:lower())) if health ~= 0 then if hit_type == 'hit' then client.color_log(255, 255, 255, 'hit \0') client.color_log(color.r, color.g, color.b, string.format('%s \0', victim_name:lower())) client.color_log(255, 255, 255, 'in \0') client.color_log(color.r, color.g, color.b, string.format('%s \0', group)) client.color_log(255, 255, 255, 'for \0') client.color_log(color.r, color.g, color.b, string.format('%s \0', damage)) client.color_log(255, 255, 255, 'damage / hp remaining - \0') client.color_log(color.r, color.g, color.b, string.format('%d \0', health)) if group ~= wanted_hitgroup then client.color_log(255, 255, 255, string.format( '[hc: %s%% / bt: %st / mismatched %s for %s dmg]', math.ceil(hit_chance), backtrack, wanted_hitgroup, wanted_damage )) else client.color_log(255, 255, 255, string.format( '[hc: %s%% / bt: %st]', math.ceil(hit_chance), backtrack )) end else client.color_log(255, 255, 255, string.format('%s \0', hit_type)) client.color_log(color.r, color.g, color.b, string.format('%s \0', victim_name:lower())) client.color_log(255, 255, 255, 'for \0') client.color_log(color.r, color.g, color.b, string.format('%s \0', damage)) client.color_log(255, 255, 255, 'damage / hp remaining - \0') client.color_log(color.r, color.g, color.b, string.format('%d \0', health)) end else client.color_log(255, 255, 255, 'killed \0') client.color_log(color.r, color.g, color.b, string.format('%s \0', victim_name:lower())) client.color_log(255, 255, 255, string.format('for %s damage \0', damage)) if group ~= wanted_hitgroup then client.color_log(255, 255, 255, string.format( '[hc: %s%% / bt: %st / mismatched %s for %s dmg]', math.ceil(hit_chance), backtrack, wanted_hitgroup, wanted_damage )) else client.color_log(255, 255, 255, string.format( '[hc: %s%% / bt: %st]', math.ceil(hit_chance), backtrack )) end end end local function on_paint() if elements.visuals.windows:get('Event logger') and elements.visuals.event_logger.settings.type:get('On screen') then render_notifications() end end local function on_aim_fire(aim_fire_data) last_aim_data.backtrack = math.abs(globals.tickcount() - (aim_fire_data.tick or globals.tickcount())) last_aim_data.hitgroup = aim_fire_data.hitgroup last_aim_data.damage = aim_fire_data.damage end local function on_aim_hit(aim_hit_data) last_hit_data.hit_chance = aim_hit_data.hit_chance end local function on_aim_miss (e) if not elements.visuals.windows:get('Event logger') then return end local settings = elements.visuals.event_logger.settings.type local victim_name = entity.get_player_name(e.target) or 'unknown' local wanted_hitgroup = hitgroup_names[last_aim_data.hitgroup] or 'unknown' local wanted_damage = last_aim_data.damage or 0 local hit_chance = e.hit_chance or 0 local backtrack = last_aim_data.backtrack or 0 local color if e.reason == 'spread' or e.reason == 'prediction error' then color = MISS_SPREAD_COLOR else color = MISS_COLOR end local event_text = string.format("Missed %s's %s due to %s [dmg: %d | hc: %d%% | bt: %d]", victim_name:upper(), wanted_hitgroup, e.reason, wanted_damage, math.ceil(hit_chance), backtrack) if settings:get('In console') then log_miss_to_console( e, victim_name, wanted_hitgroup, wanted_damage, hit_chance, backtrack, color ) end if settings:get('On screen') then add_notification(event_text, color.r, color.g, color.b) end end local function on_player_hurt (e) if not elements.visuals.windows:get('Event logger') then return end local settings = elements.visuals.event_logger.settings.type local attacker = client.userid_to_entindex(e.attacker) local local_player = entity.get_local_player() if attacker ~= local_player then return end local victim = client.userid_to_entindex(e.userid) local victim_name = entity.get_player_name(victim) or 'unknown' local damage = e.dmg_health or 0 local hitgroup = e.hitgroup or 0 local group = hitgroup_names[hitgroup] or 'unknown' local wanted_hitgroup = hitgroup_names[last_aim_data.hitgroup] or 'unknown' local wanted_damage = last_aim_data.damage or 0 local hit_chance = last_hit_data.hit_chance or 0 local backtrack = last_aim_data.backtrack or 0 local health = e.health or 0 local custom = coloring.parse() local color = nil if colors.combobox:get() == 'Custom' and colors.custom.type:get() == 'Gradient' and colors.custom.select:get('Event logger') then color = prepare_gradient_cache(25, {r = custom.r, g = custom.g, b = custom.b, a = 255}, {r = custom.r3, g = custom.g3, b = custom.b3, a = 255}, {r = custom.r4, g = custom.g4, b = custom.b4, a = 255}, {r = custom.r2, g = custom.g2, b = custom.b2, a = 255}, false ) end local r, g, b = custom.r, custom.g, custom.b if color then r, g, b = color.r, color.g, color.b end local event_text = string.format("Hit %s in %s for %d damage [hc: %d%% | bt: %d]", victim_name:upper(), group, damage, math.ceil(hit_chance), backtrack) if settings:get('In console') then log_hit_to_console( e, victim_name, group, damage, health, hit_chance, backtrack, wanted_hitgroup, wanted_damage, { r = r, g = g, b = b, a = 255 } ) end if settings:get('On screen') then add_notification(event_text, r, g, b) end end client.set_event_callback('paint', on_paint) client.set_event_callback('aim_fire', on_aim_fire) client.set_event_callback('aim_hit', on_aim_hit) client.set_event_callback('aim_miss', on_aim_miss) client.set_event_callback('player_hurt', on_player_hurt) end -- Left indicators功能实现 local left_indicators = { }; do local render = { anim = {}, math_anim2 = function(self, start, end_pos, speed) speed = math.max(math.min(globals.frametime() * ((speed / 100) or 0.08) * 175.0, 1.0), 0.01) local a = (end_pos - start) * speed + start return tonumber(string.format("%.3f", a)) end, alphen = function(self, value) return math.max(0, math.min(255, value)) end, new_anim = function(self, name, value, speed) if self.anim[name] == nil then self.anim[name] = value end local animation = self:math_anim2(self.anim[name], value, speed) self.anim[name] = animation return self.anim[name] end } local helpers = { charge = function(self) if not entity.is_alive(entity.get_local_player()) then return end local a = entity.get_local_player() local weapon = entity.get_prop(a, "m_hActiveWeapon") if weapon == nil then return false end local next_attack = entity.get_prop(a, "m_flNextAttack") + 0.01 local checkcheck = entity.get_prop(weapon, "m_flNextPrimaryAttack") if checkcheck == nil then return end local next_primary_attack = checkcheck + 0.01 if next_attack == nil or next_primary_attack == nil then return false end return next_attack - globals.curtime() < 0 and next_primary_attack - globals.curtime() < 0 end } local refs = { rage = { dt = {ui.reference("rage", "aimbot", "Double tap")}, os = {ui.reference("aa", "other", "On shot anti-aim")}, ovr = {ui.reference('rage', 'aimbot', 'minimum damage override')}, fd = {ui.reference("rage", "other", "Duck peek assist")}, baim = {ui.reference('rage', 'aimbot', 'force body aim')}, safe = {ui.reference('rage', 'aimbot', 'force safe point')}, }, bindfs = {ui.reference("aa", "anti-aimbot angles", "Freestanding")}, ping = {ui.reference("misc", "miscellaneous", "ping spike")}, } local indicator = { table = { binds = {} }, y = 0, add = function(self, icon, name, ref) self.table.binds[#self.table.binds + 1] = { full_icon = icon, name = string.sub(name, 1, 2), full_name = name, ref = ref, chars = 0, alpha = 0 } end, text = function(self, x, y, r, g, b, a, re, ge, be, ae, icon, text, i_alpha, alpha) if alpha == nil then alpha = 1 end if alpha <= 0 then return end local icon_wh = vector(renderer.measure_text('+', icon)) local text_wh = vector(renderer.measure_text('+', text)) local x1, y1 = client.screen_size() local width_ind = math.floor(text_wh.x / 2) local y = y + y1/2 + 70 renderer.gradient(x + 4, y + text_wh.y, width_ind + 24, text_wh.y + 4, 5, 5, 5, 0, 5, 5, 5, 55 * alpha, true) renderer.gradient(x + 28 + width_ind, y + text_wh.y, 29 + width_ind, text_wh.y + 4, 5, 5, 5, 55 * alpha, 5, 5, 5, 0, true) renderer.text(x * i_alpha, y + icon_wh.y, re, ge, be, ae * i_alpha, '+', nil, icon) renderer.text(x + icon_wh.x * i_alpha, y + icon_wh.y + 1, r, g, b, a, '+', nil, text) self.y = self.y + 40 * alpha end, general = function(self) local me = entity.get_local_player() if not me or not entity.is_alive(me) then return end local dt_active = helpers:charge() self.y = 15 local player_resource = entity.get_all("CCSPlayerResource")[1] local ping = 0 if player_resource then ping = entity.get_prop(player_resource, "m_iPing", entity.get_local_player()) or 0 end local air_lag_active = false -- 添加Debug indicator信息显示 if elements.visuals.hitrate.enable:get() then local selected_options = elements.visuals.hitrate.settings.type:get() if type(selected_options) ~= "table" then selected_options = {selected_options} end -- 处理命中率指示器的动画 local accuracy_active = table_contains(selected_options, "Accuracy Rate") if self.accuracy_alpha == nil then self.accuracy_alpha = 0 end self.accuracy_alpha = render:math_anim2(self.accuracy_alpha, accuracy_active and 1 or 0, 8) -- 显示命中率 if accuracy_active or self.accuracy_alpha > 0.01 then local accuracy_text = string.format("%s/%s (%s%%)", stats.hits, stats.total_shots, string.format("%.1f", stats.total_shots ~= 0 and (stats.hits / stats.total_shots * 100) or 0)) self:text(40, self.y, 255, 255, 255, 255 * self.accuracy_alpha, 255, 255, 255, 255 * self.accuracy_alpha, " ", accuracy_text, 1, self.accuracy_alpha ) end -- 处理目标指示器的动画 local target_active = table_contains(selected_options, "Detection Focus") if self.target_alpha == nil then self.target_alpha = 0 end self.target_alpha = render:math_anim2(self.target_alpha, target_active and 1 or 0, 8) -- 显示目标信息 if target_active or self.target_alpha > 0.01 then get_best_enemy() local target = best_enemy and entity.get_player_name(best_enemy) or "wait" self:text(40, self.y, 255, 255, 255, 255 * self.target_alpha, 255, 255, 255, 255 * self.target_alpha, " ", "Target: " .. target, 1, self.target_alpha ) end end local air_lag_active = false local auto_tp_active = false if elements and elements.aimbot and elements.aimbot.auto_tp and elements.aimbot.auto_tp.enable then local teleport_enabled = elements.aimbot.auto_tp.enable:get() local mode = elements.aimbot.auto_tp.mode:get() if teleport_enabled then if mode == "Semi automatic teleport" then auto_tp_active = elements.aimbot.auto_tp.auto_discharge and elements.aimbot.auto_tp.auto_discharge:get() elseif mode == "Fully automatic teleport" then auto_tp_active = true end end end local auto_hide_shots_active = false if elements.aimbot.auto_hs.enable:get() then local _, osaa_mode = reference.antiaim.other.on_shot_anti_aim[1]:get_hotkey() if osaa_mode == 0 then auto_hide_shots_active = true end end local dt_ui_active = refs.rage.dt[2] and ui.get(refs.rage.dt[2]) or false local osaa_ui_active = refs.rage.os[2] and ui.get(refs.rage.os[2]) or false local adaptive_hideshot_weapon_active = false if elements.aimbot.auto_hs.enable:get() then local me = entity.get_local_player() if me then local weapon = entity.get_player_weapon(me) if weapon then local weapon_class = entity.get_classname(weapon) local enablers = elements.aimbot.auto_hs.enablers:get() if weapon_class == "CWeaponSSG08" and table_contains(enablers, "Scout") then adaptive_hideshot_weapon_active = true elseif weapon_class == "CWeaponAWP" and table_contains(enablers, "Awp") then adaptive_hideshot_weapon_active = true elseif weapon_class == "CKnife" and table_contains(enablers, "Knife") then adaptive_hideshot_weapon_active = true elseif table_contains({"CWeaponHKP2000", "CWeaponElite", "CWeaponP250", "CWeaponFiveSeven", "CWeaponGlock", "CWeaponTec9"}, weapon_class) and table_contains(enablers, "Pistols") then adaptive_hideshot_weapon_active = true elseif table_contains({"CWeaponG3SG1", "CWeaponSCAR20"}, weapon_class) and table_contains(enablers, "Auto Snipers") then adaptive_hideshot_weapon_active = true elseif weapon_class == "CDEagle" and table_contains(enablers, "Heavy Pistols") then adaptive_hideshot_weapon_active = true elseif table_contains({"CWeaponM4A1", "CWeaponFamas", "CWeaponAug", "CWeaponGalilAR", "CAK47", "CWeaponSG556"}, weapon_class) and table_contains(enablers, "Rifles") then adaptive_hideshot_weapon_active = true end end end end for index, bind in ipairs(self.table.binds) do local name = bind.full_name local ui_active = bind.ref and ui.get(bind.ref) or false if name == 'DT' then is_active = entity.is_alive(me) and ui_active and not (auto_hide_shots_active and adaptive_hideshot_weapon_active) elseif name == 'OSAA' then is_active = entity.is_alive(me) and ( (auto_hide_shots_active and adaptive_hideshot_weapon_active) or (ui_active and not dt_ui_active) ) else is_active = entity.is_alive(me) and (ui_active or (name == 'LC' and (auto_tp.lc_active or auto_tp.auto_teleport_active)) or (name == 'AIR' and auto_air_stop_active) or (name == 'DA' and elements.aimbot.dormant_aimbot.enable:get())) end bind.alpha = render:math_anim2(bind.alpha or 0, is_active and 1 or 0, 8) bind.chars = render:math_anim2(bind.chars or 0, is_active and 1 or 0, 8) local icon = bind.full_icon local clr = {225, 225, 255, 255} if name == 'DT' then icon = dt_active and ' ' or ' ' clr = { dt_active and 225 or 255, 225 * (dt_active and 1 or 0), 225 * (dt_active and 1 or 0), 225 } elseif name == 'OSAA' then local osaa_real_active = (auto_hide_shots_active and adaptive_hideshot_weapon_active) or (bind.ref and ui.get(bind.ref)) icon = osaa_real_active and ' ' or ' ' clr = { osaa_real_active and 225 or 255, 225 * (osaa_real_active and 1 or 0), 225 * (osaa_real_active and 1 or 0), 225 } elseif name == 'DA' then local dormant_color = {255, 255, 255, 225} if elements.aimbot.dormant_aimbot.enable:get() then local function local_get_dormant_players() local players = {} local player_resource = entity.get_player_resource() if not player_resource then return players end for i = 1, globals.maxplayers() do if entity.get_prop(player_resource, "m_bConnected", i) ~= 1 or plist.get(i, "Add to whitelist") then elseif entity.is_dormant(i) and entity.is_enemy(i) then players[#players + 1] = i end end return players end local has_valid_target = false if dormant_targets and type(dormant_targets) == "table" then for target, is_valid in pairs(dormant_targets) do if is_valid then has_valid_target = true break end end end if has_valid_target then dormant_color = {143, 194, 21, 225} else local success, dormant_players = pcall(local_get_dormant_players) if success and type(dormant_players) == "table" then if #dormant_players == 0 then dormant_color = {255, 0, 50, 225} else dormant_color = {255, 255, 255, 225} end end end else dormant_color = {100, 100, 100, 225} end clr = dormant_color elseif name == 'PING' then if ping < 70 then icon = ' ' elseif ping < 100 then icon = ' ' elseif ping < 150 then icon = ' ' elseif ping < 200 then icon = ' ' else icon = ' ' end if ping < 100 then clr[1], clr[2], clr[3] = 255, 0, 0 elseif ping < 150 then clr[1], clr[2], clr[3] = 255, 255, 0 else clr[1], clr[2], clr[3] = 0, 255, 0 end elseif name == 'LC' then icon = ' ' if (auto_tp.lc_active or auto_tp.auto_teleport_active) and not auto_tp.exploit_active then clr = {255, 0, 50, 225} else clr = {225, 225, 225, 225} end end self:text(40, self.y, clr[1], clr[2], clr[3], clr[4] * bind.alpha, clr[1], clr[2], clr[3], clr[4] * bind.alpha, icon, name, bind.chars, bind.alpha ) end end, create = function(self) self:add(' ', 'DA', nil) self:add(' ', 'DT', refs.rage.dt[2]) self:add(' ', 'OSAA', refs.rage.os[2]) self:add(' ', 'MD', refs.rage.ovr[2]) self:add(' ', 'FD', refs.rage.fd[1]) self:add(' ', 'FS', refs.bindfs[1]) self:add(' ', 'BODY', refs.rage.baim[1]) self:add(' ', 'SAFE', refs.rage.safe[1]) self:add(' ', 'PING', refs.ping[1]) self:add(' ', 'LC', nil) self:add(' ', 'AIR', nil) end } indicator:create() client.set_event_callback("paint", function() if elements.visuals.windows:get('Left indicators') then indicator:general() end end) local indicator_callback_registered = false local indicator_callback = function() return false end elements.visuals.windows:set_callback(function() local is_enabled = elements.visuals.windows:get('Left indicators') if is_enabled and not indicator_callback_registered then client.set_event_callback("indicator", indicator_callback) indicator_callback_registered = true elseif not is_enabled and indicator_callback_registered then client.unset_event_callback("indicator", indicator_callback) indicator_callback_registered = false end end) end local damage_indicator = { width = 21, height = 12 }; do local drag = drag_system.new( 'damage_indicator', drag_slider.damage_indicator.x, drag_slider.damage_indicator.y, screen_size_x() / 2 + 5, screen_size_y() / 2 - 10, 'xy', { w = function () return damage_indicator.width end, h = function () return damage_indicator.height end, align_x = 'left', snap_distance = 5, show_guides = true, show_default_dot = true, show_highlight = true, align_center = false, show_center_dot = false } ) local function on_paint_ui () -- 添加游戏状态检查 if not entity.get_local_player() or not entity.is_alive(entity.get_local_player()) then return end local disable = false local menu_open = ui.is_menu_open() local me = entity.get_local_player() if not menu_open and (not me or not entity.is_alive(me)) then disable = true end local enabled = elements.visuals.damage.enable:get() local alpha = lerp('damage_indicator_alpha', enabled and not disable and 255 or 0, 10, 0.001, 'ease_out') if alpha < 1 then return end drag:update(alpha) drag:draw_guides(alpha) local x, y = drag:get_pos() local flag = '' if elements.visuals.damage.settings.font:get() == 'Bold' then flag = 'b' elseif elements.visuals.damage.settings.font:get() == 'Small' then flag = '-' end local hotkey_ref = reference.rage.aimbot.minimum_damage_override[1].value and reference.rage.aimbot.minimum_damage_override[1].hotkey:get() local target_value = hotkey_ref and reference.rage.aimbot.minimum_damage_override[2].value - .1 or reference.rage.aimbot.minimum_damage.value if animations['damage_indicator_prev_override'] ~= hotkey_ref then animations['damage_indicator_prev_override'] = hotkey_ref end local value_animate = math.floor(lerp('damage_indicator_value', target_value, 8, 0.001, 'ease_out') + 0.5) local hotkey_alpha = lerp('damage_indicator_hotkey_alpha', (menu_open or hotkey_ref) and 1 or 0, 10, 0.001, 'ease_out') local measure_damage_w, measure_damage_h = renderer.measure_text(flag, value_animate) damage_indicator.width, damage_indicator.height = measure_damage_w + 3, measure_damage_h renderer.text(x + 1, y - 1, 255, 255, 255, elements.visuals.damage.settings.type:get() == 'On hotkey' and alpha * hotkey_alpha or alpha, flag, nil, value_animate) end elements.visuals.damage.enable:set_event('paint_ui', on_paint_ui) end --- local advert = { width = 100, height = 20 }; do local drag = drag_system.new( 'advert_watermark', drag_slider.advert.x, drag_slider.advert.y, 15, screen_size_y() / 2 - 10, 'xy', { w = function () return advert.width end, h = function () return advert.height end, align_x = 'left', snap_distance = 10, show_guides = true, show_default_dot = true, show_highlight = true, align_center = true, show_center_dot = true } ) local alpha = { value = 255 } local last_toggle_time = 0 local toggle_debounce = 0.3 local hint_alpha = 0 local flag_map = { Default = '', Bold = 'b', Small = '-' } local styles = {'Default', 'Bold', 'Small'} local function get_next_style (current) for i, style in ipairs(styles) do if style == current then return styles[(i % #styles) + 1] end end return styles[1] end local function get_flag () return flag_map[drag_slider.advert.text_style:get()] end local function format_text (flag, text) if flag == '-' then return text:upper() end return text end local function on_paint_ui () -- 添加游戏状态检查,确保只在游戏内显示 if not entity.get_local_player() or not entity.is_alive(entity.get_local_player()) then return end local me = entity.get_local_player() local force_text_enabled = elements.visuals.windows:get('Text brand') local watermark_enabled = elements.visuals.windows:get('Watermark') local crosshair_enabled = elements.visuals.crosshair.enable:get() local player_dead = not entity.is_alive(me) -- 修复逻辑:text brand应该只受自身设置控制 local text_brand_show = force_text_enabled or player_dead local watermark_show = watermark_enabled and not (force_text_enabled or player_dead) -- 分别控制text brand和watermark的alpha值 alpha.value = lerp('advert_watermark', text_brand_show and 255 or 0, 10, 0.001, 'ease_out') if alpha.value == 0 and not watermark_enabled then return end local menu_opened = ui.is_menu_open() local current_time = globals.realtime() local is_rmb_pressed = client.key_state(0x02) local x, y = drag:get_pos() local mx, my = ui.mouse_position() local elem_w, elem_h = advert.width, advert.height local is_hovered = mx >= x and mx <= x + elem_w and my >= y and my <= y + elem_h if menu_opened and is_rmb_pressed and is_hovered and current_time - last_toggle_time >= toggle_debounce then local next_style = get_next_style(drag_slider.advert.text_style:get()) drag_slider.advert.text_style:set(next_style) last_toggle_time = current_time end local text_flag = get_flag() local custom = coloring.parse() local text_content = string.format(' %s %s  %s', lua.name, lua.build, lua.username) local formatted_text = format_text(text_flag, text_content) local width = renderer.measure_text(text_flag, formatted_text) + 8 advert.width = text_flag == '-' and width - 1 or width drag:update(alpha.value) drag:draw_guides(alpha.value) hint_alpha = lerp('hint_alpha', (menu_opened and is_hovered and not drag.dragging and 255 or 0) * alpha.value / 255, 10, 0.001, 'ease_out') if hint_alpha > 1 then local formatted_text_2 = format_text(text_flag, 'Right-click to change text flag') local text_x = text_flag == '-' and x + advert.width / 2 - 1 or x + advert.width / 2 renderer.text(text_x, y + advert.height + 6, 255, 255, 255, hint_alpha, text_flag .. 'c', nil, formatted_text_2) end if colors.combobox:get() == 'Custom' and colors.custom.type:get() == 'Gradient' and colors.custom.select:get('Text brand') then local text_x = text_flag == '-' and x + 2 or x + 4 local icon_text = " " renderer.text(text_x, y + 4, 255, 255, 255, alpha.value, text_flag, nil, icon_text) local icon_width = renderer.measure_text(text_flag, icon_text) local gradient_text = format_text(text_flag, string.format('%s %s', lua.name, lua.build)) draw_gradient_text( text_x + icon_width, y + 4, text_flag, nil, gradient_text, 25, {r = custom.r, g = custom.g, b = custom.b, a = alpha.value}, {r = custom.r3, g = custom.g3, b = custom.b3, a = alpha.value}, {r = custom.r4, g = custom.g4, b = custom.b4, a = alpha.value}, {r = custom.r2, g = custom.g2, b = custom.b2, a = alpha.value} ) local icon_width = renderer.measure_text(text_flag, " ") local gradient_width = renderer.measure_text(text_flag, gradient_text) local total_width = icon_width + gradient_width local username_text = format_text(text_flag, string.format(' %s', lua.username)) local text_x = text_flag == '-' and x + total_width + 3 or x + total_width + 7 renderer.text(text_x, y + 4, 255, 255, 255, alpha.value, text_flag, nil, username_text) else local text_x = text_flag == '-' and x + 2 or x + 4 renderer.text(text_x, y + 4, 255, 255, 255, alpha.value, text_flag, nil, string.format(' \a%s%s\a%s  %s', coloring.rgba_to_hex(custom.r, custom.g, custom.b, alpha.value), format_text(text_flag, lua.name .. ' ' .. lua.build), coloring.rgba_to_hex(255, 255, 255, alpha.value), format_text(text_flag, lua.username))) end end client.set_event_callback('paint_ui', on_paint_ui) end local crosshair = { width = 62, height = 50 }; do local drag_c = drag_system.new( 'crosshair', nil, drag_slider.crosshair.y, screen_size_x() / 2, screen_size_y() / 2 + 40, 'y', { w = function() return crosshair.width end, h = function() return crosshair.height end, align_y = 'center', snap_distance = 10, show_guides = true, show_default_dot = true, show_highlight = true, align_center = true, show_center_dot = true } ) local alpha = { value = 0, unique = 0, simple = 0 } local function get_exploit_text (exploit_type) local states = { dt = { default = {'dt', {255, 255, 255}}, defensive = {'dt defensive', {67, 245, 255}}, recharge = {'dt recharge', {255, 62, 62}}, active = {'dt active', {50, 255, 50}} }, hs = { default = {'hs', {255, 255, 255}}, defensive = {'hs defensive', {67, 245, 255}}, recharge = {'hs recharge', {255, 62, 62}}, active = {'hs active', {50, 255, 50}} } } local exploit_states = states[exploit_type] if not exploit_states then return nil end local is_active = (exploit_type == 'dt' and exploits:is_doubletap()) or (exploit_type == 'hs' and exploits:is_hideshots() and not exploits:is_doubletap()) if is_active then if exploits:in_defensive() then return exploit_states.defensive elseif exploits:in_recharge() or ((exploit_type == 'dt' and exploits:is_doubletap()) and not exploits:can_recharge()) then return exploit_states.recharge else return exploit_states.active end end return exploit_states.default end local function get_current_state () local state = string.lower(builder.get_state()) if reference.antiaim.fakelag.enabled:get() and fakelag.active then state = 'fake lag' elseif reference.antiaim.angles.freestanding[1]:get() and reference.antiaim.angles.freestanding[1].hotkey:get() then state = 'freestanding' end return state end local function get_binds () local doubletap_state = get_exploit_text('dt') local hideshots_state = get_exploit_text('hs') return { {name = 'dt', display = doubletap_state[1], color = doubletap_state[2], ref = exploits:is_doubletap()}, {name = 'hs', display = hideshots_state[1], color = hideshots_state[2], ref = exploits:is_hideshots() and not exploits:is_doubletap()}, {name = 'baim', display = 'baim', color = {255, 255, 255}, ref = reference.rage.aimbot.force_body:get()}, {name = 'safe', display = 'safe', color = {255, 255, 255}, ref = reference.rage.aimbot.force_safe:get()} } end local function get_simple_binds () return { {name = 'dt', display = 'dt', color = {255, 255, 255}, ref = exploits:is_doubletap()}, {name = 'osaa', display = 'osaa', color = {255, 255, 255}, ref = exploits:is_hideshots() and not exploits:is_doubletap()}, {name = 'baim', display = 'baim', color = {255, 255, 255}, ref = reference.rage.aimbot.force_body:get()}, {name = 'safe', display = 'safe', color = {255, 255, 255}, ref = reference.rage.aimbot.force_safe:get()} } end local function render_gradient_text (x, y, flag, max_width, text, size, color1, color2, color3, color4) draw_gradient_text( x, y, flag, max_width, text, size, color1, color2, color3, color4 ) end local function render_bind_text (center_x, y, bind, scope_value, settings_y, alpha_unique, alpha_value, binds_alpha) local _bind_alpha = lerp('crosshair_bind_alpha_' .. bind.name, bind.ref and 1 or 0, 10, 0.001, 'ease_out') local _bind_y = lerp('crosshair_bind_y_' .. bind.name, bind.ref and 12 or 0, 12, 0.07, 'ease_out') local measure_binds = renderer.measure_text('cb', bind.display) / 2 + 3 local target_width = renderer.measure_text('cb', bind.display) + 1 local animated_binds = lerp('crosshair_bind_anim' .. bind.name, bind.ref and target_width or 0, 11, 0.5, 'ease_out') if bind.name == 'dt' or bind.name == 'hs' then local base_text = bind.name local state_text = bind.display:sub(#base_text + 1) local base_width = renderer.measure_text('cb', base_text) local state_width = renderer.measure_text('cb', state_text) renderer.text( center_x - state_width / 2 + 1 + (measure_binds - 1) * scope_value, y + _bind_y + 14 + settings_y, 255, 255, 255, alpha_unique * alpha_value / 255 * binds_alpha * _bind_alpha, 'cb', nil, base_text ) if #state_text > 0 then local animated_binds_2 = lerp('crosshair_bind2_anim' .. bind.name, bind.ref and state_width + 1 or 0, 11, 0.5, 'ease_out') renderer.text( center_x + base_width / 2 + measure_binds * scope_value, y + _bind_y + 14 + settings_y, bind.color[1], bind.color[2], bind.color[3], alpha_unique * alpha_value / 255 * binds_alpha * _bind_alpha, 'cb', animated_binds_2, state_text ) end else renderer.text( center_x + measure_binds * scope_value, y + _bind_y + 14 + settings_y, bind.color[1], bind.color[2], bind.color[3], alpha_unique * alpha_value / 255 * binds_alpha * _bind_alpha, 'cb', animated_binds, bind.display ) end return _bind_y end local function render_simple_bind (center_x, y, bind, scope_value, start_y, alpha_simple, alpha_value, binds_alpha) local _bind_alpha = lerp('crosshair_bind_alpha_simple_' .. bind.name, bind.ref and 1 or 0, 10, 0.001, 'ease_out') local target_width, target_height = renderer.measure_text('c-', bind.display:upper()) local animated_width = lerp('crosshair_bind_anim_simple_' .. bind.name, bind.ref and target_width + 1 or 0, 11, 0.5, 'ease_out') local animated_height = lerp('crosshair_height_anim_simple_' .. bind.name, bind.ref and target_height + 1 or 0, 11, 0.5, 'ease_out') local measure_binds = renderer.measure_text('c-', bind.display:upper()) / 2 + 3 renderer.text( center_x + measure_binds * scope_value, y + start_y, bind.color[1], bind.color[2], bind.color[3], alpha_simple * alpha_value / 255 * binds_alpha * _bind_alpha, 'c-', animated_width, bind.display:upper() ) return animated_height end local function render_unique_crosshair (center_x, y, custom, scope_value, alpha_value, alpha_unique, states_alpha, binds_alpha) local measure_name = renderer.measure_text('cb', lua.name:lower()) / 2 + 3 if colors.combobox:get() == 'Custom' and colors.custom.type:get() == 'Gradient' and colors.custom.select:get('Crosshair') then render_gradient_text( center_x + measure_name * scope_value, y + 14, 'cb', nil, lua.name:lower(), 25, {r = custom.r, g = custom.g, b = custom.b, a = alpha_unique * alpha_value / 255}, {r = custom.r3, g = custom.g3, b = custom.b3, a = alpha_unique * alpha_value / 255}, {r = custom.r4, g = custom.g4, b = custom.b4, a = alpha_unique * alpha_value / 255}, {r = custom.r2, g = custom.g2, b = custom.b2, a = alpha_unique * alpha_value / 255} ) else renderer.text( center_x + measure_name * scope_value, y + 14, custom.r, custom.g, custom.b, alpha_unique * alpha_value / 255, 'cb', nil, lua.name:lower() ) end local settings_add_y = states_alpha > 0 and 12 or 1 if states_alpha > 0 then local state = get_current_state() local measure_state = renderer.measure_text('rb', state) / 2 + 3 local animated_state = lerp('crosshair_state', renderer.measure_text('rb', state) + 1, 7, 1, 'ease_out') renderer.text( center_x + (animated_state / 2) + measure_state * scope_value, y + 20, 255, 255, 255, alpha_unique * alpha_value / 255 * states_alpha, 'rb', animated_state, state ) end if binds_alpha > 0 then local binds = get_binds() local height = 0 for _, bind in ipairs(binds) do height = height + render_bind_text( center_x, y + height, bind, scope_value, settings_add_y, alpha_unique, alpha_value, binds_alpha ) end end end local function render_simple_crosshair (center_x, y, custom, scope_value, inverted_scope_value, alpha_value, alpha_simple, states_alpha, binds_alpha) local measure_name = renderer.measure_text('c', lua.name:lower()) / 2 + 3 local measure_build = renderer.measure_text('c-', lua.build:upper()) / 2 + 3 if colors.combobox:get() == 'Custom' and colors.custom.type:get() == 'Gradient' and colors.custom.select:get('Crosshair') then render_gradient_text( center_x + measure_name * scope_value, y + 16, 'cb', nil, lua.name:lower(), 25, {r = custom.r, g = custom.g, b = custom.b, a = alpha_simple * alpha_value / 255}, {r = custom.r3, g = custom.g3, b = custom.b3, a = alpha_simple * alpha_value / 255}, {r = custom.r4, g = custom.g4, b = custom.b4, a = alpha_simple * alpha_value / 255}, {r = custom.r2, g = custom.g2, b = custom.b2, a = alpha_simple * alpha_value / 255} ) render_gradient_text( center_x + measure_build * scope_value, y + 6, 'c-', nil, lua.build:upper(), 25, {r = custom.r, g = custom.g, b = custom.b, a = alpha_simple * alpha_value / 255 * inverted_scope_value}, {r = custom.r3, g = custom.g3, b = custom.b3, a = alpha_simple * alpha_value / 255 * inverted_scope_value}, {r = custom.r4, g = custom.g4, b = custom.b4, a = alpha_simple * alpha_value / 255 * inverted_scope_value}, {r = custom.r2, g = custom.g2, b = custom.b2, a = alpha_simple * alpha_value / 255 * inverted_scope_value} ) else renderer.text( center_x + measure_name * scope_value, y + 16, custom.r, custom.g, custom.b, alpha_simple * alpha_value / 255, 'cb', nil, lua.name:lower() ) renderer.text( center_x + measure_build * scope_value, y + 6, custom.r, custom.g, custom.b, alpha_simple * alpha_value / 255 * inverted_scope_value, 'c-', nil, lua.build:upper() ) end if states_alpha > 0 then local state = string.upper(get_current_state()) local measure_state = renderer.measure_text('r-', state) / 2 + 3 local animated_state = lerp('crosshair_state_2', renderer.measure_text('r-', state) + 1, 7, 1, 'ease_out') renderer.text( center_x + (animated_state / 2) + measure_state * scope_value, y + 23, 255, 255, 255, alpha_simple * alpha_value / 255 * states_alpha, 'r-', animated_state, state ) end if binds_alpha > 0 then local binds = get_simple_binds() local binds_start_y = states_alpha > 0 and 39 or 28 local height = 0 for _, bind in ipairs(binds) do local bind_height = render_simple_bind( center_x, y, bind, scope_value, binds_start_y + height, alpha_simple, alpha_value, binds_alpha ) height = height + bind_height end end end local function on_paint() local me = entity.get_local_player() alpha.value = lerp('crosshair_global', (elements.visuals.crosshair.enable:get() and entity.is_alive(me)) and 255 or 0, 10, 0.001, 'ease_out') if alpha.value == 0 then return end drag_c:update(alpha.value) drag_c:draw_guides(alpha.value) local x, y = drag_c:get_pos() local screen_x, screen_y = client.screen_size() local center_x = screen_x / 2 local is_scoped = entity.get_prop(me, 'm_bIsScoped') == 1 local custom = coloring.parse() local scope_value = lerp('crosshair_scope', is_scoped and 1 or 0, 10, 0.008, 'ease_out') local inverted_scope_value = lerp('crosshair_inv_scope', is_scoped and 0 or 1, 10, 0.008, 'ease_out') local states_alpha = lerp('crosshair_state_global', elements.visuals.crosshair.settings.select:get('States') and 1 or 0, 10, 0.001, 'ease_out') local binds_alpha = lerp('crosshair_binds_global', elements.visuals.crosshair.settings.select:get('Binds') and 1 or 0, 10, 0.001, 'ease_out') alpha.unique = lerp('crosshair_unique', (elements.visuals.crosshair.settings.type:get() == 'Old') and 255 or 0, 10, 0.001, 'ease_out') alpha.unique = math.ceil(alpha.unique) if alpha.unique > 0 then render_unique_crosshair(center_x, y, custom, scope_value, alpha.value, alpha.unique, states_alpha, binds_alpha) end alpha.simple = lerp('crosshair_simple', (elements.visuals.crosshair.settings.type:get() == 'New') and 255 or 0, 10, 0.001, 'ease_out') alpha.simple = math.ceil(alpha.simple) if alpha.simple > 0 then render_simple_crosshair(center_x, y, custom, scope_value, inverted_scope_value, alpha.value, alpha.simple, states_alpha, binds_alpha) end end elements.visuals.crosshair.enable:set_event('paint', on_paint) end local arrows do local drag_a = drag_system.new( 'arrows', drag_slider.arrows.x, nil, screen_size_x() / 2 + 50, screen_size_y() / 2, 'x', { w = 20, h = 20, align_x = 'center', snap_distance = 10, show_guides = true, show_default_dot = true, show_highlight = true, align_center = false, show_center_dot = false } ) local alpha = { value = 0, unique = 0, simple = 0, teamskeet = 0, semicircle = 0, outline_start_angle = 0, outline_end_angle = 0, sc_arc_start_angle = 0, semicircle_back = 0, semicircle_back_timer = 0, semicircle_back_timeout = 0, semicircle_fade = 1, semicircle_fade_timer = 0 } local function draw_arc(x, y, r, g, b, a, radius, start, end_, percent, thickness) if a == 0 or percent == 0 then return end percent = percent or 1 thickness = thickness or 3 local segments = math.max(16, math.floor(64 * math.abs(end_ - start) * percent + 0.5)) local angle_span = (end_ - start) * 2 * math.pi * percent local angle_step = angle_span / segments local base_angle = start * 2 * math.pi for i = 0, segments - 1 do local angle1 = base_angle + i * angle_step local angle2 = base_angle + (i + 1) * angle_step local x1 = x + math.cos(angle1) * radius local y1 = y + math.sin(angle1) * radius local x2 = x + math.cos(angle2) * radius local y2 = y + math.sin(angle2) * radius local x3 = x + math.cos(angle2) * (radius - thickness) local y3 = y + math.sin(angle2) * (radius - thickness) local x4 = x + math.cos(angle1) * (radius - thickness) local y4 = y + math.sin(angle1) * (radius - thickness) renderer.triangle(x1, y1, x2, y2, x3, y3, r, g, b, a) renderer.triangle(x1, y1, x3, y3, x4, y4, r, g, b, a) end end local function draw_semicircle_indicator(params) local cx, cy = params.cx, params.cy local color = params.color local alpha_val = params.alpha local indicator_radius = params.indicator_radius local indicator_thickness = params.indicator_thickness local crosshair_enabled = params.crosshair_enabled local state = params.state local hide_on_third = params.hide_on_third local scope_animation_2 = params.scope_animation_2 local scope_animation_3 = params.scope_animation_3 local manual_left_active = (state == 'Manual left') local manual_right_active = (state == 'Manual right') local show_back = not manual_left_active and not manual_right_active if show_back then if alpha.semicircle_fade_timer == 0 then alpha.semicircle_fade_timer = globals.realtime() end local elapsed = globals.realtime() - alpha.semicircle_fade_timer if elapsed > 1 then alpha.semicircle_fade = lerp('semicircle_fade', 0, 10, 0.01, 'ease_out') else alpha.semicircle_fade = lerp('semicircle_fade', 1, 10, 0.01, 'ease_out') end else alpha.semicircle_fade_timer = 0 alpha.semicircle_fade = lerp('semicircle_fade', 1, 10, 0.01, 'ease_out') end if alpha.semicircle_fade < 0.01 then return end local semicircle_outline_alpha = scope_animation_2 * hide_on_third * alpha_val * alpha.semicircle_fade local target_outline_start_angle = crosshair_enabled and 0.5 or 0.0 local target_outline_end_angle = crosshair_enabled and 1.0 or 0.5 alpha.outline_start_angle = lerp('outline_start_angle', target_outline_start_angle, 14, 0.002, 'linear') alpha.outline_end_angle = lerp('outline_end_angle', target_outline_end_angle, 14, 0.002, 'linear') renderer.circle_outline(cx, cy, 0, 0, 0, semicircle_outline_alpha, indicator_radius + 1, 0, 0.5, indicator_thickness + 2) draw_arc(cx, cy, 0, 0, 0, semicircle_outline_alpha, indicator_radius + 1, alpha.outline_start_angle, alpha.outline_end_angle, 1, indicator_thickness + 2) if show_back then if alpha.semicircle_back < 1 then alpha.semicircle_back = lerp('semicircle_back_alpha', 1, 10, 0.01, 'ease_out') end if alpha.semicircle_back_timer == 0 then alpha.semicircle_back_timer = globals.realtime() end if globals.realtime() - alpha.semicircle_back_timer > 3 then alpha.semicircle_back = lerp('semicircle_back_alpha', 0, 10, 0.01, 'ease_out') end else alpha.semicircle_back_timer = 0 alpha.semicircle_back = lerp('semicircle_back_alpha', 0, 10, 0.01, 'ease_out') end local arc_alpha = scope_animation_3 * hide_on_third * alpha_val * alpha.semicircle_fade * (manual_left_active and 1 or manual_right_active and 1 or alpha.semicircle_back) if arc_alpha > 0 then local arc_span = 0.15 local target_arc_start_angle if manual_left_active then target_arc_start_angle = crosshair_enabled and 0.505 or 0.34 elseif manual_right_active then target_arc_start_angle = crosshair_enabled and 0.845 or 0.01 else target_arc_start_angle = crosshair_enabled and 0.675 or 0.179 end alpha.sc_arc_start_angle = lerp('sc_arc_start_angle', target_arc_start_angle, 16, 0.002, 'linear') local draw_start_angle = alpha.sc_arc_start_angle local draw_end_angle = draw_start_angle + arc_span draw_arc(cx, cy, color.r, color.g, color.b, arc_alpha, indicator_radius, draw_start_angle, draw_end_angle, 1, indicator_thickness) end end local function on_paint() local me = entity.get_local_player() alpha.value = lerp('arrows_global', (elements.visuals.arrows.enable:get() and entity.is_alive(me)) and 255 or 0, 10, 0.001, 'ease_out') if alpha.value == 0 then return end local screen_x, screen_y = client.screen_size() if elements.visuals.arrows.settings.type:get() == 'Pointers' then drag_a:update(alpha.value) drag_a:draw_guides(alpha.value) end local x, y = drag_a:get_pos() local is_scoped = entity.get_prop(me, 'm_bIsScoped') == 1 local custom = coloring.parse() local state = builder.get_state() local left_alpha = lerp('arrows_left_alpha', (state == 'Manual left' or ui.is_menu_open()) and 1 or 0, 10, 0.001, 'ease_out') local right_alpha = lerp('arrows_right_alpha', (state == 'Manual right' or ui.is_menu_open()) and 1 or 0, 10, 0.001, 'ease_out') local scope_animation = lerp('arrows_scope', is_scoped and 1 or 0, 10, 0.008, 'ease_out') if elements.visuals.arrows.settings.type:get() == 'Pointers' then alpha.unique = lerp('arrows_unique', (elements.visuals.arrows.settings.style:get() == '*1') and 255 or 0, 10, 0.001, 'ease_out') alpha.unique = math.ceil(alpha.unique) if alpha.unique > 0 then if colors.combobox:get() == 'Custom' and colors.custom.type:get() == 'Gradient' and colors.custom.select:get('Arrows') then local color = prepare_gradient_cache(25, {r = custom.r, g = custom.g, b = custom.b, a = alpha.value}, {r = custom.r3, g = custom.g3, b = custom.b3, a = alpha.value}, {r = custom.r4, g = custom.g4, b = custom.b4, a = alpha.value}, {r = custom.r2, g = custom.g2, b = custom.b2, a = alpha.value}, false ) renderer.text(screen_x - x - 14 - (20 * scope_animation), screen_y / 2 - 4, color.r, color.g, color.b, alpha.unique * alpha.value / 255 * left_alpha, 'c+', nil, '⮜') renderer.text(x + 10 + (20 * scope_animation), screen_y / 2 - 4, color.r, color.g, color.b, alpha.unique * alpha.value / 255 * right_alpha, 'c+', nil, '⮞') else renderer.text(screen_x - x - 14 - (20 * scope_animation), screen_y / 2 - 4, custom.r, custom.g, custom.b, alpha.unique * alpha.value / 255 * left_alpha, 'c+', nil, '⮜') renderer.text(x + 10 + (20 * scope_animation), screen_y / 2 - 4, custom.r, custom.g, custom.b, alpha.unique * alpha.value / 255 * right_alpha, 'c+', nil, '⮞') end end alpha.simple = lerp('arrows_simple', (elements.visuals.arrows.settings.style:get() == '*2') and 255 or 0, 10, 0.001, 'ease_out') alpha.simple = math.ceil(alpha.simple) if alpha.simple > 0 then if colors.combobox:get() == 'Custom' and colors.custom.type:get() == 'Gradient' and colors.custom.select:get('Arrows') then local color = prepare_gradient_cache(25, {r = custom.r, g = custom.g, b = custom.b, a = alpha.value}, {r = custom.r3, g = custom.g3, b = custom.b3, a = alpha.value}, {r = custom.r4, g = custom.g4, b = custom.b4, a = alpha.value}, {r = custom.r2, g = custom.g2, b = custom.b2, a = alpha.value}, false ) renderer.text(screen_x - x - 14 - (20 * scope_animation), screen_y / 2 - 2, color.r, color.g, color.b, alpha.simple * alpha.value / 255 * left_alpha, 'c+', nil, '<') renderer.text(x + 10 + (20 * scope_animation), screen_y / 2 - 2, color.r, color.g, color.b, alpha.simple * alpha.value / 255 * right_alpha, 'c+', nil, '>') else renderer.text(screen_x - x - 14 - (20 * scope_animation), screen_y / 2 - 2, custom.r, custom.g, custom.b, alpha.simple * alpha.value / 255 * left_alpha, 'c+', nil, '<') renderer.text(x + 10 + (20 * scope_animation), screen_y / 2 - 2, custom.r, custom.g, custom.b, alpha.simple * alpha.value / 255 * right_alpha, 'c+', nil, '>') end end alpha.teamskeet = lerp('arrows_teamskeet', (elements.visuals.arrows.settings.style:get() == '*3') and 255 or 0, 10, 0.001, 'ease_out') alpha.teamskeet = math.ceil(alpha.teamskeet) if alpha.teamskeet > 0 then local final_alpha_left = alpha.teamskeet * alpha.value / 255 * left_alpha local final_alpha_right = alpha.teamskeet * alpha.value / 255 * right_alpha renderer.text(screen_x - x - 14 - (20 * scope_animation), screen_y / 2 - 4, 0, 0, 0, 55 * alpha.teamskeet / 255 * alpha.value / 255, 'c+', nil, '◀') renderer.text(x + 10 + (20 * scope_animation), screen_y / 2 - 4, 0, 0, 0, 55 * alpha.teamskeet / 255 * alpha.value / 255, 'c+', nil, '▶') if colors.combobox:get() == 'Custom' and colors.custom.type:get() == 'Gradient' and colors.custom.select:get('Arrows') then local color = prepare_gradient_cache(25, {r = custom.r, g = custom.g, b = custom.b, a = alpha.value}, {r = custom.r3, g = custom.g3, b = custom.b3, a = alpha.value}, {r = custom.r4, g = custom.g4, b = custom.b4, a = alpha.value}, {r = custom.r2, g = custom.g2, b = custom.b2, a = alpha.value}, false ) renderer.text(screen_x - x - 14 - (20 * scope_animation), screen_y / 2 - 4, color.r, color.g, color.b, final_alpha_left, 'c+', nil, '◀') renderer.text(x + 10 + (20 * scope_animation), screen_y / 2 - 4, color.r, color.g, color.b, final_alpha_right, 'c+', nil, '▶') else renderer.text(screen_x - x - 14 - (20 * scope_animation), screen_y / 2 - 4, custom.r, custom.g, custom.b, final_alpha_left, 'c+', nil, '◀') renderer.text(x + 10 + (20 * scope_animation), screen_y / 2 - 4, custom.r, custom.g, custom.b, final_alpha_right, 'c+', nil, '▶') end end else alpha.semicircle = lerp('arrows_semicircle', (elements.visuals.arrows.settings.type:get() == 'Semicircle') and 255 or 0, 10, 0.001, 'ease_out') alpha.semicircle = math.ceil(alpha.semicircle) if alpha.semicircle > 0 then local crosshair_enabled = elements.visuals.crosshair.enable:get() local sc_cx = screen_x / 2 + 1 local sc_cy = screen_y / 2 + (crosshair_enabled and -2 or 2) local indicator_radius = 27 local indicator_thickness = 3 local scope_animation_2 = lerp('arrows_semicircle_2', is_scoped and 25 or 85, 10, 0.008, 'ease_out') local scope_animation_3 = lerp('arrows_semicircle_3', is_scoped and 100 or 255, 10, 0.008, 'ease_out') local hide_on_third = lerp('arrows_semicircle_hide', elements.visuals.arrows.settings.hide_on_thirdperson:get() and reference.visuals.thirdperson:get() and reference.visuals.thirdperson.hotkey:get() and 0 or 1, 10, 0.008, 'ease_out') local color = custom if colors.combobox:get() == 'Custom' and colors.custom.type:get() == 'Gradient' and colors.custom.select:get('Arrows') then color = prepare_gradient_cache(25, {r = custom.r, g = custom.g, b = custom.b, a = alpha.value}, {r = custom.r3, g = custom.g3, b = custom.b3, a = alpha.value}, {r = custom.r4, g = custom.g4, b = custom.b4, a = alpha.value}, {r = custom.r2, g = custom.g2, b = custom.b2, a = alpha.value}, false ) end draw_semicircle_indicator{ cx = sc_cx, cy = sc_cy, color = color, alpha = alpha.value / 255 * alpha.semicircle / 255, indicator_radius = indicator_radius, indicator_thickness = indicator_thickness, crosshair_enabled = crosshair_enabled, state = state, hide_on_third = hide_on_third, scope_animation_2 = scope_animation_2, scope_animation_3 = scope_animation_3 } end end end elements.visuals.arrows.enable:set_event('paint', on_paint) end local scope do local on_paint_ui = function () reference.visuals.scope:override(true) end elements.visuals.scope.enable:set_event('paint_ui', on_paint_ui) local function on_paint () if not elements.visuals.scope.enable:get() then reference.visuals.scope:override() return end local me = entity.get_local_player() if not me or not entity.is_alive(me) then return end local weapon = entity.get_player_weapon(me) if weapon == nil then return end reference.visuals.scope:override(false) local scope_level = entity.get_prop(weapon, 'm_zoomLevel') local scoped = entity.get_prop(me, 'm_bIsScoped') == 1 local resume_zoom = entity.get_prop(me, 'm_bResumeZoom') == 1 local is_valid = scope_level ~= nil local act = is_valid and scope_level > 0 and scoped and not resume_zoom local alpha = lerp('custom_scope', act and 255 or 0, 4, 0.001, 'ease_out') local x, y = client.screen_size() local custom = coloring.parse() local gap = elements.visuals.scope.settings.gap:get() local length = elements.visuals.scope.settings.size:get() local inverted = elements.visuals.scope.settings.invert:get() local r, g, b = custom.r, custom.g, custom.b if colors.combobox:get() == 'Custom' and colors.custom.type:get() == 'Gradient' and colors.custom.select:get('Scope') then local color = prepare_gradient_cache(25, {r = custom.r, g = custom.g, b = custom.b, a = alpha}, {r = custom.r3, g = custom.g3, b = custom.b3, a = alpha}, {r = custom.r4, g = custom.g4, b = custom.b4, a = alpha}, {r = custom.r2, g = custom.g2, b = custom.b2, a = alpha}, false ) r, g, b = color.r, color.g, color.b end x, y = x / 2, y / 2 if not elements.visuals.scope.settings.exclude:get('Left') then renderer.gradient(x - gap, y, -length * (alpha / 255), 1, r, g, b, inverted and 0 or alpha, r, g, b, inverted and alpha or 0, true) end if not elements.visuals.scope.settings.exclude:get('Right') then renderer.gradient(x + gap, y, length * (alpha / 255), 1, r, g, b, inverted and 0 or alpha, r, g, b, inverted and alpha or 0, true) end if not elements.visuals.scope.settings.exclude:get('Top') then renderer.gradient(x, y - gap, 1, -length * (alpha / 255), r, g, b, inverted and 0 or alpha, r, g, b, inverted and alpha or 0, false) end if not elements.visuals.scope.settings.exclude:get('Bottom') then renderer.gradient(x, y + gap, 1, length * (alpha / 255), r, g, b, inverted and 0 or alpha, r, g, b, inverted and alpha or 0, false) end end elements.visuals.scope.enable:set_event('paint', on_paint) end --- local viewmodel_in_scope do local function viewmodel_in_scope_callback() if not elements.visuals.viewmodel_in_scope.enable:get() then client.set_cvar('fov_cs_debug', 0) return end client.set_cvar('fov_cs_debug', 90) end elements.visuals.viewmodel_in_scope.enable:set_callback(viewmodel_in_scope_callback) viewmodel_in_scope_callback() end local camera_animation do local function clamp(x, min, max) if x < min then return min elseif max < x then return max else return x end end local function lerp1(a, b, t) return (b - a) * t + a end local function lerp2(a, b, speed) speed = speed or 0.005 speed = clamp(globals.frametime() * speed * 175, 0.01, 1) local result = lerp1(a, b, speed) if b == 0 and result < 0.01 and result > -0.01 then result = 0 elseif b == 1 and result < 1.01 and result > 0.99 then result = 1 end return result end local anim_system = {base_speed = 0.095, list = {}} function anim_system.new(name, target, speed, initial) speed = speed or anim_system.base_speed anim_system.list[name] = anim_system.list[name] or initial or 0 anim_system.list[name] = lerp2(anim_system.list[name], target, speed) return anim_system.list[name] end local function on_override_view(e) if not elements.visuals.cam.enable:get() then return end local local_player = entity.get_local_player() if local_player then local player_origin = {entity.get_origin(local_player)} local camera_origin = {e.x, e.y, e.z} local dx = player_origin[1] - camera_origin[1] local dy = player_origin[2] - camera_origin[2] local dz = player_origin[3] - camera_origin[3] local distance = math.sqrt(dx*dx + dy*dy + dz*dz) if distance > 100 then e.x = anim_system.new("anim_x", e.x, 0.07) e.y = anim_system.new("anim_y", e.y, 0.07) e.z = anim_system.new("anim_z", e.z, 0.07) end end end elements.visuals.cam.enable:set_event('override_view', on_override_view) end local zoom_animation do local function on_override_view (e) if not elements.visuals.zoom.enable:get() then reference.misc.miscellaneous.override_zoom_fov:override() return end reference.misc.miscellaneous.override_zoom_fov:override(0) local me = entity.get_local_player() if not me or not entity.is_alive(me) then return end local fov, speed = elements.visuals.zoom.settings.value:get(), elements.visuals.zoom.settings.speed:get() local is_scoped = entity.get_prop(me, 'm_bIsScoped') == 1 local animate = lerp('zoom', is_scoped and fov or 0, speed / 10, 0.001, 'ease_out') e.fov = e.fov - animate end elements.visuals.zoom.enable:set_event('override_view', on_override_view) end local aspect_ratio do local alpha = 0 local function on_paint () alpha = lerp('aspect_ratio_alpha', elements.visuals.aspect_ratio.enable:get() and 255 or 0, 16, 0.001, 'ease_out') if alpha == 0 then cvar.r_aspectratio:set_int(0) return end local x, y = client.screen_size() local init = x / y local value = elements.visuals.aspect_ratio.settings.value:get() local animate = lerp('aspect_ratio_animate', elements.visuals.aspect_ratio.enable:get() and value * .01 or init, 8, 0.001, 'ease_out') if animate == init then cvar.r_aspectratio:set_int(0) return end cvar.r_aspectratio:set_float(animate) end elements.visuals.aspect_ratio.enable:set_event('paint', on_paint) -- 添加一个清理函数,在功能禁用时重置为默认值 local function on_disable() if not elements.visuals.aspect_ratio.enable:get() then cvar.r_aspectratio:set_int(0) end end elements.visuals.aspect_ratio.enable:set_callback(on_disable) end local viewmodel = { fov = 0, x = 0, y = 0, z = 0 }; do local alpha = 0 local function on_paint () alpha = lerp('viewmodel_alpha', elements.visuals.viewmodel.enable:get() and 255 or 0, 16, 0.001, 'ease_out') if alpha == 0 then return end if elements.visuals.viewmodel.enable:get() then viewmodel.fov = lerp('viewmodel_fov', elements.visuals.viewmodel.settings.fov:get(), 8, 0.001, 'ease_out') viewmodel.x = lerp('viewmodel_x', elements.visuals.viewmodel.settings.x:get() / 10, 8, 0.001, 'ease_out') viewmodel.y = lerp('viewmodel_y', elements.visuals.viewmodel.settings.y:get() / 10, 8, 0.001, 'ease_out') viewmodel.z = lerp('viewmodel_z', elements.visuals.viewmodel.settings.z:get() / 10, 8, 0.001, 'ease_out') else viewmodel.fov = lerp('viewmodel_fov', 68, 8, 0.001, 'ease_out') viewmodel.x = lerp('viewmodel_x', 2.5, 8, 0.001, 'ease_out') viewmodel.y = lerp('viewmodel_y', 0, 8, 0.001, 'ease_out') viewmodel.z = lerp('viewmodel_z', -1.5, 8, 0.001, 'ease_out') end cvar.viewmodel_fov:set_raw_float(viewmodel.fov) cvar.viewmodel_offset_x:set_raw_float(viewmodel.x) cvar.viewmodel_offset_y:set_raw_float(viewmodel.y) cvar.viewmodel_offset_z:set_raw_float(viewmodel.z) end elements.visuals.viewmodel.enable:set_event('paint', on_paint) -- 添加一个清理函数,在功能禁用时重置为默认值 local function on_disable() if not elements.visuals.viewmodel.enable:get() then cvar.viewmodel_fov:set_raw_float(68) cvar.viewmodel_offset_x:set_raw_float(2.5) cvar.viewmodel_offset_y:set_raw_float(0) cvar.viewmodel_offset_z:set_raw_float(-1.5) end end elements.visuals.viewmodel.enable:set_callback(on_disable) end local markers = { hits = { }, misses = { }, damages = { }, positions = { } }; do local function on_aim_fire (e) if not elements.visuals.markers.enable:get() then return end markers.positions[e.id] = { e.x, e.y, e.z } end local function on_aim_hit (e) if not elements.visuals.markers.enable:get() then return end local position = markers.positions[e.id] if position then table.insert(markers.hits, { time = globals.curtime(), position = position }) markers.positions[e.id] = nil end end local function on_aim_miss (e) if not elements.visuals.markers.enable:get() then return end local position = markers.positions[e.id] if position then local red = { 255, 0, 50 } local yellow = { 255, 205, 0 } e.reason = e.reason == '?' and 'resolver' or e.reason table.insert(markers.misses, { time = globals.curtime(), position = position, reason = e.reason, color = (e.reason == 'spread' or e.reason == 'prediction error') and yellow or red }) markers.positions[e.id] = nil end end local function on_player_hurt (e) if not elements.visuals.markers.enable:get() then return end local attacker = client.userid_to_entindex(e.attacker) local victim = client.userid_to_entindex(e.userid) if attacker == entity.get_local_player() and victim ~= attacker then table.insert(markers.damages, { time = globals.curtime(), position = { entity.get_prop(victim, 'm_vecOrigin') }, damage = e.dmg_health, offset = 0 }) end end local function on_paint () if not elements.visuals.markers.enable:get() then return end if elements.visuals.markers.settings.type:get('On hit') then for i = #markers.hits, 1, -1 do local hit = markers.hits[i] local alpha = 255 - (globals.curtime() - hit.time) * 255 / 2 if alpha > 0 then local x, y = renderer.world_to_screen(hit.position[1], hit.position[2], hit.position[3]) if x and y then local size = 4 renderer.line(x - size, y - size, x + size, y + size, 255, 255, 255, alpha) renderer.line(x + size, y - size, x - size, y + size, 255, 255, 255, alpha) end else table.remove(markers.hits, i) end end end if elements.visuals.markers.settings.type:get('On miss') then for i = #markers.misses, 1, -1 do local miss = markers.misses[i] local alpha = 255 - (globals.curtime() - miss.time) * 255 / 2 if alpha > 0 then local x, y = renderer.world_to_screen(miss.position[1], miss.position[2], miss.position[3]) if x and y then local size = 4 renderer.line(x - size, y - size, x + size, y + size, miss.color[1], miss.color[2], miss.color[3], alpha) renderer.line(x + size, y - size, x - size, y + size, miss.color[1], miss.color[2], miss.color[3], alpha) renderer.text(x + 10, y - 7, miss.color[1], miss.color[2], miss.color[3], alpha, 'b', 0, miss.reason) end else table.remove(markers.misses, i) end end end if elements.visuals.markers.settings.type:get('Damage') then for i = #markers.damages, 1, -1 do local damage = markers.damages[i] local alpha = 255 - (globals.curtime() - damage.time) * 255 / 2 if alpha > 0 then damage.offset = damage.offset + 0.2 local x, y = renderer.world_to_screen(damage.position[1], damage.position[2], damage.position[3] + damage.offset) if x and y then renderer.text(x, y, 200, 255, 175, alpha, 'b', 0, '✓ ' .. damage.damage) end else table.remove(markers.damages, i) end end end end local function reset () if not elements.visuals.markers.enable:get() then return end markers = { hits = { }, misses = { }, damages = { }, positions = { } } end client.set_event_callback('aim_fire', on_aim_fire) client.set_event_callback('aim_hit', on_aim_hit) client.set_event_callback('player_hurt', on_player_hurt) client.set_event_callback('aim_miss', on_aim_miss) client.set_event_callback('paint', on_paint) client.set_event_callback('post_config_load', reset) client.set_event_callback('on_round_start', reset) client.set_event_callback('on_round_end', reset) end --- local enemy_chat_viewer do local last_chat_message = { } local function on_player_say (e) if not elements.misc.enemy_chat_viewer:get() then return end local sender = client.userid_to_entindex(e.userid) if not entity.is_enemy(sender) then return end if panorama.open().GameStateAPI.IsSelectedPlayerMuted(panorama.open().GameStateAPI.GetPlayerXuidStringFromEntIndex(sender)) then return end client.delay_call(0.2, function () if last_chat_message[sender] ~= nil and math.abs(globals.realtime() - last_chat_message[sender]) < 0.4 then return end local enemy_team_name = entity.get_prop(entity.get_player_resource(), 'm_iTeam', sender) == 2 and 'T' or 'CT' local place_name = entity.get_prop(sender, 'm_szLastPlaceName') local enemy_name = entity.get_player_name(sender) local l = ('Cstrike_Chat_%s_%s'):format(enemy_team_name, entity.is_alive(sender) and 'Loc' or 'Dead') local msg = localize(l, { s1 = enemy_name, s2 = e.text, s3 = localize(place_name ~= '' and place_name or 'UI_Unknown') }) chat.print_player(sender, msg) end) end local function on_player_chat (e) if not elements.misc.enemy_chat_viewer:get() and not entity.is_enemy(e.entity) then return end last_chat_message[e.entity] = globals.realtime() end client.set_event_callback('player_say', on_player_say) client.set_event_callback('player_chat', on_player_chat) end local edge_quick_stop do local function is_about_to_fall (player) local origin = vector(entity.get_origin(player)) local vel = {entity.get_prop(player, 'm_vecVelocity')} local velocity = vector(vel[1] or 0, vel[2] or 0, 0) local speed = velocity:length2d() if speed < 5 then return false end local move_yaw = math.deg(math.atan2(velocity.y, velocity.x)) local yaw_rad = math.rad(move_yaw) local forward = vector(math.cos(yaw_rad), math.sin(yaw_rad), 0) local check_dist = 18 local down_dist = 36 local min_drop = 16 local offsets = {0, 10, -10} for _, side in ipairs(offsets) do local side_vec = vector(-math.sin(yaw_rad), math.cos(yaw_rad), 0) * side local check_pos = origin + forward * check_dist + side_vec local start_pos = vector(check_pos.x, check_pos.y, origin.z) local end_pos = vector(check_pos.x, check_pos.y, origin.z - down_dist) local fraction, ent_hit, end_x, end_y, end_z = client.trace_line(player, start_pos.x, start_pos.y, start_pos.z, end_pos.x, end_pos.y, end_pos.z) if fraction >= 0.99 then return true elseif fraction > 0 then local hit_z = start_pos.z - (down_dist * fraction) if (start_pos.z - hit_z) > min_drop then return true end end end return false end local function on_setup_command (e) if not elements.misc.edge_quick_stop:get() or not elements.misc.edge_quick_stop.hotkey:get() then return end local player = entity.get_local_player() if not player or not entity.is_alive(player) then return end if not is_on_ground then return end local vel = {entity.get_prop(player, 'm_vecVelocity')} local velocity = vector(vel[1] or 0, vel[2] or 0, 0) if is_about_to_fall(player) then local move_yaw = math.deg(math.atan2(velocity.y, velocity.x)) local move_dir = math.rad(move_yaw) local forwardmove = e.forwardmove or 0 local sidemove = e.sidemove or 0 local move_vec = vector( math.cos(move_dir) * forwardmove - math.sin(move_dir) * sidemove, math.sin(move_dir) * forwardmove + math.cos(move_dir) * sidemove, 0 ) if move_vec:length2d() > 0 and (move_vec.x * velocity.x + move_vec.y * velocity.y) > 0 then e.forwardmove = 0 e.sidemove = 0 end end end client.set_event_callback('setup_command', on_setup_command) end local duck_peek_assist_fix do local hotkey_modes = { [0] = 'Always on', [1] = 'On hotkey', [2] = 'Toggle', [3] = 'Off hotkey' } local saved_hotkey = nil local is_altered = false local function extract_hotkey (ref) local data = { ref:get() } if ref:get_type() == 'hotkey' then return { hotkey_modes[data[2]] or 'Off hotkey', data[3] } end return data end local function on_setup_command (e) if not elements.misc.fd_fix:get() then return end local player = entity.get_local_player() if not player or not entity.is_alive(player) then return end local duck_active = e.in_duck == 1 and entity.get_prop(player, 'm_flDuckAmount') > 0.8 local enabled, current_mode = reference.rage.other.fake_duck:get() if enabled == nil or current_mode == nil then return end if duck_active and enabled and not is_altered then saved_hotkey = extract_hotkey(reference.rage.other.fake_duck) local target_mode = (current_mode == 2 or current_mode == 3) and 'On hotkey' or 'Off hotkey' reference.rage.other.fake_duck:set(target_mode) is_altered = true elseif not duck_active and is_altered and saved_hotkey then reference.rage.other.fake_duck:set(table.unpack(saved_hotkey)) saved_hotkey = nil is_altered = false end end client.set_event_callback('setup_command', on_setup_command) end local drop_nades do local nades_list = { ['HE Grenade'] = 'weapon_hegrenade', Molotov = 'weapon_molotov', Incendiary = 'weapon_incgrenade', Smoke = 'weapon_smokegrenade' } local key_click_cache = false local function on_paint () if not elements.misc.drop_nades.enable:get() then return end local me = entity.get_local_player() if not me or not entity.is_alive(me) then return end local weapons = { } for i = 0, 64 do local weapon = entity.get_prop(me, 'm_hMyWeapons', i) if weapon and weapon ~= 0 then local weapon_name = entity.get_classname(weapon) if not weapon_name then return end weapons[weapon_name] = true end end local selected_nades = { } for grenade_type, grenade_name in pairs(nades_list) do local g_class = grenade_type if g_class == 'HE Grenade' then g_class = 'HE' end local grenade_class = 'C' .. g_class .. 'Grenade' if weapons[grenade_class] and elements.misc.drop_nades.settings.list:get(grenade_type) then table.insert(selected_nades, grenade_name) end end local drop_key = elements.misc.drop_nades.enable.hotkey:get() if drop_key and not key_click_cache then for index, grenade in ipairs(selected_nades) do local delay = 0.1 * index client.delay_call(delay, function () client.exec('use ' .. grenade) client.delay_call(0.05, function () client.exec('drop') end) end) end end key_click_cache = drop_key end client.set_event_callback('paint', on_paint) end local auto_buy do local prices = { ['AWP'] = 4750, ['SCAR-20/G3SG1'] = 5000, ['SSG-08'] = 1700, ['Five-SeveN/Tec-9'] = 500, ['P250'] = 300, ['Deagle/R8'] = 700, ['Duals'] = 400, ['HE Grenade'] = 300, ['Molotov'] = 600, ['Smoke'] = 300, ['Kevlar'] = 650, ['Helmet'] = 1000, ['Taser'] = 200, ['Defuse Kit'] = 400 } local commands = { ['AWP'] = 'buy awp', ['SCAR-20/G3SG1'] = 'buy scar20', ['SSG-08'] = 'buy ssg08', ['Five-SeveN/Tec-9'] = 'buy tec9', ['P250'] = 'buy p250', ['Deagle/R8'] = 'buy deagle', ['Duals'] = 'buy elite', ['HE Grenade'] = 'buy hegrenade', ['Molotov'] = 'buy molotov', ['Smoke'] = 'buy smokegrenade', ['Kevlar'] = 'buy vest', ['Helmet'] = 'buy vesthelm', ['Taser'] = 'buy taser', ['Defuse Kit'] = 'buy defuser' } local function get_weapon_prices () local total_price = 0 local utility_purchase = elements.misc.autobuy.settings.utilities:get() for i = 1, #utility_purchase do local n = utility_purchase[i] for k, v in pairs(prices) do if k == n then total_price = total_price + v end end end for k, v in pairs(prices) do if k == elements.misc.autobuy.settings.pistol:get() then total_price = total_price + v end end for k, v in pairs(prices) do if k == elements.misc.autobuy.settings.sniper:get() then total_price = total_price + v end end local grenade_purchase = elements.misc.autobuy.settings.grenades:get() for i = 1, #grenade_purchase do local n = grenade_purchase[i] for k, v in pairs(prices) do if k == n then total_price = total_price + v end end end return total_price end local function on_round_prestart (e) if not elements.misc.autobuy.enable:get() then return end local price_threshold = get_weapon_prices() local money = entity.get_prop(entity.get_local_player(), 'm_iAccount') if money <= price_threshold then return end local utility_purchase = elements.misc.autobuy.settings.utilities:get() for i = 1, #utility_purchase do local n = utility_purchase[i] for k, v in pairs(commands) do if k == n then client.exec(v) end end end for k, v in pairs(commands) do if k == elements.misc.autobuy.settings.pistol:get() then client.exec(v) end end for k, v in pairs(commands) do if k == elements.misc.autobuy.settings.sniper:get() then client.exec(v) end end local grenade_purchase = elements.misc.autobuy.settings.grenades:get() for i = 1, #grenade_purchase do local n = grenade_purchase[i] for k, v in pairs(commands) do if k == n then client.exec(v) end end end end local function on_player_spawn(e) if not elements.misc.autobuy.enable:get() then return end local local_player = entity.get_local_player() local spawned_player = client.userid_to_entindex(e.userid) if local_player ~= spawned_player then return end local game_rules = entity.get_all('CCSGameRulesProxy')[1] if game_rules and entity.get_prop(game_rules, 'm_bWarmupPeriod') == 1 then client.delay_call(0.1, function() on_round_prestart() end) end end client.set_event_callback('round_prestart', on_round_prestart) client.set_event_callback('player_spawn', on_player_spawn) end local animations do local native_GetClientEntity = vtable_bind('client.dll', 'VClientEntityList003', 3, 'void*(__thiscall*)(void*, int)') local char_ptr = ffi.typeof('char*') local nullptr = ffi.new('void*') local class_ptr = ffi.typeof('void***') local animation_layer_t = ffi.typeof([[struct { char pad0[0x18]; uint32_t sequence; float prev_cycle, weight, weight_delta_rate, playback_rate, cycle; void *entity; char pad1[0x4]; } **]]) local command_number = 0 local function on_run_command (e) command_number = e.command_number end client.set_event_callback('run_command', on_run_command) local function on_pre_render () if elements.anti_aim.exploits.exploit.enable:get() then local local_player = c_entity.get_local_player() if local_player then local anim_layer = local_player:get_anim_overlay(0) if anim_layer then local option = elements.anti_aim.exploits.exploit.options:get() if option == 'Fake up \abf3939FF(180)' then anim_layer.sequence = 265 elseif option == 'Fake zero \abf3939FF(1080)' then anim_layer.sequence = 11 elseif option == 'Fake down \abf3939FF(-180)' then anim_layer.sequence = 87 elseif option == 'Fake down \abf3939FF(-540)' then anim_layer.sequence = 217 else anim_layer.sequence = 0 end end end end if not elements.misc.animations.enable:get() then return end local me = entity.get_local_player() if not me or not entity.is_alive(me) then return end local player_ptr = ffi.cast(class_ptr, native_GetClientEntity(me)) if player_ptr == nullptr then return end local first_velocity, second_velocity = entity.get_prop(me, 'm_vecVelocity') local speed = math.floor(math.sqrt(first_velocity^2 + second_velocity^2)) local anim_layers = ffi.cast(animation_layer_t, ffi.cast(char_ptr, player_ptr) + 0x2990)[0] local anim_type, anim_extra_type, anim_jitter_min, anim_jitter_max, body_lean_value = false, elements.misc.animations.settings.running.anim_extra_type, false, false, 0 if is_on_ground then anim_type = elements.misc.animations.settings.running.anim_type:get() anim_extra_type = elements.misc.animations.settings.running.anim_extra_type anim_jitter_min = elements.misc.animations.settings.running.anim_min_jitter:get() * 0.01 anim_jitter_max = elements.misc.animations.settings.running.anim_max_jitter:get() * 0.01 body_lean_value = elements.misc.animations.settings.running.anim_bodylean:get() elseif not is_on_ground then anim_type = elements.misc.animations.settings.in_air.anim_type:get() anim_extra_type = elements.misc.animations.settings.in_air.anim_extra_type anim_jitter_min = elements.misc.animations.settings.in_air.anim_min_jitter:get() * 0.01 anim_jitter_max = elements.misc.animations.settings.in_air.anim_max_jitter:get() * 0.01 body_lean_value = elements.misc.animations.settings.in_air.anim_bodylean:get() end local is_lagging = globals.realtime() / 2 % 1 if anim_type == 'Allah' then entity.set_prop(me, 'm_flPoseParameter', 1, is_on_ground and 7 or 6) if not is_on_ground then anim_layers[6].weight, anim_layers[6].cycle = 1, is_lagging end reference.antiaim.other.leg_movement:override('never slide') elseif anim_type == 'Static' then entity.set_prop(me, 'm_flPoseParameter', 1, is_on_ground and 0 or 6) reference.antiaim.other.leg_movement:override('always slide') elseif anim_type == 'Jitter' then entity.set_prop(me, 'm_flPoseParameter', client.random_float(anim_jitter_min, anim_jitter_max), is_on_ground and 7 or 6) reference.antiaim.other.leg_movement:override('never slide') elseif anim_type == 'Alien' then reference.antiaim.other.leg_movement:override('never slide') entity.set_prop(me, 'm_flPoseParameter', 0, 7) anim_layers[6].weight = math.random(0.8, 1.8) elseif elements.misc.animations.settings.running.anim_type:get() == 'Alternative jitter' then reference.antiaim.other.leg_movement:override(command_number % 3 == 0 and 'off' or 'always slide') entity.set_prop(me, 'm_flPoseParameter', 1, globals.tickcount() % 4 > 1 and 0.5 or 1) if is_on_ground then entity.set_prop(me, 'm_flPoseParameter', client.random_float(0.4, 0.8), 7) end else reference.antiaim.other.leg_movement:override('off') end if anim_extra_type:get('Body lean') then anim_layers[12].weight = body_lean_value / 100 end if elements.misc.animations.settings.in_air.anim_extra_type:get('Zero pitch on landing') then if ticks > 24 and ticks < 550 then entity.set_prop(me, 'm_flPoseParameter', 0.5, 12) end end end client.set_event_callback('pre_render', on_pre_render) end local clan_tag_spammer do local clan_tag_prev = '' local enabled_prev = false local sequence = { ' ', '• ', '• U ', '• Ul ', '• Ult ', '• Ulth ', '• Ulthe ', '• Ulther ', '• Ulthera ', '• Ultherap ', '• Ultherapy ', ' Ultherapy ', ' Ultherapy ', ' Ultherapy ', ' Ultherapy ', ' Ultherapy ', ' Ultherapy', ' Ultherap', ' Ulthera', ' Ulther', ' Ulthe', ' Ulth', ' Ult', ' Ul', ' U', ' ' } local function clan_tag_anim () local tickinterval = globals.tickinterval() local tickcount = globals.tickcount() + math.floor(client.latency() / globals.tickinterval() + .5) local i = math.floor(tickcount / math.floor(0.2 / tickinterval + .5)) % #sequence + 1 return sequence[i] end local function clan_tag_original () local clanid = cvar.cl_clanid.get_int() if clanid == 0 then return '\0' end local clan_count = steamworks.ISteamFriends.GetClanCount() for i = 0, clan_count do local group_id = steamworks.ISteamFriends.GetClanByIndex(i) if group_id == clanid then return steamworks.ISteamFriends.GetClanTag(group_id) end end end local function on_paint () local enabled = elements.misc.clan_tag_spammer:get() if enabled then local local_player = entity.get_local_player() local clan_tag = clan_tag_anim() if local_player ~= nil and globals.tickcount() % 2 == 0 or (not entity.is_alive(local_player)) and globals.tickcount() % 2 == 0 then if clan_tag ~= clan_tag_prev then client.set_clan_tag(clan_tag) clan_tag_prev = clan_tag end end elseif enabled_prev then client.set_clan_tag(clan_tag_original()) end enabled_prev = enabled end local function on_run_command (e) if elements.misc.clan_tag_spammer:get() and e.chokedcommands == 0 then on_paint() end end client.set_event_callback('paint', on_paint) client.set_event_callback('run_command', on_run_command) end local filter_console do local function on_enable() if elements.misc.filter_console:get() then cvar.developer:set_int(0) cvar.con_filter_enable:set_int(1) cvar.con_filter_text:set_string("IrWL5106TZZKNFPz4P4Gl3pSN?J370f5hi373ZjPg%VOVh6lN") client.exec("con_filter_enable 1") else cvar.con_filter_enable:set_int(0) cvar.con_filter_text:set_string("") client.exec("con_filter_enable 0") end end elements.misc.filter_console:set_callback(on_enable) client.set_event_callback("shutdown", function() cvar.con_filter_enable:set_int(0) cvar.con_filter_text:set_string("") client.exec("con_filter_enable 0") end) end local trash_talk do local phrases = { bait = { {'1', 1.0} }, kill = { {'The only thing lower than your k/d ratio is your I.Q.', 0.2}, {'Your aim is so poor that people held a fundraiser for it.', 0.2}, {'Better buy PC, stop playing at school library.', 0.2}, {'The only thing more unreliable than you is the condom your dad used.', 0.2, '1', 1.0}, {'Calling you a retard is a compliment in comparison to how stupid you actually are.', 0.2}, {'I didnt know dying was a special ability.', 0.2}, {'If I jumped from your ego to your intelligence, Id die of starvation half-way down.', 0.2}, {'1', 1.0}, {'Studies show that aiming gives you better chances of hitting your target.', 0.2}, {'You should let your chair play, at least it knows how to support.', 0.2}, {'There are about 37 trillion cells working together in your body right now, and you are disappointing every single one of them.', 0.2}, {'I call you a tool, but that would imply you were useful in at least one way.', 0.2}, {'1', 1.0}, {'I love to see things from your perspective, but I dont think I could shove my head that far up my ass.', 0.2}, {'Im not trash talking, Im talking to trash.', 0.2}, {'Legend has it that the number 0 was first invented after scientists calculated your chance of doing something useful.', 0.2}, {'1', 1.0}, {'You are the type of player to get 3rd place in a 1v1 match.', 0.2}, {'Im not saying I hate you, but I would unplug your life support to charge my phone.', 0.2}, {'You are an inspiration for birth control.', 0.2}, {'Does your ass ever get jealous of the amount of shit that comes out of your mouth.', 0.2}, {'1', 1.0}, {'You should turn the game off. Just walk outside and find the nearest tree, then apologise to it for wasting so much oxygen.', 0.2}, {'I tell you to shoot yourself, but I bet youd miss.', 0.2}, {'Did you know sharks only kill 5 people each year? Looks like you got some competition.', 0.2}, {'1', 1.0}, {'Some babies were dropped on their heads but you were clearly thrown at a wall.', 0.2}, {'To which foundation do I need to donate to help you?', 0.2}, {'Im sure your bodypillow is very proud of you.', 0.2}, {'1', 1.0}, {'Two wrongs dont make a right, take your parents as an example.', 0.2}, {'I bet the last time u felt a breast was in a kfc bucket.', 0.2}, {'Maybe God made you a bit too special.', 0.2}, {'1', 1.0}, {'I bet your brain feels as good as new, seeing that you never use it.', 0.2}, {'It must be difficult for you, exhausting your entire vocabulary in one sentence.', 0.2}, {'You have some big balls on you. Too bad they belong to the guy fucking you from behind.', 1}, {'1', 1.0}, {'If only you could hit an enemy as much as your dad hits you.', 0.2}, {'Im surprised that you were able hit the Install button', 0.6}, {'Some people get paid to suck, you do it for free.', 0.2}, {'1', 1.0}, {'1', 0.8}, {'Id call you cancer, but at least cancer gets kills', 0.2, 'Who set the bots to passive?', 0.4, 'Im okay with this team. I work in the city as a garbage collector. Im used to carrying trash.', 0.6} }, death = { {'F-fuck my bussy M-Master!', 3, 'Penetrate me until I bust!', 2.5, 'Im your personal cum bucket!!', 1.8}, {'I-Im cumming, Im cumming, CUM with me too!', 1, 'I-Im cumming, Im cumming, CUM with me too!', 2, 'I-Im cumming, Im cumming, CUM with me too!', 3}, {'Umm... I dont wanna sound rude, but have you had a bath? Your panties look a bit yellow...', 0.5}, {'Boys just cant consider themselves an adult... Until they are had a chance to cum with a girls ampit.', 1.5}, {'We are both gonna fuck your pussy at the same time!', 1.0}, {'Can you really blame me for getting a boner after seeing that?', 0.5}, {'Ohoo, getting creampied made you cum? What a lewd bitch you are!', 1.8}, {'Oh my god I hate you so much Senpai but please k-keep fucking me harder! ahhh~', 1.5}, {'Ahhhh... Its like a dream come true... I get to stick my dick inside Tatsuki Chans ass...!', 1.4} } } local phrase_count = { bait = 0, kill = 0, death = 0 } local function say_phrases (phrase_table) local current_delay = 0 for i = 1, #phrase_table, 2 do local message = phrase_table[i] local delay = phrase_table[i+1] or 3 current_delay = current_delay + delay client.delay_call(current_delay, function () client.exec(('say %s'):format(message)) end) end end local function on_player_death (e) if not elements.misc.trash_talk.enable:get() then return end local player, victim, attacker = entity.get_local_player(), client.userid_to_entindex(e.userid), client.userid_to_entindex(e.attacker) if not player or not victim or not attacker then return end if attacker == player and victim ~= player then phrase_count.bait = (phrase_count.bait % #phrases.bait) + 1 phrase_count.kill = (phrase_count.kill % #phrases.kill) + 1 elseif victim == player and attacker ~= player then phrase_count.death = (phrase_count.death % #phrases.death) + 1 end local selected_phrases = { bait = phrases.bait[phrase_count.bait], kill = phrases.kill[phrase_count.kill], death = phrases.death[phrase_count.death] } if elements.misc.trash_talk.settings.work:get('On kill') and attacker == player and victim ~= player then say_phrases(elements.misc.trash_talk.settings.type:get() == 'Bait' and selected_phrases.bait or selected_phrases.kill) elseif elements.misc.trash_talk.settings.work:get('On death') and victim == player and attacker ~= player then say_phrases(selected_phrases.death) end end client.set_event_callback('player_death', on_player_death) end client.set_event_callback("net_update_end", function() local DickMan = entity.get_local_player() if elements.anti_aim.exploits.exploit.enable:get() then if entity.is_alive(DickMan) then entity.set_prop(DickMan, "m_flModelScale", 1.2, 12) end else entity.set_prop(DickMan, "m_flModelScale", 1, 12) end end) client.set_event_callback("shutdown", function() local DickMan = entity.get_local_player() if DickMan then entity.set_prop(DickMan, "m_flModelScale", 1, 12) end end) -- Warmup Assistant功能实现 local function handle_warmup_helper() client.exec("sv_cheats 1; sv_regeneration_force_on 1; mp_limitteams 0; mp_autoteambalance 0; mp_roundtime 60; mp_roundtime_defuse 60; mp_maxmoney 60000; mp_startmoney 60000; mp_freezetime 0; mp_buytime 9999; mp_buy_anywhere 1; sv_infinite_ammo 1; ammo_grenade_limit_total 5; bot_kick; bot_stop 1; mp_warmup_end; mp_restartgame 1; mp_respawn_on_death_ct 1; mp_respawn_on_death_t 1; sv_airaccelerate 100;") end elements.misc.warmup_helper:set_callback(function(self) if self:get() then handle_warmup_helper() end end) logic.setup = pui.setup({elements.conditions, elements.defensive, elements.anti_aim, elements.aimbot, colors, elements.visuals, elements.misc, drag_slider}, true) client.exec("play survival/buy_item_01.wav") client.set_event_callback('shutdown', function () if _G.DEBUG then _G.DEBUG = nil end reset_angles() cvar.cl_interpolate:set_int(1) cvar.cl_interp_ratio:set_int(2) cvar.r_aspectratio:set_int(0) cvar.viewmodel_fov:set_raw_float(68) cvar.viewmodel_offset_x:set_raw_float(2.5) cvar.viewmodel_offset_y:set_raw_float(0) cvar.viewmodel_offset_z:set_raw_float(-1.5) cvar.cl_interpolate:set_int(1) cvar.cl_interp_ratio:set_int(2) collectgarbage('collect') collectgarbage('collect') end)