Skip to content

Repository files navigation

POE2CRAFT

Крафт-ассистент для Path of Exile 2: читает предмет из буфера обмена (Ctrl+C в игре), считает реальные вероятности и EV для следующего шага крафта (Exalted/Regal/Chaos Orb, Omen of Whittling + Chaos Orb) на основе базы модов craftofexile.com, сам наводит мышь на откалиброванный слот предмета и жмёт Ctrl+C, и сам пересканирует стеш через OCR, пока он открыт — без единого твоего нажатия клавиши на эту рутину.

Никакого чтения памяти игры, инъекций или автокликов по игровому полю — только буфер обмена (официальная функция копирования предмета, той же техникой пользуются Awakened PoE Trade и другие внешние тулзы), движение мыши на уже откалиброванную тобой точку и снимки экрана.

Возможности

  • Парсер предмета (item_parser.py) — разбирает текст, скопированный Ctrl+C из PoE2, в структуру Item/Mod: база, редкость, требования, сокеты, руны, implicit, префиксы/суффиксы/ крафченые моды с тирами и точными роллами. Понимает русский и английский клиент, оба режима тултипа (с зажатым Alt — с тирами/роллами, и простой — без).
  • База модов (mod_db.py + download_mod_db.py) — 1364 мода, 80 баз, 287 рун/сокетов с craftofexile.com: вес каждого тира, требование ilvl, диапазоны роллов, группы модов (для правил взаимоисключения). Резолвит отображаемое имя базы (например «Siege Crossbow») в механическую базу для крафта («Crossbow»).
  • Движок вероятностей (craft_engine.py):
    • Exalted Orb / Regal Orb — добавить один случайный мод в открытый слот (одна и та же формула, разница только в названии валюты по редкости предмета);
    • Chaos Orb (механика PoE2 — снести один случайный существующий мод и докрутить новый, не полный реролл как в PoE1) — честная двухшаговая вероятность;
    • Omen of Whittling + Chaos Orb — Омен, применённый перед Chaos Orb, заставляет его снести ГАРАНТИРОВАННО мод с самым низким ilvl-требованием (не по номеру тира — это разные вещи, хоть обычно и коррелируют); докрутка нового мода всё равно случайная;
    • учитывает требование ilvl, кэп 3 префикса + 3 суффикса, конфликты групп модов.
  • Планировщик (planner.py) — задаёшь цель («хочу Critical Hit Chance, тир не хуже 2»), он смотрит на предмет и стеш валюты и говорит следующий шаг: какая валюта, шанс за бросок, ожидаемое количество, хватит ли в стеше; если слоты забиты — сравнивает Omen of Whittling + Chaos Orb (детерминированный снос) и просто Chaos Orb (случайный), явно называя, какой мод будет принесён в жертву каждым путём. Опция --protect бережёт уже стоящие моды: расчёт честно отделяет "докрутило цель" от "докрутило цель, но заодно снесло защищённое" — сама игра всё ещё может снести защищённый мод (случайность есть случайность), но хотя бы видно, какой ценой куплен указанный шанс.
  • Live-режим (watch.py) — слушает буфер обмена, при каждом новом предмете сам парсит и пересчитывает план. Цель меняется на лету через set_target.py, без перезапуска.
  • HUD-оверлей (overlay.py) — крупный баннер снизу экрана: что кидать прямо сейчас, шанс, EV, остаток в стеше и насколько свежи данные о валюте. Полупрозрачный, click-through (клики проходят сквозь него). Позиция/прозрачность/размер — data/overlay_config.json.
  • Учёт валюты в стеше:
    • stash_calibrate.py — мультизонный оверлей поверх игры (вкладка «Валюта» у GGG не единая сетка, а секции разного размера) — двигаешь/тянешь окна под свои кластеры ячеек;
    • stash_label.py — кликаешь по ячейке, вписываешь название валюты и количество руками;
    • stash_read.py — дальше довписывает количество автоматически через OCR (Tesseract) по уже проставленным названиям; пишет метку времени в data/stash_meta.json, чтобы было видно, насколько свежие данные, а не выдавать старый снимок за текущее состояние.
  • Авто-Ctrl+C (item_watch.py + item_watch_calibrate.py) — калибруешь область экрана, где лежит крафтуемый предмет; тул следит за пикселями, сам наводит туда мышь (только движение курсора, без кликов) и жмёт Ctrl+C, когда предмет меняется. Переключается хоткеем F2 (по умолчанию выключен).
  • Гейт по открытому стешу (stash_open_calibrate.py, data/stash_open_region.json) — отдельная калиброванная область заголовка панели проверяется OCR'ом на слово STASH раз в секунду. Пока стеш закрыт — авто-Ctrl+C не сработает, даже если F2 включён (не ловит ложные срабатывания посреди боя). Пока стеш открыт — этим же сигналом item_watch.py независимо от F2 пересканирует валюту через stash_read.refresh_stash() каждые ~8с (это только чтение экрана, не игровой ввод).

