CCCPaste

4615f8e4cacae


function aim_bot()
    local lp = proc.read_int64(base_address + offsets.global.localplayer)
    if not lp or lp == 0 then return end
    
    local localEye = proc.read_vec3(lp + offsets.entity.camera_origin)
    local viewAngles = proc.read_vec3(lp + offsets.global.view_angles)
    local punchAngle = proc.read_vec3(lp + offsets.entity.punch_angle)

    local bestFov, bestAngle = 10.0, nil
    
    for i = 0, maxticks do
        local ent_data = entlist[i]
        
        if not (ent_data and ent_data.valid and ent_data.cname == "CPlayer") then goto continue end
        if ent_data.health <= 0 then goto continue end
        --if is_knocked(i) then goto continue end
        --if is_same_team(i) then goto continue end
        --if not is_visible(i) then goto continue end

        local entHead = ent_data.head
        if not entHead then goto continue end

        local weapon_handle = proc.read_int64(lp + 0x19b4); --//[RecvTable.DT_Player]->m_latestPrimaryWeapons 
        local weapon_entity = proc.read_int64(base_address + offsets.global.entity_list + (weapon_handle << 5))
        local projectile_speed = proc.read_float(weapon_entity + 0x2810) --//CWeaponX!m_flProjectileSpeed or [WeaponSettings]->projectile_launch_speed + [WeaponSettingsMeta]->base
        local projectile_gravity = proc.read_float(weapon_entity + 0x2818) --//CWeaponX!m_flProjectileScale or [WeaponSettings]->projectile_gravity_scale + [WeaponSettingsMeta]->base

        local distance = ent_data.distance
        local velocity = ent_data.velocity
        if distance > 100 then
            projectile_speed = projectile_speed * 0.02
        elseif distance > 200 then
            projectile_speed = projectile_speed * 0.016
        else
            projectile_speed = projectile_speed * 0.025
        end

        local time = distance / projectile_speed

        local predicted = {
        entHead[1] + velocity[1] * time,
        entHead[2] + velocity[2] * time,
        entHead[3] + velocity[3] * time + 32.0 * (projectile_gravity * time)
        }

        local angle = calculate_angle(localEye, predicted, viewAngles)
        local fov = math.sqrt(angle[1]^2 + angle[2]^2)

        if fov < bestFov then
            bestFov = fov
            bestAngle = angle
        end

        ::continue::
    end

    if input.is_key_down(2) and bestAngle then
        local newAngle = vec3_add(viewAngles, bestAngle)
        newAngle[1] = newAngle[1] - punchAngle[1] * 1.0 
        newAngle[2] = newAngle[2] - punchAngle[2] * 1.0 
        
        proc.write_vec3(lp + offsets.global.view_angles, newAngle)
    end
end