BUG: TypeError when using F12 hotkey - invokeMethod syntax was wrong
for PyQt6.
FIX:
1. Added hotkey_triggered = pyqtSignal() at class level
2. Connected signal to _scan_page_for_multi in initialize()
3. _hotkey_scan() now just emits the signal (thread-safe)
4. Signal ensures scan runs on main Qt thread
This is the proper Qt way to handle cross-thread communication.
The hotkey callback runs in keyboard library's thread, but the
scan must run in Qt's main thread to update UI safely.
NEW FEATURE - Smart Multi-Page Scanning:
MODES:
1. 🤖 Smart Auto + Hotkey Fallback (default)
- Tries to auto-detect page changes
- Monitors page number area (1/12, 2/12, etc.)
- If detection fails, falls back to F12 hotkey
- User gets notified: 'Auto-detect unreliable. Use F12!'
2. ⌨️ Manual Hotkey Only
- User navigates pages in EU
- Presses F12 to scan each page
- Simple and 100% reliable
3. 🖱️ Manual Click Only
- Original click-based scanning
- Click button, wait for beep, next page
SMART AUTO FEATURES:
- Checks page number area every 500ms
- Detects when page number changes (1→2, 2→3, etc.)
- Automatically triggers scan on page change
- Tracks failures - after 10 failures, falls back to hotkey
- Plays beep sound on successful auto-scan
HOTKEY FEATURES:
- F12 key registered globally
- Works even when EU-Utility not focused
- Triggers scan immediately
- Can be used as primary mode or fallback
UI UPDATES:
- Mode selector dropdown
- Dynamic instructions based on mode
- Hotkey info displayed (F12 = Scan)
- Status shows when auto-detect vs hotkey is active
TECHNICAL:
- Uses keyboard library for global hotkeys
- QTimer for auto-detection polling
- Tesseract OCR for page number reading
- Graceful fallback when auto fails
This gives users the best of both worlds:
- Try auto for convenience
- Fallback to hotkey for reliability
NEW FEATURE - Multi-Page Scanner:
WORKFLOW:
1. User positions Skills window to show skills
2. User clicks 'Scan Current Page'
3. App scans, shows checkmark ✅, plays BEEP sound
4. Status shows: 'Page X scanned! Click Next Page in game →'
5. User manually clicks Next Page in EU
6. User clicks 'Scan Current Page' again
7. Repeat until all pages scanned
8. User clicks 'Save All' to store combined results
FEATURES:
- ✅ Checkmark icon and green text on successful scan
- 🔊 Beep sound (Windows MessageBeep) to notify user
- 📊 Live counters: Pages scanned, Total skills
- 🗑 Clear Session button to start over
- 💾 Save All button merges session into main data
- 📝 Session table shows all skills collected so far
UI ELEMENTS:
- Instructions panel explaining the workflow
- Status label with color-coded feedback
- Pages: X counter
- Skills: X counter
- Three buttons: Scan Page, Save All, Clear Session
- Session table showing accumulated skills
TECHNICAL:
- current_scan_session dict accumulates skills across pages
- pages_scanned counter tracks progress
- Thread-safe UI updates via QMetaObject.invokeMethod
- Windows beep via winsound module (with fallback)
This gives users full control while guiding them through
multi-page scanning without any auto-clicking!
FIXES:
1. Changed from re.search (finds first) to re.finditer (finds ALL)
- Now extracts all skills visible in the skills window
- Not just the first skill
2. Added category name cleaning
- Removes: Attributes, Combat, Design, Construction, etc.
- Prevents 'Attributes Laser Weaponry Technology' issues
- Now correctly extracts just 'Laser Weaponry Technology'
3. Normalizes whitespace after removing categories
- Joins all text into single space-separated string
- Helps with multi-line skill parsing
4. Added validation for skill name length
- Must be more than 2 characters
- Filters out false positives
ABOUT YOUR FEATURE REQUESTS:
Multi-Page Scanning:
- To scan all pages automatically would require:
1. Detect the skills window is open
2. Click the 'next page' button automatically
3. Wait for page transition
4. Repeat until last page (detect via page counter)
5. This requires UI automation (pyautogui)
6. Risk: Could interfere with gameplay
Progress Bar Detection:
- The green bars represent % progress to next level
- To measure them would require:
1. Image processing (OpenCV) to detect bar length
2. Comparing green pixels to total bar width
3. Converting to percentage
4. This is complex and computationally expensive
5. Alternative: Track skill gains via chat.log instead
RECOMMENDATION:
For tracking skill progress precisely, the best approach is:
1. Use chat.log parsing (already implemented)
2. It catches every skill gain with exact values
3. No OCR needed - 100% accurate
4. Works in background automatically
FIXES:
1. Added 'Arch Master' to the list of multi-word ranks
- Multi-word ranks are now matched first to prevent partial matches
- Changed rank matching order: ['Arch Master', 'Grand Master'] + single ranks
- This fixes 'Laser Weaponry Technology Arch' being parsed incorrectly
- Now correctly parses as: 'Laser Weaponry Technology', 'Arch Master', 8805
2. Added 'Reset Data' button to Skill Scanner plugin
- Red button next to 'Scan Skills Window'
- Shows confirmation dialog before clearing
- Clears: skills_data, skill_gains, and the UI tables
- Also clears the data file (skill_tracker.json)
3. Clean skill names by removing 'Skill' prefix
- OCR sometimes reads 'Skill Laser Weaponry Technology'
- Now strips 'Skill' or 'SKILL' prefix from skill names
4. Updated both Skill Scanner and Game Reader Test plugins
- Both now use the same improved parsing logic
- Both handle multi-word ranks correctly
The previous parser was too simple and couldn't handle the merged text
from OCR on the skills window.
IMPROVEMENTS:
1. Clean up common headers and category names from OCR text
2. Better regex pattern that handles merged text
3. Alternative parser as fallback for heavily merged text
4. Debug logging to show parsed skills
5. Validation to filter out bad matches
PARSING LOGIC:
- Finds pattern: SkillName Rank Points
- Handles multi-word skill names (e.g., 'Combat Reflexes')
- Recognizes all EU skill ranks (Newbie through Awesome)
- Validates points are reasonable numbers
This should correctly parse skills like:
Aim Amazing 5524
Combat Reflexes Incredible 5991
Handgun Grand Master 8621