Как это выглядит целиком

Стеш открыт? (OCR area STASH) — нет: item_watch.py молчит, даже если F2 включён
        │ да
        ▼
Кинул валюту в игре
        │
        ▼
item_watch.py замечает, что предмет в слоте изменился → сам наводит мышь → жмёт Ctrl+C
   (параллельно, тем же гейтом: пересканирует валюту через stash_read.py каждые ~8с)
        │
        ▼
watch.py видит новый буфер → item_parser.py разбирает предмет
        │
        ▼
mod_db.py сопоставляет каждый мод с базой (тир, вес, ilvl)
        │
        ▼
craft_engine.py считает вероятности следующего шага
        │
        ▼
planner.py + data/target.json (цель) + data/stash.json (валюта) → совет
        │
        ▼
overlay.py показывает его в HUD-панели поверх игры (+ дублирует в консоль)

Установка

Тестировалось на Windows 11 + Anaconda Python.

1. Зависимости

pip install pyperclip mss numpy opencv-python pillow pytesseract pywin32 keyboard requests

2. Tesseract OCR (для чтения количества валюты в стеше)

winget install --id UB-Mannheim.TesseractOCR -e

Если поставился не в C:\Program Files\Tesseract-OCR\tesseract.exe — поправь путь в stash_read.py (pytesseract.pytesseract.tesseract_cmd).

3. База модов

python download_mod_db.py

Скачает data/poec_data.json (~3 МБ) + пару вспомогательных файлов с craftofexile.com — это сторонние данные, поэтому не лежат в репозитории и скачиваются один раз этим скриптом.

4. Режим экрана игры

Обязательно: PoE2 должна быть в Windowed Fullscreen / Borderless, не в эксклюзивном Fullscreen — в эксклюзивном режиме Windows физически не даёт никаким сторонним окнам рисоваться поверх игры, оверлеи калибровки просто не появятся на экране.

5. Калибровка стеша (один раз, если меняется расположение вкладки/разрешение)

python stash_calibrate.py

Открой в игре вкладку «Валюта». Появятся 4 прозрачных окна — подвинь/растяни каждое под свой кластер ячеек (у вкладки разные секции с разной шириной колонок, отсюда 4 независимые зоны, а не одна сетка). Для каждого окна: подбери «Строк»/«Столбцов», жми «Сброс», затем «Авто» (подтягивает линии к реальным зазорам между иконками по яркости пикселей), при необходимости дотяни руками отдельные линии мышкой. «Добавить зону» на пульте — когда одна зона готова, двигай окно на следующий кластер. «Сохранить все зоны» в конце.

Затем разметь, какая валюта в какой ячейке (один раз — раскладка вкладки у GGG фиксированная):

python stash_label.py

Кликаешь по ячейке — вписываешь название валюты и текущее количество. «Сохранить stash.json» на пульте.

Дальше, чтобы обновлять только числа (без повторной разметки имён):

python stash_read.py

6. Калибровка авто-Ctrl+C (один раз на позицию предмета)

python item_watch_calibrate.py

Появится окно над игрой — подгони рамку под слот, где будет лежать крафтуемый предмет (сам слот, не тултип — тултип гуляет по экрану вслед за курсором, а слот в инвентаре/на столе крафта фиксирован). «Сохранить регион».

7. Калибровка гейта «стеш открыт» (один раз)

python stash_open_calibrate.py

