Загрузка данных


import cv2
import mss
import numpy as np
import pydirectinput
import time

print("ИИ для Нокаута запущен! Жду входа в бой...")

# Твои идеальные размеры захвата экрана под эмулятор
monitor = {"top": 0, "left": 0, "width": 650, "height": 370}

# ИДЕАЛЬНАЯ ЦВЕТОВАЯ ПАЛИТРА ИЗ ТВОИХ СКРИНШОТОВ (HSV)
lower_green = np.array([35, 50, 50])
upper_green = np.array([85, 255, 255])

lower_blue = np.array([85, 100, 100])
upper_blue = np.array([105, 255, 255])

lower_red1 = np.array([0, 140, 140])
upper_red1 = np.array([10, 255, 255])
lower_red2 = np.array([170, 140, 140])
upper_red2 = np.array([180, 255, 255])

with mss.mss() as sct:
    while True:
        screenshot = sct.grab(monitor)
        frame = np.array(screenshot)
        frame = cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR)
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        
        # Сначала создаем маски и контуры (Компьютер сначала смотрит на мир)
        mask_g = cv2.inRange(hsv, lower_green, upper_green)
        mask_r1 = cv2.inRange(hsv, lower_red1, upper_red1)
        mask_r2 = cv2.inRange(hsv, lower_red2, upper_red2)
        mask_r = cv2.bitwise_or(mask_r1, mask_r2)
        
        contours_g, _ = cv2.findContours(mask_g, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        contours_r, _ = cv2.findContours(mask_r, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        
        # --- ЖЕЛЕЗОБЕТОННЫЙ ЯКОРЬ БОЯ ---
        # Проверяем серый пиксель кнопки Exit в дружеском матче (примерно X: 325, Y: 345)
        pixel_color = frame[345, 325]
        
        in_battle = False
        # Мы в бою, если видны контуры ХП И мы зашли в сам матч (кнопка Exit или активный бой)
        if len(contours_g) > 0 or len(contours_r) > 0:
            in_battle = True

        if not in_battle:
            # Если мы в меню, сбрасываем ходьбу и ждем
            pydirectinput.keyUp('w')
            pydirectinput.keyUp('s')
            cv2.imshow("AI Vision - Waiting for Battle", frame)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
            continue

        # --- БОЕВОЙ РЕЖИМ ---
        me_x, me_y = None, None
        enemy_detected = False
        enemy_x, enemy_y = None, None
        
        screen_center_x = 650 // 2
        screen_center_y = 370 // 2
        closest_dist = 99999
        
        # 1. Засекаем СЕБЯ
        for contour in contours_g:
            if cv2.contourArea(contour) > 120:
                x, y, w, h = cv2.boundingRect(contour)
                if w > h * 2.5 and w < h * 5.5:
                    dist = abs(x + w//2 - screen_center_x) + abs(y + h//2 - screen_center_y)
                    if dist < closest_dist:
                        closest_dist = dist
                        me_x, me_y = x + w//2, y + h//2
                        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
                        cv2.putText(frame, "ME", (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

        # 2. Засекаем СОЮЗНИКОВ (Голубые полоски)
        mask_b = cv2.inRange(hsv, lower_blue, upper_blue)
        contours_b, _ = cv2.findContours(mask_b, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        for contour in contours_b:
            if cv2.contourArea(contour) > 120:
                x, y, w, h = cv2.boundingRect(contour)
                if w > h * 2.5 and w < h * 5.5:
                    cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 255, 0), 2)
                    cv2.putText(frame, "TEAMMATE", (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 0), 2)

        # 3. Засекаем ВРАГОВ
        for contour in contours_r:
            if cv2.contourArea(contour) > 120:
                x, y, w, h = cv2.boundingRect(contour)
                if w > h * 2.5 and w < h * 5.5:
                    enemy_detected = True
                    enemy_x, enemy_y = x + w//2, y + h//2
                    cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
                    cv2.putText(frame, "ENEMY", (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)

        # --- ЛОГИКА ДЕЙСТВИЙ (РУКИ И ИМПУЛЬСЫ) ---
        if enemy_detected and me_x is not None:
            y_distance = enemy_y - me_y
            
            # Если враг подошел ближе 120 пикселей — мансуем назад!
            if abs(y_distance) < 120:
                print("⚠️ ВРАГ БЛИЗКО! Активирую мансы назад!")
                pydirectinput.keyUp('w')
                pydirectinput.keyDown('s')
                time.sleep(0.05)
                pydirectinput.keyUp('s')
            else:
                # Если враг далеко — сближаемся на дистанцию атаки
                pydirectinput.keyUp('s')
                pydirectinput.keyDown('w')
                time.sleep(0.05)
                pydirectinput.keyUp('w')
            
            # Симулируем авто-атаку кликом мышки по кнопке прицела в BlueStacks
            pydirectinput.click(570, 240)
            
            # Активируем комбо: Гиперзаряд (F) + Ульта (E)
            pydirectinput.press('f')
            pydirectinput.press('e')
            
        else:
            # Если целей нет, сбрасываем кнопки, чтобы не застрять
            pydirectinput.keyUp('w')
            pydirectinput.keyUp('s')

        cv2.imshow("AI Vision - Pro Battle Mode", frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            pydirectinput.keyUp('w')
            pydirectinput.keyUp('s')
            break

cv2.destroyAllWindows()
print("Бот полностью остановлен.")