§
    /€ªj—  ã                  ó¢   — d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
mZmZmZmZ e G d„ d¦  «        ¦   «         Z G d„ d	¦  «        ZdS )
u  AutoPOE2 - Stash & Inventory Memory Reader (Doc 63 / SSoT 2026).

Bá»™ Ä‘á»�c vÃ  Ä‘á»“ng bá»™ tráº¡ng thÃ¡i tÃºi Ä‘á»“ / hÃ²m Ä‘á»“ qua bá»™ nhá»› RAM tiáº¿n trÃ¬nh POE2:
- Káº¿t ná»‘i tiáº¿n trÃ¬nh game qua Windows API ReadProcessMemory (100% User Mode, Zero-Write).
- Quáº£n lÃ½ bá»™ nhá»› Ä‘á»‡m In-Memory Slot Cache truy xuáº¥t tá»©c thá»�i O(1).
- CÆ¡ cháº¿ Fail-Soft: Tá»± Ä‘á»™ng suy thoÃ¡i mÆ°á»£t mÃ  sang Optical/Clipboard náº¿u memory shift.
- Ä�á»“ng bá»™ Ä‘a táº§ng giá»¯a RAM, Optical Scanner vÃ  Clipboard Ground-Truth.
é    )ÚannotationsN)Ú	dataclass)ÚAnyÚDictÚListÚOptionalÚTuplec                  ó|   — e Zd ZU dZded<   ded<   dZded<   dZd	ed
<   dZd	ed<   dZded<   dZ	ded<   dZ
ded<   dS )ÚSlotMemoryDatauJ   Dá»¯ liá»‡u Ã´ Ä‘á»“ Ä‘Æ°á»£c lÆ°u trá»¯ vÃ  Ä‘á»“ng bá»™ trong RAM Cache.ÚintÚcolÚrowFÚboolÚis_occupiedÚ ÚstrÚ	item_nameÚOTHERÚcategoryNúOptional[int]Útieré   Úquantityr   Úlast_updated_ms)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   r   r   r   r   © ó    úDC:\Projects\AutoPOE2\src\assistant_tool\stash\stash_memory_reader.pyr   r      s�   € € € € € € àTÐTØ€H€H�HØ€H€H�HØ€KÐÐÐÑØ€IÐÐÐÑØ€HÐÐÐÑØ€DÐÐÐÑØ€HÐÐÐÑØ€OÐÐÐÑÐÐr!   r   c                  ó–   — e Zd ZdZd*d+d„Zd,d„Zd-d„Zd,d„Zd,d„Zd.d„Z	d/d„Z
d0d„Zd0d„Zd1d„Z	 	 	 	 d2d3d"„Zd4d%„Zd5d'„Zd6d(„Zd5d)„ZdS )7ÚStashMemoryReaderuL   Bá»™ Ä‘á»�c bá»™ nhá»› RAM tiáº¿n trÃ¬nh POE2 cho tÃºi Ä‘á»“ vÃ  hÃ²m Ä‘á»“.NÚpidr   c                óž   — || _         d | _        i | _        |                      ¦   «          | j         r|                      | j         ¦  «         d S d S ©N)r%   Ú	h_processÚ_cacheÚ_init_cacheÚattach)Úselfr%   s     r"   Ú__init__zStashMemoryReader.__init__$   sW   € ØˆŒØ(,ˆŒØ=?ˆŒØ×ÒÑÔÐØŒ8ð 	"Ø�KŠK˜œÑ!Ô!Ð!Ð!Ð!ð	"ð 	"r!   ÚreturnÚNonec                óÎ   — t          t          j        ¦   «         dz  ¦  «        }t          d¦  «        D ]1}t          d¦  «        D ]}t          ||d|¬¦  «        | j        ||f<   Œ Œ2dS )uE   Khá»Ÿi táº¡o lÆ°á»›i 60 Ã´ tÃºi Ä‘á»“ cÃ¡ nhÃ¢n (12 cá»™t x 5 hÃ ng).éè  é   é   F)r   r   r   r   N)r   ÚtimeÚranger   r)   )r,   Únow_msÚrÚcs       r"   r*   zStashMemoryReader._init_cache,   s�   € å•T”Y‘[”[ 4Ñ'Ñ(Ô(ˆÝ�q‘”ð 	ð 	ˆAÝ˜2‘Y”Yð ð �Ý&4ØØØ %Ø$*ð	'ñ 'ô '�”˜Q ˜FÑ#Ð#ðð	ð 	r!   r   r   c                óÖ   — |                       ¦   «          || _        d}d}d}||z  ||z  |fD ]4}t          j        j                             |d|¦  «        }|r
|| _         dS Œ5d| _        dS )u`   Káº¿t ná»‘i tá»›i tiáº¿n trÃ¬nh game vá»›i quyá»�n Ä‘á»�c bá»™ nhá»› an toÃ n (PROCESS_VM_READ).é   i   i   FTN)Údetachr%   ÚctypesÚwindllÚkernel32ÚOpenProcessr(   )r,   r%   ÚPROCESS_VM_READÚPROCESS_QUERY_INFORMATIONÚ!PROCESS_QUERY_LIMITED_INFORMATIONÚflagsÚhs          r"   r+   zStashMemoryReader.attach8   s–   € à�Š‰ŒˆØˆŒà ˆØ$*Ð!Ø,2Ð)ð Ð7Ñ7ØÐ?Ñ?Øð
ð 	ð 	ˆEõ
 ”Ô&×2Ò2°5¸%ÀÑEÔEˆAØð Ø!"�”Ø�t�tðð ˆŒØˆur!   c                óœ   — | j         rD	 t          j        j                             | j         ¦  «         n# t
          $ r Y nw xY wd| _         dS dS )uI   Giáº£i phÃ³ng handle tiáº¿n trÃ¬nh Windows chá»‘ng rÃ² rá»‰ tÃ i nguyÃªn.N)r(   r<   r=   r>   ÚCloseHandleÚ	Exception©r,   s    r"   r;   zStashMemoryReader.detachN   sd   € àŒ>ð 	"ðÝ”Ô&×2Ò2°4´>ÑBÔBÐBÐBøÝð ð ð Ø�ðøøøà!ˆDŒNˆNˆNð	"ð 	"s   ‰)3 ³
A ¿A c                ó.   — |                       ¦   «          d S r'   )r;   rH   s    r"   Ú__del__zStashMemoryReader.__del__W   s   € Ø�Š‰Œˆˆˆr!   c                ó   — | j         duS )u@   Kiá»ƒm tra xem Ä‘Ã£ káº¿t ná»‘i tá»›i bá»™ nhá»› game hay chÆ°a.N)r(   rH   s    r"   Úis_attachedzStashMemoryReader.is_attachedZ   s   € àŒ~ TÐ)Ð)r!   ÚaddrÚsizeúOptional[bytes]c           	     óH  — | j         r|dk     s|dk    rdS t          j        |¦  «        }t          j        ¦   «         }t          j        j                             | j         t          j        |¦  «        ||t          j        |¦  «        ¦  «        }|r|j	        |k    r|j
        S dS )u7   Ä�á»�c chuá»—i bytes tá»« Ä‘á»‹a chá»‰ bá»™ nhá»› game.i   l   ÿýÿ N)r(   r<   Úcreate_string_bufferÚc_size_tr=   r>   ÚReadProcessMemoryÚc_void_pÚbyrefÚvalueÚraw)r,   rM   rN   ÚbufÚbrÚoks         r"   Úread_memoryzStashMemoryReader.read_memory^   s¡   € àŒ~ð 	 ¨¢ °4¸.Ò3HÐ3HØ�4åÔ)¨$Ñ/Ô/ˆÝŒ_ÑÔˆÝŒ]Ô#×5Ò5ØŒNÝŒO˜DÑ!Ô!ØØÝŒL˜ÑÔñ
ô 
ˆð ð 	�"”(˜dÒ"Ð"Ø”7ˆNØˆtr!   c                ól   — |                       |d¦  «        }|rt          j        d|¦  «        d         nd S )Né   z<Ir   ©r[   ÚstructÚunpack©r,   rM   Údatas      r"   Úread_u32zStashMemoryReader.read_u32p   ó8   € Ø×Ò  aÑ(Ô(ˆØ/3Ð=�vŒ}˜T 4Ñ(Ô(¨Ô+Ð+¸Ð=r!   c                ól   — |                       |d¦  «        }|rt          j        d|¦  «        d         nd S )Né   z<Qr   r^   ra   s      r"   Úread_u64zStashMemoryReader.read_u64t   rd   r!   r   r   r   c                óh   — ||f}|| j         vrt          ||¬¦  «        | j         |<   | j         |         S )uH   Truy xuáº¥t dá»¯ liá»‡u Ã´ Ä‘á»“ tá»©c thá»�i O(1) tá»« In-Memory Cache.)r   r   )r)   r   )r,   r   r   Úkeys       r"   Úget_slot_datazStashMemoryReader.get_slot_datax   s>   € à�CˆjˆØ�d”kÐ!Ð!Ý-°#¸3Ð?Ñ?Ô?ˆDŒK˜ÑØŒ{˜3ÔÐr!   r   r   r   r   r   r   r   r   r   c           
     ó–   — ||f}t          t          j        ¦   «         dz  ¦  «        }	t          ||||||||	¬¦  «        }
|
| j        |<   |
S )u8   Cáº­p nháº­t dá»¯ liá»‡u má»™t Ã´ Ä‘á»“ trong RAM Cache.r1   )r   r   r   r   r   r   r   r   )r   r4   r   r)   )r,   r   r   r   r   r   r   r   ri   r6   rb   s              r"   Úupdate_slotzStashMemoryReader.update_slot   sd   € ð �CˆjˆÝ•T”Y‘[”[ 4Ñ'Ñ(Ô(ˆÝØØØ#ØØØØØ"ð	
ñ 	
ô 	
ˆð  ˆŒ�CÑØˆr!   Úoptical_slotsú	List[Any]c                óX  — t          t          j        ¦   «         dz  ¦  «        }|D ]ƒ}t          |dd¦  «        }t          |dd¦  «        }t          |dd¦  «        }|�L|�J|                      ||¦  «        }|sd|_        d|_        d|_        ||_        Œn|j        sd|_        ||_        Œ„dS )	uK  
        Ä�á»“ng bá»™ hai chiá»�u giá»¯a káº¿t quáº£ quÃ©t quang há»�c vÃ  RAM Cache:
        - Náº¿u quang há»�c phÃ¡t hiá»‡n Ã´ Ä‘Ã£ trá»‘ng (sau khi cáº¥t Ä‘á»“) -> Cáº­p nháº­t RAM Cache thÃ nh rá»—ng.
        - Náº¿u quang há»�c phÃ¡t hiá»‡n Ã´ cÃ³ Ä‘á»“ má»›i -> Ä�Ã¡nh dáº¥u occupied Ä‘á»ƒ sáºµn sÃ ng phÃ¢n loáº¡i.
        r1   r   Nr   r   Fr   T)r   r4   Úgetattrrj   r   r   r   r   )r,   rm   r6   Úsr   r   Úis_occÚcacheds           r"   Úsync_with_optical_matrixz*StashMemoryReader.sync_with_optical_matrix™   sÌ   € õ •T”Y‘[”[ 4Ñ'Ñ(Ô(ˆØð 	4ð 	4ˆAÝ˜!˜U DÑ)Ô)ˆCÝ˜!˜U DÑ)Ô)ˆCÝ˜Q ¨uÑ5Ô5ˆFØˆ 3 ?Ø×+Ò+¨C°Ñ5Ô5�Øð 	4à).�FÔ&Ø')�FÔ$Ø"&�F”KØ-3�FÔ*Ð*ØÔ+ð 4à)-�FÔ&Ø-3�FÔ*øð	4ð 	4r!   úList[SlotMemoryData]c                óH   — d„ | j                              ¦   «         D ¦   «         S )uS   Láº¥y danh sÃ¡ch táº¥t cáº£ cÃ¡c Ã´ Ä‘á»“ hiá»‡n Ä‘ang cÃ³ váº­t pháº©m trong tÃºi.c                ó    — g | ]}|j         ¯	|‘ŒS r    )r   ©Ú.0rq   s     r"   ú
<listcomp>z<StashMemoryReader.get_all_occupied_slots.<locals>.<listcomp>³   s   € ÐAÐAÐA�a°1´=ÐA�ÐAÐAÐAr!   ©r)   ÚvaluesrH   s    r"   Úget_all_occupied_slotsz(StashMemoryReader.get_all_occupied_slots±   s$   € àAÐA˜4œ;×-Ò-Ñ/Ô/ÐAÑAÔAÐAr!   c                ó‚   — d}| j                              ¦   «         D ]"}|j        r|j        dk    s	d|j        v r|dz  }Œ#|S )uU   Ä�áº¿m sá»‘ lÆ°á»£ng Waystone hiá»‡n Ä‘ang Ä‘Æ°á»£c xÃ¡c nháº­n cÃ³ trong tÃºi Ä‘á»“.r   ÚWAYSTONEÚWaystoner   )r)   r|   r   r   r   )r,   Úcountrq   s      r"   Úget_waystones_countz%StashMemoryReader.get_waystones_countµ   sU   € àˆØ”×#Ò#Ñ%Ô%ð 	ð 	ˆAØŒ}ð  !¤*°
Ò":Ð":¸jÈAÌKÐ>WÐ>WØ˜‘
�øØˆr!   c                óH   — d„ | j                              ¦   «         D ¦   «         S )uE   Láº¥y danh sÃ¡ch cÃ¡c Ã´ chá»©a Waystone Ä‘Ã£ Ä‘Æ°á»£c nháº­n diá»‡n.c                óH   — g | ]}|j         r|j        d k    s	d|j        v ¯|‘Œ S )r   r€   )r   r   r   rx   s     r"   rz   z8StashMemoryReader.get_waystone_slots.<locals>.<listcomp>¿   sE   € ð 
ð 
ð 
ØØŒ}ð
à"#¤*°
Ò":Ð":¸jÈAÌKÐ>WÐ>Wð Ø>WÐ>WÐ>Wr!   r{   rH   s    r"   Úget_waystone_slotsz$StashMemoryReader.get_waystone_slots½   s1   € ð
ð 
Ø”{×)Ò)Ñ+Ô+ð
ñ 
ô 
ð 	
r!   r'   )r%   r   )r.   r/   )r%   r   r.   r   )r.   r   )rM   r   rN   r   r.   rO   )rM   r   r.   r   )r   r   r   r   r.   r   )r   r   Nr   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r.   r   )rm   rn   r.   r/   )r.   ru   )r.   r   )r   r   r   r   r-   r*   r+   r;   rJ   rL   r[   rc   rg   rj   rl   rt   r}   r‚   r…   r    r!   r"   r$   r$   !   sb  € € € € € ØVÐVð"ð "ð "ð "ð "ð
ð 
ð 
ð 
ðð ð ð ð,"ð "ð "ð "ðð ð ð ð*ð *ð *ð *ðð ð ð ð$>ð >ð >ð >ð>ð >ð >ð >ð ð  ð  ð  ð ØØ"Øðð ð ð ð ð44ð 4ð 4ð 4ð0Bð Bð Bð Bðð ð ð ð
ð 
ð 
ð 
ð 
ð 
r!   r$   )r   Ú
__future__r   r<   Úosr_   r4   Údataclassesr   Útypingr   r   r   r   r	   r   r$   r    r!   r"   ú<module>rŠ      só   ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø €€€Ø €€€Ø !Ð !Ð !Ð !Ð !Ð !Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3ð ð	ð 	ð 	ð 	ð 	ñ 	ô 	ñ „ð	ða
ð a
ð a
ð a
ð a
ñ a
ô a
ð a
ð a
ð a
r!   