Открой в игре стеш, подгони рамку под слово STASH в заголовке панели, «Сохранить регион». Без этой калибровки авто-Ctrl+C и авто-пересканирование валюты просто не блокируются/не запускаются по стешу — ведут себя как раньше (только по F2 / вообще не пересканируют).

Использование

Самый простой способ — один лаунчер, поднимает оба процесса:

run_all.bat

Откроются два окна:

  • item_watch — авто-Ctrl+C (мышь сама наводится на слот). F2 — включить перед тем как начать крафтить, F2 ещё раз — выключить. Сработает, только пока ОБА условия верны: F2 включён И стеш открыт (см. калибровку STASH выше) — иначе молчит, даже с F2. Пока стеш открыт — параллельно, независимо от F2, каждые ~8с сам пересканирует валюту.
  • watch — парсит буфер, считает план, показывает HUD-баннер снизу экрана.

Задать/сменить цель крафта на лету (без перезапуска watch.py):

python set_target.py "Critical Hit Chance" 2      # цель, тир не хуже 2
python set_target.py "Critical Hit Chance"        # цель, любой тир
python set_target.py "Fire Damage" --protect "Cold Damage" "Lightning Damage"
                                                   # цель + защита уже стоящих модов от сноса
python set_target.py --clear                      # снять цель — общая сводка по Exalted/Regal

Ручной разовый прогон вместо live-режима:

python craft_engine.py samples.txt      # отчёт по последнему предмету из файла
python planner.py samples.txt "Critical Hit Chance" 2

Структура файлов

Файл Назначение
item_parser.py Текст из буфера -> Item/Mod
mod_db.py Загрузчик базы модов + резолв базы + сопоставление текста с шаблоном + тир по роллу
craft_engine.py Вероятности Exalted/Regal/Chaos
planner.py Степ-бай-степ совет по цели + стешу
watch.py Живой цикл: буфер -> парсинг -> план -> оверлей
overlay.py Click-through HUD-панель поверх игры (позиция в data/overlay_config.json)
set_target.py Смена цели планировщика на лету
stash_calibrate.py Мультизонная калибровка сетки вкладки «Валюта»
stash_label.py Разметка ячеек стеша (имя + количество) кликом
stash_read.py OCR-дочитка количества по уже проставленным именам
item_watch_calibrate.py Калибровка области слота предмета
item_watch.py Авто-наведение мыши + Ctrl+C по изменению пикселей (F2 + гейт "стеш открыт"), плюс авто-пересканирование валюты
stash_open_calibrate.py Калибровка области заголовка STASH (гейт для авто-Ctrl+C и авто-пересканирования)
download_mod_db.py Скачивает базу модов с craftofexile.com
clipboard_dump.py Только для разработки — дамп сырых образцов тултипа в samples.txt
run_all.bat Запуск item_watch.py + watch.py одной командой

Известные ограничения

  • OCR чисел в стеше (stash_read.py) — на офлайн-тесте (29 размеченных ячеек) даёт 86% точного совпадения (CUBIC-апскейл + денойзинг по высоте/кластеру компонент, было 48% на голом HSV-пороге + NEAREST). Оставшиеся промахи — иконки, где яркие детали графики орба геометрически перекрывают само число (напр. Orb of Annulment, Glassblower's Bauble) — для них полезен fallback на последнее известное значение (см. ниже), но сверяй глазами. Ошибка OCR на уже размеченной ячейке больше не обнуляет валюту в stash.json: если распознать не вышло, берётся последнее известное количество из data/stash_labels.json (оно же обновляется после каждого удачного распознавания).
  • Essence- и Desecrated-крафт (тот самый бонусный слот от рун вроде Ire of Aldur, «Can have N additional crafted modifier») пока не смоделирован — нужен реальный образец предмета с такой руной в буфере, чтобы разобрать точный формат текста.
  • Калибровка (data/stash_grid.json, data/item_watch_region.json) завязана на конкретный монитор/разрешение/масштаб DPI — при смене машины или разрешения перекалибровать заново.
  • Chaos Orb считает снос существующего мода равновероятным по всем имеющимся — точные веса удаления GGG не публикует, это разумное приближение, не гарантированный факт.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages