Крафт-ассистент для 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.
pip install pyperclip mss numpy opencv-python pillow pytesseract pywin32 keyboard requests
winget install --id UB-Mannheim.TesseractOCR -e
Если поставился не в C:\Program Files\Tesseract-OCR\tesseract.exe — поправь путь в
stash_read.py (pytesseract.pytesseract.tesseract_cmd).
python download_mod_db.py
Скачает data/poec_data.json (~3 МБ) + пару вспомогательных файлов с craftofexile.com —
это сторонние данные, поэтому не лежат в репозитории и скачиваются один раз этим скриптом.
Обязательно: PoE2 должна быть в Windowed Fullscreen / Borderless, не в эксклюзивном Fullscreen — в эксклюзивном режиме Windows физически не даёт никаким сторонним окнам рисоваться поверх игры, оверлеи калибровки просто не появятся на экране.
python stash_calibrate.py
Открой в игре вкладку «Валюта». Появятся 4 прозрачных окна — подвинь/растяни каждое под свой кластер ячеек (у вкладки разные секции с разной шириной колонок, отсюда 4 независимые зоны, а не одна сетка). Для каждого окна: подбери «Строк»/«Столбцов», жми «Сброс», затем «Авто» (подтягивает линии к реальным зазорам между иконками по яркости пикселей), при необходимости дотяни руками отдельные линии мышкой. «Добавить зону» на пульте — когда одна зона готова, двигай окно на следующий кластер. «Сохранить все зоны» в конце.
Затем разметь, какая валюта в какой ячейке (один раз — раскладка вкладки у GGG фиксированная):
python stash_label.py
Кликаешь по ячейке — вписываешь название валюты и текущее количество. «Сохранить stash.json» на пульте.
Дальше, чтобы обновлять только числа (без повторной разметки имён):
python stash_read.py
python item_watch_calibrate.py
Появится окно над игрой — подгони рамку под слот, где будет лежать крафтуемый предмет (сам слот, не тултип — тултип гуляет по экрану вслед за курсором, а слот в инвентаре/на столе крафта фиксирован). «Сохранить регион».
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 не публикует, это разумное приближение, не гарантированный факт.