Path of Exile (POE) Inventory Automatic Orgnize !!! [1]
Warning
This posting is for educational purposes only. Never abuse, it gets misused.
Hello
If you pick up the abolition and sell the item, the Currency is piling up a lot, and today, in order to solve that problem and pick up the abolition quickly, i’ll send all the Currency to the warehouse, stash joe ~ with one Keyboard input from the character inventory.
In POE, when you press ctrl + c against the mouse cursor on the item, is the item information copied to the Clipboard? I used the feature positively. ! For more information on how to operate, please refer to the video ~
First, let’s look at which libraries you used.
1. Required libraries
pip install pywin32 pip install pillow pip install numpy pip install mss pip install pyautogui==0.9.38 pip install opencv-python pip install pprint
In fact, poe automatic potion eating!! If stamina half-fish … You need the same library that Post used. It’s just a new pprint. This library is intended to make python material types look better.
2. Code
There are some pre-work tasks that you need to do before you introduce the code. With the character inventory visible, you can change the run variables in the code below from 1 to 5 in turn and then run it!! Follow the description of each step below.
run = 1. Find the coordinates of inventory. I need a cvFunc.py file that I did in the last post. (Blue square screenshot)
run = 2. Save the first grid screenshot of Inventory. This screenshot is used to find an empty inventory unit, so the first inventory should be left blank and run.
run = 3. Make sure that empty inventory units are well detected. Config.cfg (described below) if it is not detected well Try adjusting the confidence factor value!! Clipboard copytime takes quite some time, so it detects empty units and handles exceptions.
run = 4. Make sure that the actual Currency goes well into Stash. Within 3 seconds of running the code, click on the POE game screen and make the POE an active window for normal operation.
run = 5. Now the preparation process is over. If you press F2 during the game, move all currency from your character inventory to Stash.
And if you look at the function below, there’s a global variable called EXCEPT_CURRENCY. This variable is a setting for Currency that will not be moved to the warehouse.
inventoryFunc.py
import win32clipboard import pyautogui as pa import mouse as mo import keyboard as keys import time import numpy as np import pprint import cv2.cv2 as cv2 import mss import os from PIL import Image K_RARENESS = '희귀도' K_ITEMNAME = 'item_name' V_CURRENCY = '화폐' EXCEPT_CURRENCY = ['Scroll of Wisdom', 'Portal Scroll'] class InventoryTool(): itemInfoInInven = {} def __init__(self, inventorySize, listexceptCurr): # inventorySize x, y, w, h self.inventorySize = inventorySize self.inven = np.empty(shape=(12, 5), dtype=tuple) self.invenUnitSize = (int(inventorySize[2] / 12), int(inventorySize[2] / 12)) self.invenUnitBox = (inventorySize[0] + 5, inventorySize[1] + 5, \ self.invenUnitSize[0]-5, self.invenUnitSize[1]-5) self.listexceptCurr = listexceptCurr for xunit in range(12): for yunit in range(5): x = self.inventorySize[0] + xunit * self.invenUnitSize[0] y = self.inventorySize[1] + yunit * self.invenUnitSize[0] cord = pa.center((x, y, self.invenUnitSize[0], self.invenUnitSize[1])) self.inven[xunit][yunit] = cord def realPoint(self, unitPointX, unitPointY): return (self.inven[unitPointX][unitPointY][0], self.inven[unitPointX][unitPointY][1]) # get clipboard data def getItemInfoFromClipboard(self, unitPoint): itemInfo = {} keys.send("ctrl+c") time.sleep(0.03) try: win32clipboard.OpenClipboard() itemData = win32clipboard.GetClipboardData() win32clipboard.EmptyClipboard() win32clipboard.CloseClipboard() itemKinds = itemData.split('--------')[0].strip() rarenessAndName = itemKinds.split('\n') rareness_key = rarenessAndName[0].split(':')[0] rareness_value = rarenessAndName[0].split(':')[1] itemInfo[rareness_key] = rareness_value.strip() itemInfo[K_ITEMNAME] = rarenessAndName[1] self.itemInfoInInven[unitPoint] = itemInfo return itemInfo except: print('No Item ', unitPoint) return None def checkItemInInvertory(self, boxRegions): for x in range(np.shape(self.inven)[0]): for y in range(np.shape(self.inven)[1]): rpoint = self.realPoint(x, y) if self.checkEmptyUnitPoint(boxRegions, rpoint): mo.move(rpoint[0], rpoint[1]) time.sleep(0.03) self.getItemInfoFromClipboard((x, y)) def moveCurrencyToStash(self): keys.press('ctrl') for unitPoint, iteminfo in self.itemInfoInInven.items(): rpoint = self.realPoint(unitPoint[0], unitPoint[1]) try: # print('move', iteminfo[K_ITEMNAME]) if iteminfo[K_RARENESS] == V_CURRENCY \ and not iteminfo[K_ITEMNAME] in self.listexceptCurr: mo.move(rpoint[0], rpoint[1]) time.sleep(0.05) mo.click() print('Move', iteminfo[K_ITEMNAME]) except: pass keys.release('ctrl') def checkEmptyUnitPoint(self, boxRegions, centerRpoint): for br in boxRegions: x, y, w, h = br if (x < centerRpoint[0] < x + w) and (y < centerRpoint[1] < y + h): # nothing on inven return False # something on inven return True def findImage(self, templateName, show=0, confidence=0.6): boxRegions = [] x, y, w, h = self.inventorySize mon = {'top': y, 'left': x, 'width': w, 'height': h} sct = mss.mss() sct.grab(mon) img = Image.frombytes('RGB', (w, h), sct.grab(mon).rgb) frame = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR) gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) imgPath = os.path.dirname(os.path.realpath(__file__)) + '\\' + templateName template = cv2.imread(imgPath, 0) w, h = template.shape[::-1] res = cv2.matchTemplate(gray, template, cv2.TM_CCOEFF_NORMED) threshold = confidence loc = np.where(res >= threshold) for pt in zip(*loc[::-1]): if show == 1: cv2.rectangle(frame, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2) realX = self.inventorySize[0] + pt[0] realY = self.inventorySize[1] + pt[1] boxRegions.append((realX, realY, w, h)) if show == 1: cv2.imshow('image', frame) cv2.waitKey(0) cv2.destroyAllWindows() return boxRegions def makeTemplate(self, templateName, templatePoint): x, y, w, h = templatePoint mon = {'top': y, 'left': x, 'width': w, 'height': h} sct = mss.mss() sct.grab(mon) img = Image.frombytes('RGB', (w, h), sct.grab(mon).rgb) frame = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR) imgPath = os.path.dirname(os.path.realpath(__file__)) + '\\' + templateName cv2.imwrite(imgPath, frame) if __name__=="__main__": import configparser import cvFunc as cvf from ast import literal_eval configFile = os.path.dirname(os.path.realpath(__file__)) + '\\' + 'config.cfg' config = configparser.ConfigParser() config.read(configFile) inventory_size = literal_eval(config['inventory']['inven_region']) templateName = config['inventory']['inven_unit_empty_pic'] templateConfidence = float(config['inventory']['confidence']) run = 1 # -- screenshot whole inventory and get size if run == 1: ip = cvf.ScreenShot() ip.partScreenShot() # -- screenshot empty inventory unit and save elif run == 2: it = InventoryTool(inventory_size, EXCEPT_CURRENCY) it.makeTemplate(templateName, it.invenUnitBox) # -- find empty inventory unit image on whole inventory elif run == 3: it = InventoryTool(inventory_size, EXCEPT_CURRENCY) it.findImage(templateName, show=1, confidence=templateConfidence) # -- run 1 time elif run == 4: time.sleep(3) it = InventoryTool(inventory_size, EXCEPT_CURRENCY) boxRegions = it.findImage(templateName, 0, confidence=templateConfidence) # print(boxRegions) it.checkItemInInvertory(boxRegions) pprint.pprint(it.itemInfoInInven, indent=4) it.moveCurrencyToStash() # -- run forever elif run == 5: keyState = 0 while True: time.sleep(0.001) value = keys.is_pressed('F2') if value == True: it = InventoryTool(inventory_size, EXCEPT_CURRENCY) boxRegions = it.findImage(templateName, 0, confidence=templateConfidence) # print(boxRegions) it.checkItemInInvertory(boxRegions) pprint.pprint(it.itemInfoInInven, indent=4) it.moveCurrencyToStash() keyState = value
3. Config.cfg
[inventory] # 4K # inven_region = (2599, 1152, 1213, 513) # Full HD inven_region = (1307, 576, 597, 250) inven_unit_empty_pic = invenUnitEmpty.png confidence = 0.8
The inventory section has been added.
- inven_region: means inventory x, y, w, h. You can get it as run = 1.
- inven_unit_empty_pic: run = 2 is the name of the empty space photo of the inventory obtained.
- confidence: The value of openCV to allow a certain similarity to template Matching. As you get closer to 1, only the same area as the given template picture is detected.
You can do this and run the inventoryFunc.py. !
If you have currency that doesn’t move occasionally, increase the time.sleep (0.03) time in the getItemInfoFromClipboard function to 0.05!
If you read clipboard content too quickly after ctrl+c, you’ll see items that fall out.
Yep today’s post is here. The code shows a very mechanical and fast mouse and keyboard movement! It’s also easy to get caught up in, so don’t abuse it or ???? I’m sorry.
I’ve built it with a dual-list namom build, but Malakai doesn’t kill…. I thought it was a mob that i’m going to die quickly, but it’s all the. !!! It’s a great place to stay.
Subscribe to the Blog!!