├── .all-contributorsrc ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── feature_request.md │ └── help-request.md └── stale.yml ├── .gitignore ├── .vscode └── settings.json ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Files to Use ├── Dan's Amazing CLF Base │ ├── LootFilter.json │ └── Readme.md ├── Default FilterBlade.zip ├── How to Edit CLF.txt ├── Limited_User_Game_Shortcut+Scripts.bat └── WOW FilterBlade.zip ├── Images ├── Chance.png ├── Chromatic.png ├── Fusing.png ├── Jeweller.png └── Maps.png ├── LICENSE ├── PoE-Wingman.ahk ├── README.md ├── data ├── 7za.exe ├── 7za.txt ├── ActualTierName.json ├── Affix_Equip.json ├── Affix_Lines.json ├── Affix_List.json ├── Affix_List_Double.json ├── Affix_List_Map.json ├── Base_Equip.json ├── Bases Data │ ├── Abyss Jewels.json │ ├── Active Skill Gem.json │ ├── Amulets.json │ ├── AtlasUpgradeItem.json │ ├── BasesWR.json │ ├── Belts.json │ ├── Body Armours.json │ ├── Boots.json │ ├── Bows.json │ ├── Breachstone.json │ ├── Category.json │ ├── Claws.json │ ├── Currency.json │ ├── Daggers.json │ ├── DelveSocketableCurrency.json │ ├── DelveStackableSocketableCurrency.json │ ├── DivinationCard.json │ ├── ExpeditionLogbook.json │ ├── FishingRod.json │ ├── GiftBox.json │ ├── Gloves.json │ ├── HeistBlueprint.json │ ├── HeistContract.json │ ├── HeistEquipmentReward.json │ ├── HeistEquipmentTool.json │ ├── HeistEquipmentUtility.json │ ├── HeistEquipmentWeapon.json │ ├── Helmets.json │ ├── Hybrid Flasks.json │ ├── IncubatorStackable.json │ ├── Jewels.json │ ├── Life Flasks.json │ ├── Mana Flasks.json │ ├── MapFragment.json │ ├── Maps.json │ ├── MemoryLine.json │ ├── One Hand Axes.json │ ├── One Hand Maces.json │ ├── One Hand Swords.json │ ├── QuestItem.json │ ├── Quivers.json │ ├── Relic.json │ ├── Rings.json │ ├── Rune Daggers.json │ ├── SanctumSpecialRelic.json │ ├── Sceptres.json │ ├── SentinelDrone.json │ ├── Shields.json │ ├── StackableCurrency.json │ ├── Staffs.json │ ├── Support Skill Gem.json │ ├── Thrusting One Hand Swords.json │ ├── Two Hand Axes.json │ ├── Two Hand Maces.json │ ├── Two Hand Swords.json │ ├── Utility Flasks.json │ ├── VaultKey.json │ ├── Wands.json │ └── Warstaffs.json ├── Bases.json ├── Controller.png ├── Disenchant.json ├── GGG_Stats.json ├── InventorySlots.png ├── LootFilter.ahk ├── Map_Affix.json ├── OLD_Affix.json ├── PoE Data │ ├── Abyss Jewels(Ghastly Eye Jewel).json │ ├── Abyss Jewels(Hypnotic Eye Jewel).json │ ├── Abyss Jewels(Murderous Eye Jewel).json │ ├── Abyss Jewels(Searching Eye Jewel).json │ ├── Amulets(Amulets).json │ ├── Belts(Belts).json │ ├── Blueprints(Blueprints).json │ ├── Body Armours(dex_armour).json │ ├── Body Armours(dex_int_armour).json │ ├── Body Armours(int_armour).json │ ├── Body Armours(str_armour).json │ ├── Body Armours(str_dex_armour).json │ ├── Body Armours(str_dex_int_armour).json │ ├── Body Armours(str_int_armour).json │ ├── Boots(dex_armour).json │ ├── Boots(dex_int_armour).json │ ├── Boots(int_armour).json │ ├── Boots(str_armour).json │ ├── Boots(str_dex_armour).json │ ├── Boots(str_int_armour).json │ ├── Boots(ward_armour).json │ ├── Bows(Bows).json │ ├── Category.json │ ├── Claws(Claws).json │ ├── Contracts(Contracts).json │ ├── Daggers(Daggers).json │ ├── Expedition Logbooks(Expedition Logbooks).json │ ├── Fishing Rods(Fishing Rods).json │ ├── Gloves(dex_armour).json │ ├── Gloves(dex_int_armour).json │ ├── Gloves(int_armour).json │ ├── Gloves(str_armour).json │ ├── Gloves(str_dex_armour).json │ ├── Gloves(str_int_armour).json │ ├── Gloves(ward_armour).json │ ├── Heist Brooches(Heist Brooches).json │ ├── Heist Cloaks(Heist Cloaks).json │ ├── Heist Gear(Weapon Caster).json │ ├── Heist Gear(Weapon Melee).json │ ├── Heist Gear(Weapon Ranged).json │ ├── Heist Tools(Equipment Agility).json │ ├── Heist Tools(Equipment Brute Force).json │ ├── Heist Tools(Equipment Counter Thaumaturge).json │ ├── Heist Tools(Equipment Deception).json │ ├── Heist Tools(Equipment Demolition).json │ ├── Heist Tools(Equipment Engineering).json │ ├── Heist Tools(Equipment Lockpick).json │ ├── Heist Tools(Equipment Perception).json │ ├── Heist Tools(Equipment Trap Disarmament).json │ ├── Helmets(dex_armour).json │ ├── Helmets(dex_int_armour).json │ ├── Helmets(int_armour).json │ ├── Helmets(str_armour).json │ ├── Helmets(str_dex_armour).json │ ├── Helmets(str_int_armour).json │ ├── Helmets(ward_armour).json │ ├── Hybrid Flasks(Hybrid Flasks).json │ ├── Jewels(Cobalt Jewel).json │ ├── Jewels(Crimson Jewel).json │ ├── Jewels(Prismatic Jewel).json │ ├── Jewels(Viridian Jewel).json │ ├── Large Cluster Jewels(Attack Damage While Dual Wielding).json │ ├── Large Cluster Jewels(Attack Damage).json │ ├── Large Cluster Jewels(attack damage while holding a shield).json │ ├── Large Cluster Jewels(axe and sword damage).json │ ├── Large Cluster Jewels(bow damage).json │ ├── Large Cluster Jewels(chaos damage).json │ ├── Large Cluster Jewels(cold damage).json │ ├── Large Cluster Jewels(dagger and claw damage).json │ ├── Large Cluster Jewels(damage with two handed melee weapons).json │ ├── Large Cluster Jewels(elemental damage).json │ ├── Large Cluster Jewels(fire damage).json │ ├── Large Cluster Jewels(lightning damage).json │ ├── Large Cluster Jewels(mace and staff damage).json │ ├── Large Cluster Jewels(minion damage).json │ ├── Large Cluster Jewels(physical damage).json │ ├── Large Cluster Jewels(spell damage).json │ ├── Large Cluster Jewels(wand damage).json │ ├── Life Flasks(Life Flasks).json │ ├── Mana Flasks(Mana Flasks).json │ ├── Maps(low_tier_map).json │ ├── Maps(mid_tier_map).json │ ├── Maps(top_tier_map).json │ ├── Maps(uber_tier_map).json │ ├── Medium Cluster Jewels(area damage).json │ ├── Medium Cluster Jewels(brand damage).json │ ├── Medium Cluster Jewels(channelling skill damage).json │ ├── Medium Cluster Jewels(chaos damage over time multiplier).json │ ├── Medium Cluster Jewels(cold damage over time multiplier).json │ ├── Medium Cluster Jewels(critical chance).json │ ├── Medium Cluster Jewels(damage over time multiplier).json │ ├── Medium Cluster Jewels(damage while you have a herald).json │ ├── Medium Cluster Jewels(effect of non-damaging ailments).json │ ├── Medium Cluster Jewels(fire damage over time multiplier).json │ ├── Medium Cluster Jewels(flask duration).json │ ├── Medium Cluster Jewels(life and mana recovery from flasks).json │ ├── Medium Cluster Jewels(minion damage while you have a herald).json │ ├── Medium Cluster Jewels(minion life).json │ ├── Medium Cluster Jewels(physical damage over time multiplier).json │ ├── Medium Cluster Jewels(projectile damage).json │ ├── Medium Cluster Jewels(totem damage).json │ ├── Medium Cluster Jewels(trap and mine damage).json │ ├── Medium Cluster Jewels(warcry buff effect).json │ ├── One Hand Axes(One Hand Axes).json │ ├── One Hand Maces(One Hand Maces).json │ ├── One Hand Swords(One Hand Swords).json │ ├── Quivers(Quivers).json │ ├── Relics(Large Relic).json │ ├── Relics(Medium Relic).json │ ├── Relics(Small Relic).json │ ├── Rings(Minion Rings).json │ ├── Rings(Rings).json │ ├── Rings(Unset Rings).json │ ├── Rune Daggers(Rune Daggers).json │ ├── Sanctified Relics(DEX Special Relic).json │ ├── Sanctified Relics(INT Special Relic).json │ ├── Sanctified Relics(STR Special Relic).json │ ├── Sceptres(Sceptres).json │ ├── Sextant(Awakened Sextant).json │ ├── Sextant(Elevated Sextant).json │ ├── Shields(dex_armour).json │ ├── Shields(dex_int_armour).json │ ├── Shields(int_armour).json │ ├── Shields(str_armour).json │ ├── Shields(str_dex_armour).json │ ├── Shields(str_int_armour).json │ ├── Small Cluster Jewels(armour).json │ ├── Small Cluster Jewels(chance to dodge attacks).json │ ├── Small Cluster Jewels(chaos resistance).json │ ├── Small Cluster Jewels(cold resistance).json │ ├── Small Cluster Jewels(curse effect small).json │ ├── Small Cluster Jewels(evasion).json │ ├── Small Cluster Jewels(fire resistance).json │ ├── Small Cluster Jewels(lightning resistance).json │ ├── Small Cluster Jewels(maximum energy shield).json │ ├── Small Cluster Jewels(maximum life).json │ ├── Small Cluster Jewels(maximum mana).json │ ├── Small Cluster Jewels(reservation efficiency small).json │ ├── Staves(Staves).json │ ├── Thrusting One Hand Swords(Thrusting One Hand Swords).json │ ├── Two Hand Axes(Two Hand Axes).json │ ├── Two Hand Maces(Two Hand Maces).json │ ├── Two Hand Swords(Two Hand Swords).json │ ├── Utility Flasks(Expedition Flasks).json │ ├── Utility Flasks(Utility Flasks).json │ ├── Wands(Minion Wands).json │ ├── Wands(Wands).json │ └── Warstaves(Warstaves).json ├── Quest.json ├── Uniques.json ├── WR.ico ├── WR_Affix.json ├── WR_Enchant.json ├── WR_Prop.json ├── WR_Pseudo.json ├── changelog.txt ├── changelog_Archive.txt ├── curl-formats.txt ├── curl.exe ├── curlTimes.bat ├── mtee.exe ├── mtee.txt ├── stat_translations.min.json ├── version.html └── xinput1_3.dll └── lib ├── CLASS_7za.ahk ├── CLASS_ColorPicker.ahk ├── CLASS_Craft.ahk ├── CLASS_FilterAdjuster.ahk ├── CLASS_ItemBuild.ahk ├── CLASS_ItemScan.ahk ├── CLASS_ModAlias.ahk ├── CLASS_PanelManager.ahk ├── CLASS_Perfect.ahk ├── CLASS_Progress_Slider.ahk ├── CLASS_RefreshAffixes.ahk ├── CLASS_SortByNum.ahk ├── CLASS_Util.ahk ├── ChatStashHotkeys.ahk ├── CheckAspectRatio.ahk ├── Class_FilterBuilder.ahk ├── ColorHex.ahk ├── Controller.ahk ├── CoolTime.ahk ├── DatabaseHelpers.ahk ├── FileCheck.ahk ├── FindText Helpers.ahk ├── GLOBALS.ahk ├── GameLogs.ahk ├── GuiStatus.ahk ├── Header.ahk ├── Helpers.ahk ├── Library.ahk ├── MainMenu.ahk ├── MsgMonitor.ahk ├── POE_Click.ahk ├── POE_WindowCheck.ahk ├── Rescale.ahk ├── RunAdmin.ahk ├── SaveLoad.ahk ├── ScriptObject.ahk ├── SendHotkey.ahk ├── Timers.ahk ├── Toggle.ahk ├── Tooltips.ahk ├── TrayLabels.ahk ├── TrayMenu.ahk ├── Trigger.ahk ├── api ├── CLASS_PoERequest.ahk ├── DBUpdateCheck.ahk ├── POE_UpdateLeagues.ahk ├── RefreshStatsList.ahk ├── ScrapeNinjaData.ahk └── Update.ahk ├── gui ├── Calibrate.ahk ├── CraftingPopup.ahk ├── CustomCraftingBase.ahk ├── CustomMapMods.ahk ├── DPI.ahk ├── DrawZoom.ahk ├── FlaskMenu.ahk ├── GUI helpers.ahk ├── Ignore List.ahk ├── IngameOverlay.ahk ├── ItemCrafting.ahk ├── ItemInfo.ahk ├── LootColorsMenu.ahk ├── MainMenu.ahk ├── OHB_Editor.ahk ├── PromptForObject.ahk ├── RestockMenu.ahk ├── UtilityMenu.ahk ├── WR_Menu.ahk └── perCharMenu.ahk ├── list.ahk ├── ref ├── BigA.ahk ├── CBMatchingGUI.ahk ├── CLASS_LV_Colors.ahk ├── Class_CtlColors.ahk ├── ColorRange.ahk ├── CreateScript.ahk ├── Decimal2Fraction.ahk ├── DeepClone.ahk ├── DoPoePricesRequest.ahk ├── DynaRun.ahk ├── FindText.ahk ├── GDIP.ahk ├── Hotkey.ahk ├── JSON.ahk ├── JSONcom.ahk ├── LetUserSelectRect.ahk ├── Load_Bar.ahk ├── LutBotLite.ahk ├── Notify.ahk ├── OrderedArray.ahk ├── OrderedAssociativeArray.ahk ├── Ping4.ahk ├── RadialMenu.ahk ├── TF.ahk ├── XGraph.ahk └── XInput.ahk └── routine ├── AutoLevelGems.ahk ├── ChaosRecipe.ahk ├── CheckDebuffs.ahk ├── Coord.ahk ├── Crafting.ahk ├── GemSwap.ahk ├── GrabCurrency.ahk ├── Inventory.ahk ├── Logout.ahk ├── LootScan.ahk ├── MainLogic.ahk ├── PopFlasks.ahk ├── QuickPortal.ahk ├── StackRelease.ahk └── ZoneChange.ahk /.all-contributorsrc: -------------------------------------------------------------------------------- 1 | { 2 | "files": [ 3 | "README.md" 4 | ], 5 | "imageSize": 100, 6 | "commit": false, 7 | "contributors": [ 8 | { 9 | "login": "BanditTech", 10 | "name": "BanditTech", 11 | "avatar_url": "https://avatars.githubusercontent.com/u/13251996?v=4", 12 | "profile": "https://github.com/BanditTech", 13 | "contributions": [ 14 | "code", 15 | "bug", 16 | "data", 17 | "doc", 18 | "design", 19 | "ideas", 20 | "maintenance", 21 | "projectManagement", 22 | "question", 23 | "translation", 24 | "review" 25 | ] 26 | }, 27 | { 28 | "login": "danmarzola", 29 | "name": "danmarzola", 30 | "avatar_url": "https://avatars.githubusercontent.com/u/20021542?v=4", 31 | "profile": "https://github.com/danmarzola", 32 | "contributions": [ 33 | "code", 34 | "bug", 35 | "data", 36 | "doc", 37 | "design", 38 | "ideas", 39 | "maintenance", 40 | "question" 41 | ] 42 | }, 43 | { 44 | "login": "Barragek0", 45 | "name": "Barragek0", 46 | "avatar_url": "https://avatars.githubusercontent.com/u/24503018?v=4", 47 | "profile": "https://github.com/Barragek0", 48 | "contributions": [ 49 | "code", 50 | "bug", 51 | "maintenance" 52 | ] 53 | }, 54 | { 55 | "login": "Hx2600", 56 | "name": "Hx2600", 57 | "avatar_url": "https://avatars.githubusercontent.com/u/48565218?v=4", 58 | "profile": "https://github.com/Hx2600", 59 | "contributions": [ 60 | "code" 61 | ] 62 | }, 63 | { 64 | "login": "sebbi08", 65 | "name": "Sebastian Mahr", 66 | "avatar_url": "https://avatars.githubusercontent.com/u/9070136?v=4", 67 | "profile": "https://github.com/sebbi08", 68 | "contributions": [ 69 | "code" 70 | ] 71 | }, 72 | { 73 | "login": "Sauron-Dev", 74 | "name": "Sauron-Dev", 75 | "avatar_url": "https://avatars.githubusercontent.com/u/8209987?v=4", 76 | "profile": "https://github.com/Sauron-Dev", 77 | "contributions": [ 78 | "code", 79 | "bug" 80 | ] 81 | }, 82 | { 83 | "login": "norecha", 84 | "name": "norecha", 85 | "avatar_url": "https://avatars.githubusercontent.com/u/10354246?v=4", 86 | "profile": "https://github.com/norecha", 87 | "contributions": [ 88 | "code" 89 | ] 90 | }, 91 | { 92 | "login": "Hillgrove", 93 | "name": "Hillgrove", 94 | "avatar_url": "https://avatars.githubusercontent.com/u/20029330?v=4", 95 | "profile": "https://github.com/Hillgrove", 96 | "contributions": [ 97 | "code", 98 | "data", 99 | "maintenance" 100 | ] 101 | }, 102 | { 103 | "login": "Violet-Vibes", 104 | "name": "Violet Vibes", 105 | "avatar_url": "https://avatars.githubusercontent.com/u/19490536?v=4", 106 | "profile": "https://github.com/Violet-Vibes", 107 | "contributions": [ 108 | "code" 109 | ] 110 | }, 111 | { 112 | "login": "linkeal", 113 | "name": "Alex", 114 | "avatar_url": "https://avatars.githubusercontent.com/u/11042882?v=4", 115 | "profile": "https://github.com/linkeal", 116 | "contributions": [ 117 | "code" 118 | ] 119 | }, 120 | { 121 | "login": "chrotots", 122 | "name": "chrotots", 123 | "avatar_url": "https://avatars.githubusercontent.com/u/88214590?v=4", 124 | "profile": "https://github.com/chrotots", 125 | "contributions": [ 126 | "code" 127 | ] 128 | }, 129 | { 130 | "login": "kwabam", 131 | "name": "kwabam", 132 | "avatar_url": "https://avatars.githubusercontent.com/u/32689562?v=4", 133 | "profile": "https://github.com/kwabam", 134 | "contributions": [ 135 | "data", 136 | "maintenance" 137 | ] 138 | } 139 | ], 140 | "contributorsPerLine": 7, 141 | "projectName": "WingmanReloaded", 142 | "projectOwner": "BanditTech", 143 | "repoType": "github", 144 | "repoHost": "https://github.com", 145 | "skipCi": true 146 | } 147 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: ["http://bit.ly/BanditTech-Paypal-Donate"] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report for an issue 4 | title: "[BUG]" 5 | labels: Possible Bug 6 | assignees: BanditTech 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | Are you able to reliably reproduce the issue? 13 | If this is a configuration issue, us the HELP template instead. 14 | 15 | **Expected behavior** 16 | A clear and concise description of what you expected to happen. 17 | What settings and options do you expect to have enabled. 18 | 19 | **To Reproduce** 20 | Steps to reproduce the behavior: 21 | 1. Activate '....' setting 22 | 2. Open '....' panel 23 | 3. Press '....' hotkey 24 | 4. See error 25 | 26 | **Screenshots** 27 | If applicable, add screenshots of your settings to help explain your problem. 28 | 29 | **(please complete the following information):** 30 | - Script Version: 31 | - AHK Version: 32 | - Desktop Resolution: 33 | - InGame Resolution: 34 | - Game Client language: 35 | 36 | **Additional context** 37 | Add any other context about the problem here. 38 | Provide any useful information that may apply, be descriptive as this is a major help. 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: "[REQUEST]" 5 | labels: enhancement 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request something everyone can use? Please describe.** 11 | A clear and concise description of what the tool could be useful for [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/help-request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Help request 3 | about: Ask for help with configuration 4 | title: "[HELP]" 5 | labels: Help 6 | assignees: BanditTech 7 | 8 | --- 9 | 10 | **Have you already read through the information provided on the wiki?** 11 | [WingmanReloaded Wiki](https://github.com/BanditTech/WingmanReloaded/wiki) has a lot of resources that will help you get set up. Read through the wiki pages to find information about each of the configuration tabs. Some information may be outdated, if so, let me know so that I can update it! For someplace to get started [check out the troubleshooting guide](https://github.com/BanditTech/WingmanReloaded/wiki/Trouble-Shooting-Guide) 12 | 13 | **Describe the part of the script you are having issues setting up** 14 | What steps have you already taken to set things up, which configurations have you done, what options have you changed. 15 | 16 | **Make sure the simple requirements of the script have been met** 17 | - Fullscreen windowed mode 18 | - Using a [supported aspect ratio](https://github.com/BanditTech/WingmanReloaded/wiki/Aspect-Ratio) 19 | - Update AHK to latest version 20 | 21 | **Additional context** 22 | Add any other context or screenshots about the help request here. 23 | What resolution is your game, and your desktop? 24 | What language is your game client in? 25 | Are you using non-english keyboard layout? 26 | -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | # Number of days of inactivity before an issue becomes stale 2 | daysUntilStale: 30 3 | # Number of days of inactivity before a stale issue is closed 4 | daysUntilClose: 7 5 | # Issues with these labels will never be considered stale 6 | exemptLabels: 7 | - pinned 8 | - security 9 | - Confirmed Bug 10 | # Label to use when marking an issue as stale 11 | staleLabel: stale 12 | # Comment to post when marking an issue as stale. Set to `false` to disable 13 | markComment: > 14 | This issue has been automatically marked as stale because it has not had 15 | recent activity. It will be closed if no further activity occurs in the next 7 days. Thank you 16 | for your contributions. 17 | # Comment to post when closing a stale issue. Set to `false` to disable 18 | closeComment: false 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | GitHub/ 2 | save/ 3 | temp/ 4 | logs/ 5 | backup/ 6 | data/Ninja.json 7 | data/Source.zip 8 | data/leagues.json 9 | .vscode/settings.json 10 | data/PoE.Watch_PerfectUnique.json 11 | .history 12 | .idea 13 | .vs 14 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "spellright.language": [ 3 | "en" 4 | ], 5 | "spellright.documentTypes": [ 6 | "markdown", 7 | "latex", 8 | "plaintext" 9 | ], 10 | "python.pythonPath": "C:\\Python38\\python.exe", 11 | "cSpell.words": [ 12 | "Movespeed" 13 | ] 14 | } -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team on the OwnedCore forum. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | With the project being larger and larger in scope, it has become a realization that it is good practice to advice those who would like to contribute to the code. 2 | 3 | For readablity this project is using spaces instead of tabs, with an indent of 2 spaces 4 | 5 | Allow for functions to take several lines, with fully exposed brackets and indentation of enclosed code 6 | This allows for people reading the code to see which portions belong to each other more easily. 7 | This rule should never apply to single line if/else/elseif statements, which should remain without brackets unless required. 8 | 9 | All revisions are submitted to the Alpha branch to be staged and tested before being merged to Master. 10 | 11 | Code revision is very much welcome, but we ask that functionality remains equivalent or improved. 12 | Revisions of major systems which require breaking installation must be done on their own branch before merging to Alpha 13 | -------------------------------------------------------------------------------- /Files to Use/Dan's Amazing CLF Base/Readme.md: -------------------------------------------------------------------------------- 1 | This file is used as a solid base for further customizing with your own entries. 2 | 3 | The entries in the filter will not appear inside the GUI filter editor, but will be active when scanning items. You can add and remove your own entries like normal, and they will appear on the GUI list editable. The reason for this, is that this list is using a new format of groups which is very difficult to make a GUI for. So for now its edited manually if you want more advanced group types. 4 | 5 | To modify the filter groups within this list, you will need to do so manually. This includes making changes to the stash tab which the items are sent. To quickly change the tab of the file, find and replace `"StashTab": "11"` with the tab you would rather use. 6 | 7 | Take the `LootFilter.json` file and place it within your `Save` folder, if you already have one, make sure to rename it before copying the new file. You can copy your old filter entries and paste them inside the new file. Try doing this change on a JSON compatible editor so that you can see if you have done the merge properly. 8 | 9 | When pasting in old file entries, always ensure it starts with a quoted `"keyname"`, and that they end with a comma. Paste the entries into line 2 of the file. 10 | 11 | [Here is a link to edit the filter on the cloud](https://jsoneditoronline.org/#left=cloud.08e6cc085eda44db9e19377f666ef126) -------------------------------------------------------------------------------- /Files to Use/Default FilterBlade.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BanditTech/WingmanReloaded/304830800192dd22af5e49e7f2676eea4800f4e6/Files to Use/Default FilterBlade.zip -------------------------------------------------------------------------------- /Files to Use/Limited_User_Game_Shortcut+Scripts.bat: -------------------------------------------------------------------------------- 1 | SETLOCAL 2 | ECHO OFF 3 | SET run_as=C:\Windows\System32\runas.exe 4 | 5 | REM Name of the local user account you are having launch the EXE 6 | SET local_user=ReplaceWithUserName 7 | 8 | REM Possible EXE names: PathOfExile.exe, PathOfExile_x64.exe, PathOfExileSteam.exe, PathOfExile_x64Steam.exe, PathOfExile_KG.exe, PathOfExile_x64_KG.exe 9 | SET exe_name=PathOfExile_x64.exe 10 | 11 | REM You can launch the game with additional Parameters 12 | SET exe_params=--nologo --waitforpreload 13 | 14 | REM Keep in mind because of strange reasons this one must have / instead of \ 15 | SET exe_path=C:/Program Files (x86)/Grinding Gear Games/Path of Exile/ 16 | 17 | REM Make sure to change this drive letter if not on C: drive 18 | CD C: 19 | 20 | REM Now we run the code you provided 21 | TASKLIST /fi "IMAGENAME eq %exe_name%" 2>NUL | FIND /I /N "%exe_name%">NUL 22 | IF NOT "%ERRORLEVEL%"=="0" START %run_as% /user:%local_user% /savecred "cmd /C cd /D \"%exe_path%\" && Start /high %exe_name% %exe_params%" 23 | 24 | 25 | 26 | REM --------------- 27 | REM Scripts Section 28 | REM --------------- 29 | 30 | REM Place all scripts in subfolders one directory 31 | SET scripts_path=C:\Path\To\The\Path of Exile\Scripts 32 | 33 | 34 | REM Name of the script to run 35 | SET script_1_name=PoE-Wingman.ahk 36 | REM Which subdirectory of the scripts folder 37 | SET script_1_subpath=WingmanReloaded 38 | REM What to look for as an active process in AHK 39 | SET script_1_searchString=PoE-Wingman.ahk ahk_exe AutoHotkey.exe 40 | REM Build the Path from supplied values 41 | SET script_1_path=%scripts_path%\%script_1_subpath%\%script_1_name% 42 | 43 | 44 | REM Script 2 45 | SET script_2_name=Awakened PoE Trade.exe 46 | SET script_2_searchString=ahk_exe %script_2_name% 47 | REM Build the Path 48 | SET script_2_path=C:\Program Files\Awakened PoE Trade\%script_2_name% 49 | 50 | 51 | REM Script 3 52 | SET script_3_name=POE Trades Companion.ahk 53 | SET script_3_subpath=POE-Trades Companion 54 | SET script_3_searchString=%script_3_name% ahk_exe AutoHotkey.exe 55 | REM Build the Path 56 | SET script_3_path=%scripts_path%\%script_3_subpath%\%script_3_name% 57 | 58 | 59 | REM Send script to AutoHotkey to evaluate for hidden window titles 60 | ( 61 | ECHO #NoTrayIcon 62 | ECHO SetTitleMatchMode, 2 63 | ECHO DetectHiddenWindows On 64 | ECHO If !WinExist^("%script_1_searchString%"^^^) 65 | ECHO Run %script_1_path% 66 | ECHO If !WinExist^("%script_2_searchString%"^^^) 67 | ECHO Run %script_2_path% 68 | ECHO If !WinExist^("%script_3_searchString%"^^^) 69 | ECHO Run %script_3_path% 70 | ECHO ExitApp 71 | 72 | )| "C:\Program Files\AutoHotkey\AutoHotkey.exe" * -------------------------------------------------------------------------------- /Files to Use/WOW FilterBlade.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BanditTech/WingmanReloaded/304830800192dd22af5e49e7f2676eea4800f4e6/Files to Use/WOW FilterBlade.zip -------------------------------------------------------------------------------- /Images/Chance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BanditTech/WingmanReloaded/304830800192dd22af5e49e7f2676eea4800f4e6/Images/Chance.png -------------------------------------------------------------------------------- /Images/Chromatic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BanditTech/WingmanReloaded/304830800192dd22af5e49e7f2676eea4800f4e6/Images/Chromatic.png -------------------------------------------------------------------------------- /Images/Fusing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BanditTech/WingmanReloaded/304830800192dd22af5e49e7f2676eea4800f4e6/Images/Fusing.png -------------------------------------------------------------------------------- /Images/Jeweller.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BanditTech/WingmanReloaded/304830800192dd22af5e49e7f2676eea4800f4e6/Images/Jeweller.png -------------------------------------------------------------------------------- /Images/Maps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BanditTech/WingmanReloaded/304830800192dd22af5e49e7f2676eea4800f4e6/Images/Maps.png -------------------------------------------------------------------------------- /PoE-Wingman.ahk: -------------------------------------------------------------------------------- 1 | Global VersionNumber := .16.00 2 | #Include, %A_ScriptDir%\lib\Header.ahk 3 | #Include, %A_ScriptDir%\lib\RunAdmin.ahk 4 | #Include, %A_ScriptDir%\lib\FileCheck.ahk 5 | #Include, %A_ScriptDir%\lib\TrayMenu.ahk 6 | #Include, %A_ScriptDir%\lib\ScriptObject.ahk 7 | #Include, %A_ScriptDir%\lib\GLOBALS.ahk 8 | readFromFile() 9 | CheckTime(ScriptUpdateTimeType,ScriptUpdateTimeInterval,"updateScript") 10 | checkUpdate() 11 | Critical 12 | #Include, %A_ScriptDir%\lib\gui\MainMenu.ahk 13 | #Include, %A_ScriptDir%\lib\gui\ItemInfo.ahk 14 | FirstScale() 15 | RestockMenu("Load") 16 | If (YesNinjaDatabase && DaysSince()) { 17 | DBUpdateNinja() 18 | } Else { 19 | Ninja := JSON.Load(FileOpen(A_ScriptDir "\data\Ninja.json","r").Read()) 20 | } 21 | ;CraftingBasesRequest(YesCraftingBaseAutoUpdateOnStart) 22 | Critical, Off 23 | Tooltip, 24 | 25 | #Include, %A_ScriptDir%\lib\gui\IngameOverlay.ahk 26 | If (ShowOnStart) 27 | MainMenu() 28 | If (YesChaosOverlay){ 29 | RefreshChaosRecipe() 30 | } 31 | 32 | #Include, %A_ScriptDir%\lib\Timers.ahk 33 | #Include *i %A_ScriptDir%\save\MyCustomAutoRun.ahk 34 | ; Hotkeys to reload or exit script - Hardcoded Hotkeys 35 | ; ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 36 | #IfWinActive 37 | ; Return 38 | !+^L::Array_Gui(Item) 39 | ; Reload Script with Alt+Escape 40 | !Escape:: 41 | BlockInput, MouseMoveOff 42 | Reload 43 | return 44 | ; Exit Script with Win+Escape 45 | #Escape:: 46 | BlockInput, MouseMoveOff 47 | ExitApp 48 | return 49 | #IfWinActive, ahk_group POEGameGroup 50 | ; ------------------------------------------------End of AutoExecute Section----------------------------------------------------------------------------------------------------------- 51 | Return 52 | 53 | #Include, %A_ScriptDir%\lib\Library.ahk 54 | -------------------------------------------------------------------------------- /data/7za.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BanditTech/WingmanReloaded/304830800192dd22af5e49e7f2676eea4800f4e6/data/7za.exe -------------------------------------------------------------------------------- /data/7za.txt: -------------------------------------------------------------------------------- 1 | 7-Zip Extra 19.00 2 | ----------------- 3 | 4 | 7-Zip Extra is package of extra modules of 7-Zip. 5 | 6 | 7-Zip Copyright (C) 1999-2019 Igor Pavlov. 7 | 8 | 7-Zip is free software. Read License.txt for more information about license. 9 | 10 | Source code of binaries can be found at: 11 | http://www.7-zip.org/ 12 | 13 | This package contains the following files: 14 | 15 | 7za.exe - standalone console version of 7-Zip with reduced formats support. 16 | 7za.dll - library for working with 7z archives 17 | 7zxa.dll - library for extracting from 7z archives 18 | License.txt - license information 19 | readme.txt - this file 20 | 21 | Far\ - plugin for Far Manager 22 | x64\ - binaries for x64 23 | 24 | 25 | All 32-bit binaries can work in: 26 | Windows 2000 / 2003 / 2008 / XP / Vista / 7 / 8 / 10 27 | and in any Windows x64 version with WoW64 support. 28 | All x64 binaries can work in any Windows x64 version. 29 | 30 | All binaries use msvcrt.dll. 31 | 32 | 7za.exe 33 | ------- 34 | 35 | 7za.exe - is a standalone console version of 7-Zip with reduced formats support. 36 | 37 | Extra: 7za.exe : support for only some formats of 7-Zip. 38 | 7-Zip: 7z.exe with 7z.dll : support for all formats of 7-Zip. 39 | 40 | 7za.exe and 7z.exe from 7-Zip have same command line interface. 41 | 7za.exe doesn't use external DLL files. 42 | 43 | You can read Help File (7-zip.chm) from 7-Zip package for description 44 | of all commands and switches for 7za.exe and 7z.exe. 45 | 46 | 7za.exe features: 47 | 48 | - High compression ratio in 7z format 49 | - Supported formats: 50 | - Packing / unpacking: 7z, xz, ZIP, GZIP, BZIP2 and TAR 51 | - Unpacking only: Z, lzma, CAB. 52 | - Highest compression ratio for ZIP and GZIP formats. 53 | - Fast compression and decompression 54 | - Strong AES-256 encryption in 7z and ZIP formats. 55 | 56 | Note: LZMA SDK contains 7zr.exe - more reduced version of 7za.exe. 57 | But you can use 7zr.exe as "public domain" code. 58 | 59 | 60 | 61 | DLL files 62 | --------- 63 | 64 | 7za.dll and 7zxa.dll are reduced versions of 7z.dll from 7-Zip. 65 | 7za.dll and 7zxa.dll support only 7z format. 66 | Note: 7z.dll is main DLL file that works with all archive types in 7-Zip. 67 | 68 | 7za.dll and 7zxa.dll support the following decoding methods: 69 | - LZMA, LZMA2, PPMD, BCJ, BCJ2, COPY, 7zAES, BZip2, Deflate. 70 | 71 | 7za.dll also supports 7z encoding with the following encoding methods: 72 | - LZMA, LZMA2, PPMD, BCJ, BCJ2, COPY, 7zAES. 73 | 74 | 7za.dll and 7zxa.dll work via COM interfaces. 75 | But these DLLs don't use standard COM interfaces for objects creating. 76 | 77 | Look also example code that calls DLL functions (in source code of 7-Zip): 78 | 79 | 7zip\UI\Client7z 80 | 81 | Another example of binary that uses these interface is 7-Zip itself. 82 | The following binaries from 7-Zip use 7z.dll: 83 | - 7z.exe (console version) 84 | - 7zG.exe (GUI version) 85 | - 7zFM.exe (7-Zip File Manager) 86 | 87 | Note: The source code of LZMA SDK also contains the code for similar DLLs 88 | (DLLs without BZip2, Deflate support). And these files from LZMA SDK can be 89 | used as "public domain" code. If you use LZMA SDK files, you don't need to 90 | follow GNU LGPL rules, if you want to change the code. 91 | 92 | 93 | 94 | 95 | License FAQ 96 | ----------- 97 | 98 | Can I use the EXE or DLL files from 7-Zip in a commercial application? 99 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 100 | Yes, but you are required to specify in documentation for your application: 101 | (1) that you used parts of the 7-Zip program, 102 | (2) that 7-Zip is licensed under the GNU LGPL license and 103 | (3) you must give a link to www.7-zip.org, where the source code can be found. 104 | 105 | 106 | Can I use the source code of 7-Zip in a commercial application? 107 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 108 | Since 7-Zip is licensed under the GNU LGPL you must follow the rules of that license. 109 | In brief, it means that any LGPL'ed code must remain licensed under the LGPL. 110 | For instance, you can change the code from 7-Zip or write a wrapper for some 111 | code from 7-Zip and compile it into a DLL; but, the source code of that DLL 112 | (including your modifications / additions / wrapper) must be licensed under 113 | the LGPL or GPL. 114 | Any other code in your application can be licensed as you wish. This scheme allows 115 | users and developers to change LGPL'ed code and recompile that DLL. That is the 116 | idea of free software. Read more here: http://www.gnu.org/. 117 | 118 | 119 | 120 | Note: You can look also LZMA SDK, which is available under a more liberal license. 121 | 122 | 123 | --- 124 | End of document 125 | -------------------------------------------------------------------------------- /data/Affix_List_Map.json: -------------------------------------------------------------------------------- 1 | [ 2 | "Area contains many Totems", 3 | "Rare Monsters each have a Nemesis Mod", 4 | "#% more Rare Monsters", 5 | "Magic Monster Packs each have a Bloodline Mod", 6 | "#% more Magic Monsters", 7 | "Area is inhabited by # additional Rogue Exiles", 8 | "Area is inhabited by Skeletons", 9 | "Area is inhabited by Goatmen", 10 | "Area is inhabited by Sea Witches and their Spawn", 11 | "Area is inhabited by Undead", 12 | "Area is inhabited by ranged monsters", 13 | "Area is inhabited by Animals", 14 | "Area is inhabited by Demons", 15 | "Area is inhabited by Humanoids", 16 | "Area is inhabited by Solaris fanatics", 17 | "Area is inhabited by Lunaris fanatics", 18 | "Area is inhabited by Ghosts", 19 | "Area is inhabited by Cultists of Kitava", 20 | "Area has increased monster variety", 21 | "Monsters' skills Chain # additional times", 22 | "Monsters Poison on Hit", 23 | "Slaying Enemies close together has a #% chance to attract monsters from Beyond", 24 | "Players have Elemental Equilibrium", 25 | "Area contains two Unique Bosses", 26 | "Monsters cannot be Stunned", 27 | "#% more Monster Life", 28 | "Monsters fire # additional Projectiles", 29 | "Monsters have #% increased Area of Effect", 30 | "Monsters have #% increased Critical Strike Chance", 31 | "+#% to Monster Critical Strike Multiplier", 32 | "+#% Monster Physical Damage Reduction", 33 | "#% increased Monster Damage", 34 | "Monsters deal #% extra Physical Damage as Fire", 35 | "Monsters deal #% extra Physical Damage as Cold", 36 | "Monsters deal #% extra Physical Damage as Lightning", 37 | "#% increased Monster Movement Speed", 38 | "#% increased Monster Attack Speed", 39 | "% increased Monster Cast Speed", 40 | "Monsters reflect #% of Physical Damage", 41 | "Monsters reflect #% of Elemental Damage", 42 | "Players have #% less Recovery Rate of Life and Energy Shield", 43 | "Area has patches of Burning Ground", 44 | "Area has patches of Chilled Ground", 45 | "Area has patches of Shocked Ground which increase Damage taken by #%", 46 | "Area has patches of desecrated ground", 47 | "Unique Boss deals #% increased Damage", 48 | "Unique Boss has #% increased Attack and Cast Speed", 49 | "Unique Boss has #% increased Life", 50 | "Unique Boss has #% increased Area of Effect", 51 | "Monsters have #% chance to Avoid Elemental Ailments", 52 | "Monsters take #% reduced Extra Damage from Critical Strikes", 53 | "Players gain #% reduced Flask Charges", 54 | "#% less effect of Curses on Monsters", 55 | "Area is inhabited by Abominations", 56 | "Monsters' Action Speed cannot be modified to below base value", 57 | "Monsters cannot be Taunted", 58 | "All Monster Damage from Hits always Ignites", 59 | "+#% Monster Chaos Resistance", 60 | "+#% Monster Elemental Resistance", 61 | "Monsters have a #% chance to avoid Poison, Blind, and Bleeding", 62 | "Players have Point Blank", 63 | "Players have #% reduced Chance to Block", 64 | "Players have #% less Armour", 65 | "Player chance to Dodge is Unlucky", 66 | "Monsters have #% increased Accuracy Rating", 67 | "Players have #% less Area of Effect", 68 | "Monsters gain a Frenzy Charge on Hit", 69 | "Monsters gain an Endurance Charge on Hit", 70 | "Monsters gain a Power Charge on Hit", 71 | "Players are Cursed with Elemental Weakness", 72 | "Players are Cursed with Vulnerability", 73 | "Players are Cursed with Enfeeble", 74 | "Players are Cursed with Temporal Chains", 75 | "Players cannot Regenerate Life, Mana or Energy Shield", 76 | "-#% maximum Player Resistances", 77 | "Monsters have a #% chance to cause Elemental Ailments on Hit", 78 | "Monsters are Hexproof", 79 | "Cannot Leech Life from Monsters", 80 | "Cannot Leech Mana from Monsters" 81 | ] -------------------------------------------------------------------------------- /data/Bases Data/Abyss Jewels.json: -------------------------------------------------------------------------------- 1 | { 2 | "Murderous Eye Jewel": { 3 | "drop_level": 1, 4 | "implicits": [], 5 | "inventory_height": 1, 6 | "inventory_width": 1, 7 | "properties": { 8 | "armour": null, 9 | "energy_shield": null, 10 | "evasion": null, 11 | "movement_speed": null, 12 | "block": null, 13 | "description": null, 14 | "directions": null, 15 | "stack_size": null, 16 | "stack_size_currency_tab": null, 17 | "full_stack_turns_into": null, 18 | "charges_max": null, 19 | "charges_per_use": null, 20 | "duration": null, 21 | "life_per_use": null, 22 | "mana_per_use": null, 23 | "attack_time": null, 24 | "critical_strike_chance": null, 25 | "physical_damage_max": null, 26 | "physical_damage_min": null, 27 | "range": null 28 | } 29 | }, 30 | "Searching Eye Jewel": { 31 | "drop_level": 1, 32 | "implicits": [], 33 | "inventory_height": 1, 34 | "inventory_width": 1, 35 | "properties": { 36 | "armour": null, 37 | "energy_shield": null, 38 | "evasion": null, 39 | "movement_speed": null, 40 | "block": null, 41 | "description": null, 42 | "directions": null, 43 | "stack_size": null, 44 | "stack_size_currency_tab": null, 45 | "full_stack_turns_into": null, 46 | "charges_max": null, 47 | "charges_per_use": null, 48 | "duration": null, 49 | "life_per_use": null, 50 | "mana_per_use": null, 51 | "attack_time": null, 52 | "critical_strike_chance": null, 53 | "physical_damage_max": null, 54 | "physical_damage_min": null, 55 | "range": null 56 | } 57 | }, 58 | "Hypnotic Eye Jewel": { 59 | "drop_level": 1, 60 | "implicits": [], 61 | "inventory_height": 1, 62 | "inventory_width": 1, 63 | "properties": { 64 | "armour": null, 65 | "energy_shield": null, 66 | "evasion": null, 67 | "movement_speed": null, 68 | "block": null, 69 | "description": null, 70 | "directions": null, 71 | "stack_size": null, 72 | "stack_size_currency_tab": null, 73 | "full_stack_turns_into": null, 74 | "charges_max": null, 75 | "charges_per_use": null, 76 | "duration": null, 77 | "life_per_use": null, 78 | "mana_per_use": null, 79 | "attack_time": null, 80 | "critical_strike_chance": null, 81 | "physical_damage_max": null, 82 | "physical_damage_min": null, 83 | "range": null 84 | } 85 | }, 86 | "Ghastly Eye Jewel": { 87 | "drop_level": 1, 88 | "implicits": [], 89 | "inventory_height": 1, 90 | "inventory_width": 1, 91 | "properties": { 92 | "armour": null, 93 | "energy_shield": null, 94 | "evasion": null, 95 | "movement_speed": null, 96 | "block": null, 97 | "description": null, 98 | "directions": null, 99 | "stack_size": null, 100 | "stack_size_currency_tab": null, 101 | "full_stack_turns_into": null, 102 | "charges_max": null, 103 | "charges_per_use": null, 104 | "duration": null, 105 | "life_per_use": null, 106 | "mana_per_use": null, 107 | "attack_time": null, 108 | "critical_strike_chance": null, 109 | "physical_damage_max": null, 110 | "physical_damage_min": null, 111 | "range": null 112 | } 113 | } 114 | } -------------------------------------------------------------------------------- /data/Bases Data/Category.json: -------------------------------------------------------------------------------- 1 | { 2 | "StackableCurrency": "", 3 | "DelveSocketableCurrency": "", 4 | "DelveStackableSocketableCurrency": "", 5 | "GiftBox": "", 6 | "FishingRod": "", 7 | "Boots": "", 8 | "Gloves": "", 9 | "QuestItem": "", 10 | "Active Skill Gem": "", 11 | "Support Skill Gem": "", 12 | "MapFragment": "", 13 | "Breachstone": "", 14 | "VaultKey": "", 15 | "DivinationCard": "", 16 | "Currency": "", 17 | "IncubatorStackable": "", 18 | "AtlasUpgradeItem": "", 19 | "HeistContract": "", 20 | "HeistBlueprint": "", 21 | "HeistEquipmentWeapon": "", 22 | "HeistEquipmentTool": "", 23 | "HeistEquipmentUtility": "", 24 | "HeistEquipmentReward": "", 25 | "ExpeditionLogbook": "", 26 | "SentinelDrone": "", 27 | "Relic": "", 28 | "SanctumSpecialRelic": "", 29 | "MemoryLine": "", 30 | "Two Hand Swords": "", 31 | "Wands": "", 32 | "Daggers": "", 33 | "Rune Daggers": "", 34 | "Claws": "", 35 | "One Hand Axes": "", 36 | "One Hand Swords": "", 37 | "Thrusting One Hand Swords": "", 38 | "One Hand Maces": "", 39 | "Sceptres": "", 40 | "Bows": "", 41 | "Staffs": "", 42 | "Warstaffs": "", 43 | "Two Hand Axes": "", 44 | "Two Hand Maces": "", 45 | "Rings": "", 46 | "Amulets": "", 47 | "Belts": "", 48 | "Shields": "", 49 | "Helmets": "", 50 | "Body Armours": "", 51 | "Life Flasks": "", 52 | "Mana Flasks": "", 53 | "Hybrid Flasks": "", 54 | "Utility Flasks": "", 55 | "Quivers": "", 56 | "Jewels": "", 57 | "Abyss Jewels": "", 58 | "Maps": "" 59 | } -------------------------------------------------------------------------------- /data/Bases Data/Currency.json: -------------------------------------------------------------------------------- 1 | { 2 | "Mystery Leaguestone": { 3 | "drop_level": 1, 4 | "implicits": [], 5 | "inventory_height": 1, 6 | "inventory_width": 1, 7 | "properties": { 8 | "armour": null, 9 | "energy_shield": null, 10 | "evasion": null, 11 | "movement_speed": null, 12 | "block": null, 13 | "description": "Contains an unknown Leaguestone.", 14 | "directions": "", 15 | "stack_size": 1, 16 | "stack_size_currency_tab": 0, 17 | "full_stack_turns_into": null, 18 | "charges_max": null, 19 | "charges_per_use": null, 20 | "duration": null, 21 | "life_per_use": null, 22 | "mana_per_use": null, 23 | "attack_time": null, 24 | "critical_strike_chance": null, 25 | "physical_damage_max": null, 26 | "physical_damage_min": null, 27 | "range": null 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /data/Bases Data/ExpeditionLogbook.json: -------------------------------------------------------------------------------- 1 | { 2 | "Expedition Logbook": { 3 | "drop_level": 1, 4 | "implicits": [], 5 | "inventory_height": 1, 6 | "inventory_width": 1, 7 | "properties": { 8 | "armour": null, 9 | "energy_shield": null, 10 | "evasion": null, 11 | "movement_speed": null, 12 | "block": null, 13 | "description": null, 14 | "directions": null, 15 | "stack_size": null, 16 | "stack_size_currency_tab": null, 17 | "full_stack_turns_into": null, 18 | "charges_max": null, 19 | "charges_per_use": null, 20 | "duration": null, 21 | "life_per_use": null, 22 | "mana_per_use": null, 23 | "attack_time": null, 24 | "critical_strike_chance": null, 25 | "physical_damage_max": null, 26 | "physical_damage_min": null, 27 | "range": null 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /data/Bases Data/FishingRod.json: -------------------------------------------------------------------------------- 1 | { 2 | "Fishing Rod": { 3 | "drop_level": 1, 4 | "implicits": [], 5 | "inventory_height": 4, 6 | "inventory_width": 1, 7 | "properties": { 8 | "armour": null, 9 | "energy_shield": null, 10 | "evasion": null, 11 | "movement_speed": null, 12 | "block": null, 13 | "description": null, 14 | "directions": null, 15 | "stack_size": null, 16 | "stack_size_currency_tab": null, 17 | "full_stack_turns_into": null, 18 | "charges_max": null, 19 | "charges_per_use": null, 20 | "duration": null, 21 | "life_per_use": null, 22 | "mana_per_use": null, 23 | "attack_time": 833, 24 | "critical_strike_chance": 500, 25 | "physical_damage_max": 15, 26 | "physical_damage_min": 8, 27 | "range": 13 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /data/Bases Data/GiftBox.json: -------------------------------------------------------------------------------- 1 | { 2 | "Wrapped Gift": { 3 | "drop_level": 1, 4 | "implicits": [], 5 | "inventory_height": 1, 6 | "inventory_width": 4, 7 | "properties": { 8 | "armour": null, 9 | "energy_shield": null, 10 | "evasion": null, 11 | "movement_speed": null, 12 | "block": null, 13 | "description": "", 14 | "directions": "Right click on this item to open it.", 15 | "stack_size": 1, 16 | "stack_size_currency_tab": 0, 17 | "full_stack_turns_into": null, 18 | "charges_max": null, 19 | "charges_per_use": null, 20 | "duration": null, 21 | "life_per_use": null, 22 | "mana_per_use": null, 23 | "attack_time": null, 24 | "critical_strike_chance": null, 25 | "physical_damage_max": null, 26 | "physical_damage_min": null, 27 | "range": null 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /data/Bases Data/HeistEquipmentReward.json: -------------------------------------------------------------------------------- 1 | { 2 | "[UNUSED] Heist Test Reward Equipment": { 3 | "drop_level": 1, 4 | "implicits": [], 5 | "inventory_height": 1, 6 | "inventory_width": 1, 7 | "properties": { 8 | "armour": null, 9 | "energy_shield": null, 10 | "evasion": null, 11 | "movement_speed": null, 12 | "block": null, 13 | "description": null, 14 | "directions": null, 15 | "stack_size": null, 16 | "stack_size_currency_tab": null, 17 | "full_stack_turns_into": null, 18 | "charges_max": null, 19 | "charges_per_use": null, 20 | "duration": null, 21 | "life_per_use": null, 22 | "mana_per_use": null, 23 | "attack_time": null, 24 | "critical_strike_chance": null, 25 | "physical_damage_max": null, 26 | "physical_damage_min": null, 27 | "range": null 28 | } 29 | }, 30 | "Silver Brooch": { 31 | "drop_level": 60, 32 | "implicits": [ 33 | "(11-15)% increased Rarity of Items dropped in Heists" 34 | ], 35 | "inventory_height": 1, 36 | "inventory_width": 1, 37 | "properties": { 38 | "armour": null, 39 | "energy_shield": null, 40 | "evasion": null, 41 | "movement_speed": null, 42 | "block": null, 43 | "description": null, 44 | "directions": null, 45 | "stack_size": null, 46 | "stack_size_currency_tab": null, 47 | "full_stack_turns_into": null, 48 | "charges_max": null, 49 | "charges_per_use": null, 50 | "duration": null, 51 | "life_per_use": null, 52 | "mana_per_use": null, 53 | "attack_time": null, 54 | "critical_strike_chance": null, 55 | "physical_damage_max": null, 56 | "physical_damage_min": null, 57 | "range": null 58 | } 59 | }, 60 | "Golden Brooch": { 61 | "drop_level": 75, 62 | "implicits": [ 63 | "(16-20)% increased Rarity of Items dropped in Heists" 64 | ], 65 | "inventory_height": 1, 66 | "inventory_width": 1, 67 | "properties": { 68 | "armour": null, 69 | "energy_shield": null, 70 | "evasion": null, 71 | "movement_speed": null, 72 | "block": null, 73 | "description": null, 74 | "directions": null, 75 | "stack_size": null, 76 | "stack_size_currency_tab": null, 77 | "full_stack_turns_into": null, 78 | "charges_max": null, 79 | "charges_per_use": null, 80 | "duration": null, 81 | "life_per_use": null, 82 | "mana_per_use": null, 83 | "attack_time": null, 84 | "critical_strike_chance": null, 85 | "physical_damage_max": null, 86 | "physical_damage_min": null, 87 | "range": null 88 | } 89 | }, 90 | "Enamel Brooch": { 91 | "drop_level": 80, 92 | "implicits": [ 93 | "(21-25)% increased Rarity of Items dropped in Heists" 94 | ], 95 | "inventory_height": 1, 96 | "inventory_width": 1, 97 | "properties": { 98 | "armour": null, 99 | "energy_shield": null, 100 | "evasion": null, 101 | "movement_speed": null, 102 | "block": null, 103 | "description": null, 104 | "directions": null, 105 | "stack_size": null, 106 | "stack_size_currency_tab": null, 107 | "full_stack_turns_into": null, 108 | "charges_max": null, 109 | "charges_per_use": null, 110 | "duration": null, 111 | "life_per_use": null, 112 | "mana_per_use": null, 113 | "attack_time": null, 114 | "critical_strike_chance": null, 115 | "physical_damage_max": null, 116 | "physical_damage_min": null, 117 | "range": null 118 | } 119 | }, 120 | "Foliate Brooch": { 121 | "drop_level": 83, 122 | "implicits": [ 123 | "(26-30)% increased Rarity of Items dropped in Heists" 124 | ], 125 | "inventory_height": 1, 126 | "inventory_width": 1, 127 | "properties": { 128 | "armour": null, 129 | "energy_shield": null, 130 | "evasion": null, 131 | "movement_speed": null, 132 | "block": null, 133 | "description": null, 134 | "directions": null, 135 | "stack_size": null, 136 | "stack_size_currency_tab": null, 137 | "full_stack_turns_into": null, 138 | "charges_max": null, 139 | "charges_per_use": null, 140 | "duration": null, 141 | "life_per_use": null, 142 | "mana_per_use": null, 143 | "attack_time": null, 144 | "critical_strike_chance": null, 145 | "physical_damage_max": null, 146 | "physical_damage_min": null, 147 | "range": null 148 | } 149 | } 150 | } -------------------------------------------------------------------------------- /data/Bases Data/HeistEquipmentUtility.json: -------------------------------------------------------------------------------- 1 | { 2 | "[UNUSED] Heist Test Utility Equipment": { 3 | "drop_level": 1, 4 | "implicits": [], 5 | "inventory_height": 2, 6 | "inventory_width": 2, 7 | "properties": { 8 | "armour": null, 9 | "energy_shield": null, 10 | "evasion": null, 11 | "movement_speed": null, 12 | "block": null, 13 | "description": null, 14 | "directions": null, 15 | "stack_size": null, 16 | "stack_size_currency_tab": null, 17 | "full_stack_turns_into": null, 18 | "charges_max": null, 19 | "charges_per_use": null, 20 | "duration": null, 21 | "life_per_use": null, 22 | "mana_per_use": null, 23 | "attack_time": null, 24 | "critical_strike_chance": null, 25 | "physical_damage_max": null, 26 | "physical_damage_min": null, 27 | "range": null 28 | } 29 | }, 30 | "Torn Cloak": { 31 | "drop_level": 60, 32 | "implicits": [ 33 | "2% reduced raising of Alert Level" 34 | ], 35 | "inventory_height": 2, 36 | "inventory_width": 2, 37 | "properties": { 38 | "armour": null, 39 | "energy_shield": null, 40 | "evasion": null, 41 | "movement_speed": null, 42 | "block": null, 43 | "description": null, 44 | "directions": null, 45 | "stack_size": null, 46 | "stack_size_currency_tab": null, 47 | "full_stack_turns_into": null, 48 | "charges_max": null, 49 | "charges_per_use": null, 50 | "duration": null, 51 | "life_per_use": null, 52 | "mana_per_use": null, 53 | "attack_time": null, 54 | "critical_strike_chance": null, 55 | "physical_damage_max": null, 56 | "physical_damage_min": null, 57 | "range": null 58 | } 59 | }, 60 | "Tattered Cloak": { 61 | "drop_level": 75, 62 | "implicits": [ 63 | "3% reduced raising of Alert Level" 64 | ], 65 | "inventory_height": 2, 66 | "inventory_width": 2, 67 | "properties": { 68 | "armour": null, 69 | "energy_shield": null, 70 | "evasion": null, 71 | "movement_speed": null, 72 | "block": null, 73 | "description": null, 74 | "directions": null, 75 | "stack_size": null, 76 | "stack_size_currency_tab": null, 77 | "full_stack_turns_into": null, 78 | "charges_max": null, 79 | "charges_per_use": null, 80 | "duration": null, 81 | "life_per_use": null, 82 | "mana_per_use": null, 83 | "attack_time": null, 84 | "critical_strike_chance": null, 85 | "physical_damage_max": null, 86 | "physical_damage_min": null, 87 | "range": null 88 | } 89 | }, 90 | "Hooded Cloak": { 91 | "drop_level": 80, 92 | "implicits": [ 93 | "4% reduced raising of Alert Level" 94 | ], 95 | "inventory_height": 2, 96 | "inventory_width": 2, 97 | "properties": { 98 | "armour": null, 99 | "energy_shield": null, 100 | "evasion": null, 101 | "movement_speed": null, 102 | "block": null, 103 | "description": null, 104 | "directions": null, 105 | "stack_size": null, 106 | "stack_size_currency_tab": null, 107 | "full_stack_turns_into": null, 108 | "charges_max": null, 109 | "charges_per_use": null, 110 | "duration": null, 111 | "life_per_use": null, 112 | "mana_per_use": null, 113 | "attack_time": null, 114 | "critical_strike_chance": null, 115 | "physical_damage_max": null, 116 | "physical_damage_min": null, 117 | "range": null 118 | } 119 | }, 120 | "Whisper-woven Cloak": { 121 | "drop_level": 83, 122 | "implicits": [ 123 | "5% reduced raising of Alert Level" 124 | ], 125 | "inventory_height": 2, 126 | "inventory_width": 2, 127 | "properties": { 128 | "armour": null, 129 | "energy_shield": null, 130 | "evasion": null, 131 | "movement_speed": null, 132 | "block": null, 133 | "description": null, 134 | "directions": null, 135 | "stack_size": null, 136 | "stack_size_currency_tab": null, 137 | "full_stack_turns_into": null, 138 | "charges_max": null, 139 | "charges_per_use": null, 140 | "duration": null, 141 | "life_per_use": null, 142 | "mana_per_use": null, 143 | "attack_time": null, 144 | "critical_strike_chance": null, 145 | "physical_damage_max": null, 146 | "physical_damage_min": null, 147 | "range": null 148 | } 149 | } 150 | } -------------------------------------------------------------------------------- /data/Bases Data/Hybrid Flasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "Small Hybrid Flask": { 3 | "drop_level": 10, 4 | "implicits": [], 5 | "inventory_height": 2, 6 | "inventory_width": 1, 7 | "properties": { 8 | "armour": null, 9 | "energy_shield": null, 10 | "evasion": null, 11 | "movement_speed": null, 12 | "block": null, 13 | "description": null, 14 | "directions": null, 15 | "stack_size": null, 16 | "stack_size_currency_tab": null, 17 | "full_stack_turns_into": null, 18 | "charges_max": 40, 19 | "charges_per_use": 20, 20 | "duration": 50, 21 | "life_per_use": 100, 22 | "mana_per_use": 70, 23 | "attack_time": null, 24 | "critical_strike_chance": null, 25 | "physical_damage_max": null, 26 | "physical_damage_min": null, 27 | "range": null 28 | } 29 | }, 30 | "Medium Hybrid Flask": { 31 | "drop_level": 20, 32 | "implicits": [], 33 | "inventory_height": 2, 34 | "inventory_width": 1, 35 | "properties": { 36 | "armour": null, 37 | "energy_shield": null, 38 | "evasion": null, 39 | "movement_speed": null, 40 | "block": null, 41 | "description": null, 42 | "directions": null, 43 | "stack_size": null, 44 | "stack_size_currency_tab": null, 45 | "full_stack_turns_into": null, 46 | "charges_max": 40, 47 | "charges_per_use": 20, 48 | "duration": 50, 49 | "life_per_use": 230, 50 | "mana_per_use": 100, 51 | "attack_time": null, 52 | "critical_strike_chance": null, 53 | "physical_damage_max": null, 54 | "physical_damage_min": null, 55 | "range": null 56 | } 57 | }, 58 | "Large Hybrid Flask": { 59 | "drop_level": 30, 60 | "implicits": [], 61 | "inventory_height": 2, 62 | "inventory_width": 1, 63 | "properties": { 64 | "armour": null, 65 | "energy_shield": null, 66 | "evasion": null, 67 | "movement_speed": null, 68 | "block": null, 69 | "description": null, 70 | "directions": null, 71 | "stack_size": null, 72 | "stack_size_currency_tab": null, 73 | "full_stack_turns_into": null, 74 | "charges_max": 40, 75 | "charges_per_use": 20, 76 | "duration": 50, 77 | "life_per_use": 510, 78 | "mana_per_use": 140, 79 | "attack_time": null, 80 | "critical_strike_chance": null, 81 | "physical_damage_max": null, 82 | "physical_damage_min": null, 83 | "range": null 84 | } 85 | }, 86 | "Colossal Hybrid Flask": { 87 | "drop_level": 40, 88 | "implicits": [], 89 | "inventory_height": 2, 90 | "inventory_width": 1, 91 | "properties": { 92 | "armour": null, 93 | "energy_shield": null, 94 | "evasion": null, 95 | "movement_speed": null, 96 | "block": null, 97 | "description": null, 98 | "directions": null, 99 | "stack_size": null, 100 | "stack_size_currency_tab": null, 101 | "full_stack_turns_into": null, 102 | "charges_max": 40, 103 | "charges_per_use": 20, 104 | "duration": 50, 105 | "life_per_use": 690, 106 | "mana_per_use": 200, 107 | "attack_time": null, 108 | "critical_strike_chance": null, 109 | "physical_damage_max": null, 110 | "physical_damage_min": null, 111 | "range": null 112 | } 113 | }, 114 | "Sacred Hybrid Flask": { 115 | "drop_level": 50, 116 | "implicits": [], 117 | "inventory_height": 2, 118 | "inventory_width": 1, 119 | "properties": { 120 | "armour": null, 121 | "energy_shield": null, 122 | "evasion": null, 123 | "movement_speed": null, 124 | "block": null, 125 | "description": null, 126 | "directions": null, 127 | "stack_size": null, 128 | "stack_size_currency_tab": null, 129 | "full_stack_turns_into": null, 130 | "charges_max": 40, 131 | "charges_per_use": 20, 132 | "duration": 50, 133 | "life_per_use": 1440, 134 | "mana_per_use": 400, 135 | "attack_time": null, 136 | "critical_strike_chance": null, 137 | "physical_damage_max": null, 138 | "physical_damage_min": null, 139 | "range": null 140 | } 141 | }, 142 | "Hallowed Hybrid Flask": { 143 | "drop_level": 60, 144 | "implicits": [], 145 | "inventory_height": 2, 146 | "inventory_width": 1, 147 | "properties": { 148 | "armour": null, 149 | "energy_shield": null, 150 | "evasion": null, 151 | "movement_speed": null, 152 | "block": null, 153 | "description": null, 154 | "directions": null, 155 | "stack_size": null, 156 | "stack_size_currency_tab": null, 157 | "full_stack_turns_into": null, 158 | "charges_max": 40, 159 | "charges_per_use": 20, 160 | "duration": 50, 161 | "life_per_use": 1740, 162 | "mana_per_use": 480, 163 | "attack_time": null, 164 | "critical_strike_chance": null, 165 | "physical_damage_max": null, 166 | "physical_damage_min": null, 167 | "range": null 168 | } 169 | } 170 | } -------------------------------------------------------------------------------- /data/Bases Data/MemoryLine.json: -------------------------------------------------------------------------------- 1 | { 2 | "Kirac's Memory": { 3 | "drop_level": 81, 4 | "implicits": [], 5 | "inventory_height": 1, 6 | "inventory_width": 1, 7 | "properties": { 8 | "armour": null, 9 | "energy_shield": null, 10 | "evasion": null, 11 | "movement_speed": null, 12 | "block": null, 13 | "description": null, 14 | "directions": null, 15 | "stack_size": null, 16 | "stack_size_currency_tab": null, 17 | "full_stack_turns_into": null, 18 | "charges_max": null, 19 | "charges_per_use": null, 20 | "duration": null, 21 | "life_per_use": null, 22 | "mana_per_use": null, 23 | "attack_time": null, 24 | "critical_strike_chance": null, 25 | "physical_damage_max": null, 26 | "physical_damage_min": null, 27 | "range": null 28 | } 29 | }, 30 | "Alva's Memory": { 31 | "drop_level": 81, 32 | "implicits": [], 33 | "inventory_height": 1, 34 | "inventory_width": 1, 35 | "properties": { 36 | "armour": null, 37 | "energy_shield": null, 38 | "evasion": null, 39 | "movement_speed": null, 40 | "block": null, 41 | "description": null, 42 | "directions": null, 43 | "stack_size": null, 44 | "stack_size_currency_tab": null, 45 | "full_stack_turns_into": null, 46 | "charges_max": null, 47 | "charges_per_use": null, 48 | "duration": null, 49 | "life_per_use": null, 50 | "mana_per_use": null, 51 | "attack_time": null, 52 | "critical_strike_chance": null, 53 | "physical_damage_max": null, 54 | "physical_damage_min": null, 55 | "range": null 56 | } 57 | }, 58 | "Niko's Memory": { 59 | "drop_level": 81, 60 | "implicits": [], 61 | "inventory_height": 1, 62 | "inventory_width": 1, 63 | "properties": { 64 | "armour": null, 65 | "energy_shield": null, 66 | "evasion": null, 67 | "movement_speed": null, 68 | "block": null, 69 | "description": null, 70 | "directions": null, 71 | "stack_size": null, 72 | "stack_size_currency_tab": null, 73 | "full_stack_turns_into": null, 74 | "charges_max": null, 75 | "charges_per_use": null, 76 | "duration": null, 77 | "life_per_use": null, 78 | "mana_per_use": null, 79 | "attack_time": null, 80 | "critical_strike_chance": null, 81 | "physical_damage_max": null, 82 | "physical_damage_min": null, 83 | "range": null 84 | } 85 | }, 86 | "Einhar's Memory": { 87 | "drop_level": 81, 88 | "implicits": [], 89 | "inventory_height": 1, 90 | "inventory_width": 1, 91 | "properties": { 92 | "armour": null, 93 | "energy_shield": null, 94 | "evasion": null, 95 | "movement_speed": null, 96 | "block": null, 97 | "description": null, 98 | "directions": null, 99 | "stack_size": null, 100 | "stack_size_currency_tab": null, 101 | "full_stack_turns_into": null, 102 | "charges_max": null, 103 | "charges_per_use": null, 104 | "duration": null, 105 | "life_per_use": null, 106 | "mana_per_use": null, 107 | "attack_time": null, 108 | "critical_strike_chance": null, 109 | "physical_damage_max": null, 110 | "physical_damage_min": null, 111 | "range": null 112 | } 113 | } 114 | } -------------------------------------------------------------------------------- /data/Bases Data/SanctumSpecialRelic.json: -------------------------------------------------------------------------------- 1 | { 2 | "Sanctified Relic": { 3 | "drop_level": 75, 4 | "implicits": [], 5 | "inventory_height": 2, 6 | "inventory_width": 1, 7 | "properties": { 8 | "armour": null, 9 | "energy_shield": null, 10 | "evasion": null, 11 | "movement_speed": null, 12 | "block": null, 13 | "description": null, 14 | "directions": null, 15 | "stack_size": null, 16 | "stack_size_currency_tab": null, 17 | "full_stack_turns_into": null, 18 | "charges_max": null, 19 | "charges_per_use": null, 20 | "duration": null, 21 | "life_per_use": null, 22 | "mana_per_use": null, 23 | "attack_time": null, 24 | "critical_strike_chance": null, 25 | "physical_damage_max": null, 26 | "physical_damage_min": null, 27 | "range": null 28 | } 29 | } 30 | } -------------------------------------------------------------------------------- /data/Controller.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BanditTech/WingmanReloaded/304830800192dd22af5e49e7f2676eea4800f4e6/data/Controller.png -------------------------------------------------------------------------------- /data/InventorySlots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BanditTech/WingmanReloaded/304830800192dd22af5e49e7f2676eea4800f4e6/data/InventorySlots.png -------------------------------------------------------------------------------- /data/WR.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BanditTech/WingmanReloaded/304830800192dd22af5e49e7f2676eea4800f4e6/data/WR.ico -------------------------------------------------------------------------------- /data/WR_Prop.json: -------------------------------------------------------------------------------- 1 | [ 2 | "Rarity", 3 | "IsItem", 4 | "SpecialType", 5 | "DropLevel", 6 | "DefaultSendStash", 7 | "RarityCurrency", 8 | "RarityDivination", 9 | "RarityGem", 10 | "RarityNormal", 11 | "RarityMagic", 12 | "RarityRare", 13 | "RarityUnique", 14 | "Rarity_Digit", 15 | "ItemName", 16 | "ItemBase", 17 | "ItemClass", 18 | "Item_Width", 19 | "Item_Height", 20 | "IsMap", 21 | "IsBlightedMap", 22 | "IsBrickedMap", 23 | "Incubator", 24 | "TimelessSplinter", 25 | "BreachSplinter", 26 | "SacrificeFragment", 27 | "MortalFragment", 28 | "GuardianFragment", 29 | "ProphecyFragment", 30 | "Scarab", 31 | "Offering", 32 | "Essence", 33 | "Fossil", 34 | "Resonator", 35 | "Vessel", 36 | "AbyssJewel", 37 | "Jewel", 38 | "ClusterJewel", 39 | "Flask", 40 | "Quiver", 41 | "Oil", 42 | "Catalyst", 43 | "IsOrgan", 44 | "IsBeast", 45 | "IsAbyss", 46 | "Influence", 47 | "IsInfluenceItem", 48 | "Prophecy", 49 | "ItemLevel", 50 | "Required_Level", 51 | "Required_Str", 52 | "Required_Dex", 53 | "Required_Int", 54 | "Sockets_Raw", 55 | "Sockets_Num", 56 | "Sockets_Link", 57 | "Chromatic", 58 | "Jeweller", 59 | "Quality", 60 | "Rating_Armour", 61 | "Rating_EnergyShield", 62 | "Rating_Evasion", 63 | "Rating_Block", 64 | "Belt", 65 | "Amulet", 66 | "Ring", 67 | "IsWeapon", 68 | "IsOneHanded", 69 | "IsTwoHanded", 70 | "Weapon_APS", 71 | "Weapon_Avg_Physical_Dmg", 72 | "Weapon_Max_Physical_Dmg", 73 | "Weapon_Min_Physical_Dmg", 74 | "Weapon_Avg_Elemental_Dmg", 75 | "Weapon_Max_Elemental_Dmg", 76 | "Weapon_Min_Elemental_Dmg", 77 | "Weapon_Critical_Strike", 78 | "Weapon_Range", 79 | "Map_Tier", 80 | "Map_AtlasRegion", 81 | "Map_Quantity", 82 | "Map_Rarity", 83 | "Map_PackSize", 84 | "Map_Quality", 85 | "Map_Delirium", 86 | "Corrupted", 87 | "VaalGem", 88 | "Veiled", 89 | "ChaosValue", 90 | "ExaltValue", 91 | "ValuableEnch", 92 | "ValuableBase", 93 | "AffixCount", 94 | "OpenAffix", 95 | "PrefixCount", 96 | "SuffixCount", 97 | "TopTierLife", 98 | "TopTierES", 99 | "TopTierMS", 100 | "TopTierResists", 101 | "TopTierColdResist", 102 | "TopTierFireResist", 103 | "TopTierLightningResist", 104 | "TopTierChaosResist", 105 | "TopTierAllResist", 106 | "TopTierRarityPre", 107 | "TopTierRaritySuf", 108 | "TopTierRarity", 109 | "TopTierCritChance", 110 | "TopTierCritMulti", 111 | "TopTierAttackSpeed", 112 | "TopTierCastSpeed", 113 | "FracturedActualTier" 114 | ] -------------------------------------------------------------------------------- /data/WR_Pseudo.json: -------------------------------------------------------------------------------- 1 | [ 2 | "(Pseudo) Total to Cold Resistance", 3 | "(Pseudo) Total to Lightning Resistance", 4 | "(Pseudo) Total to Fire Resistance", 5 | "(Pseudo) Total to Chaos Resistance", 6 | "(Pseudo) Total to Intelligence", 7 | "(Pseudo) Total to Dexterity", 8 | "(Pseudo) Total to Strength", 9 | "(Pseudo) Total Increased Armour", 10 | "(Pseudo) Total Increased Evasion", 11 | "(Pseudo) Total Increased Energy Shield", 12 | "(Pseudo) Total to Maximum Energy Shield", 13 | "(Pseudo) Add Physical Damage to Attacks_Avg", 14 | "(Pseudo) Add Physical Damage to Spells_Avg", 15 | "(Pseudo) Add Cold Damage to Attacks_Avg", 16 | "(Pseudo) Add Cold Damage to Spells_Avg", 17 | "(Pseudo) Add Fire Damage to Attacks_Avg", 18 | "(Pseudo) Add Fire Damage to Spells_Avg", 19 | "(Pseudo) Add Lightning Damage to Attacks_Avg", 20 | "(Pseudo) Add Lightning Damage to Spells_Avg", 21 | "(Pseudo) Add Chaos Damage to Attacks_Avg", 22 | "(Pseudo) Add Chaos Damage to Spells_Avg", 23 | "(Pseudo) Increased Lightning Damage", 24 | "(Pseudo) Increased Cold Damage", 25 | "(Pseudo) Increased Fire Damage", 26 | "(Pseudo) Increased Chaos Damage", 27 | "(Pseudo) Increased Spell Damage", 28 | "(Pseudo) Total to Elemental Resistance", 29 | "(Pseudo) Total to Resistance", 30 | "(Pseudo) Total to Single Resistance", 31 | "(Pseudo) Total to Stats", 32 | "(Pseudo) Total to Maximum Life", 33 | "(Pseudo) Total Elemental Damage to Attacks_Avg", 34 | "(Pseudo) Total Elemental Damage to Spells_Avg" 35 | ] -------------------------------------------------------------------------------- /data/curl-formats.txt: -------------------------------------------------------------------------------- 1 | \n time_namelookup: %{time_namelookup}s The time it took from the start until the name resolving was completed. 2 | \n time_connect: %{time_connect}s The time it took from the start until the TCP connect to the remote host (or proxy) was completed. 3 | \n time_appconnect: %{time_appconnect}s The time it took from the start until the SSL/SSH/etc connect/handshake to the remote host was completed. 4 | \n time_pretransfer: %{time_pretransfer}s The time it took from the start until the file transfer was just about to begin. 5 | \n time_redirect: %{time_redirect}s The time it took for all redirection steps including name lookup, connect, pretransfer and transfer before the final transaction was started. 6 | \n time_starttransfer: %{time_starttransfer}s The time it took from the start until the first byte was just about to be transferred. 7 | \n ---------- 8 | \n time_total: %{time_total}s The total time, in seconds, that the full operation lasted. 9 | \n 10 | \n http_code: %{http_code} 11 | \n http_connect: %{http_connect} 12 | \n num_redirects: %{num_redirects} 13 | \n size_download: %{size_download} 14 | \n speed_download: %{speed_download} average bytes/s 15 | \n url_effective: %{url_effective} 16 | \n content_type: %{content_type} 17 | \n\n 18 | https://curl.haxx.se/docs/manpage.html 19 | \n -------------------------------------------------------------------------------- /data/curl.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BanditTech/WingmanReloaded/304830800192dd22af5e49e7f2676eea4800f4e6/data/curl.exe -------------------------------------------------------------------------------- /data/curlTimes.bat: -------------------------------------------------------------------------------- 1 | "%~dp0curl.exe" -w "@%~dp0curl-formats.txt" -o NUL -sLk "http://poe.trade" -A "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" 2 | "%~dp0curl.exe" -w "@%~dp0curl-formats.txt" -o NUL -sLk "https://poe.ninja/api/Data/GetCurrencyOverview?league=Standard" -A "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" 3 | "%~dp0curl.exe" -w "@%~dp0curl-formats.txt" -o NUL -sLk "https://www.pathofexile.com/developer/docs/api-resource-leagues" -A "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" 4 | Pause 5 | Pause -------------------------------------------------------------------------------- /data/mtee.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BanditTech/WingmanReloaded/304830800192dd22af5e49e7f2676eea4800f4e6/data/mtee.exe -------------------------------------------------------------------------------- /data/mtee.txt: -------------------------------------------------------------------------------- 1 | Synopsis 2 | Mtee is a Win32 console application that sends any data it receives to stdout and to any number of files. Useful if you want to watch and record the output from a batch file or program. It can also prefix each line of output with a timestamp. 3 | 4 | Mtee is a 19kb standalone executable. It does not create any temporary files or write to the registry. There is no installation procedure, just run it. To remove all traces of Mtee from your system, just delete it. 5 | 6 | Mtee is simple to use and only has several options. To list them, type:- 7 | 8 | mtee /? 9 | Usage 10 | MTEE [/A | /U] [/C] [/D] [/T] [/E] [[/+] file] [...] 11 | 12 | /A Convert output to ANSI. Default output is same as input. 13 | /C Continue if errors occur opening/writing to file (advanced users only). 14 | /D Prefix each line of output with local date in YYYY-MM-DD format. 15 | /T Prefix each line of output with local time in HH:MM:SS.MSS format. 16 | /U Convert output to UNICODE. Default output is same as input. 17 | /E Exit with exit code of piped process. 18 | /ET Calculate and display elapsed time. 19 | /+ Append to existing file. If omitted, existing file is overwritten. 20 | file File to receive the output. File is overwritten if /+ not specified. 21 | ... Any number of additional files. Use /+ before each file to append. 22 | 23 | Example usage:- 24 | 25 | 1) script.cmd | mtee result.txt 26 | 2) ftp -n -s:ftp.scr | mtee local.log /+ \\server\logs$\remote.log 27 | 3) update.cmd 2>&1 | mtee/d/t/+ log.txt 28 | 29 | 1) Sends the output of script.cmd to the console and to result.log. If 30 | result.txt already exists, it will be overwritten. 31 | 2) Sends output of automated ftp session to the console and two log files, 32 | local.log is overwritten if it already exists, remote.log is appended to. 33 | 3) Redirects stdout and stderr from update.cmd to console and appends to 34 | log.txt. Each line is prefixed with local date and time. 35 | Examples 36 | View Mtee help screen:- 37 | 38 | mtee/? 39 | Send the output of script.cmd to the console and to RESULT.LOG. If RESULT.LOG already exists, it will be overwritten:- 40 | 41 | script.cmd | mtee result.log 42 | Send the output of the automated ftp session to the console and to two log files, LOCAL.LOG is overwritten if it already exists. REMOTE.LOG is appended to if it exists, otherwise it is created:- 43 | 44 | ftp -n -s:ftp.scr | mtee local.log /+ \\server\logs\remote.log 45 | Make two copies of LOG whilst viewing LOG on the screen. If NEW1 and NEW2 already exist, they are overwritten:- 46 | 47 | mtee < log new1 new2 48 | Redirect stdout and stderr from UPDATE.CMD to the console and appends to LOG.TXT. Each line is prefixed with local date and time:- 49 | 50 | update.cmd 2>&1 | mtee/d/t/+ log.txt 51 | Send the output from BACKUP.CMD to the console and two remote log files. If there is an error opening any of the log files (server offline for instance) MTEE will continue. If the destination files already exist, they are appended to:- 52 | 53 | backup.cmd | mtee /c/+ \\svr1\log$\bu.log /+ \\svr2\logs$\bu.log 54 | Make multiple carbon copies of patch.exe:- 55 | 56 | type patch.exe|mtee \\pc1\c$\patch.exe \\pc2\c$\patch.exe \\pc3\c$\patch.exe 57 | Make a unicode log of HFNETCHK:- 58 | 59 | hfnetchk|mtee/u log 60 | Display stdout on the console, and stderr on the console and also to a log file with each line of stderr prefixed with local date and time:- 61 | 62 | batch.cmd 2>&1 1>&3 3>&1 |mtee/t/d log 63 | FAQs 64 | How can I determine the exit code of the process piped into Mtee? 65 | 66 | Update Mtee to at least version v2.21 and use the /E option. -------------------------------------------------------------------------------- /data/version.html: -------------------------------------------------------------------------------- 1 | .16.00 -------------------------------------------------------------------------------- /data/xinput1_3.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BanditTech/WingmanReloaded/304830800192dd22af5e49e7f2676eea4800f4e6/data/xinput1_3.dll -------------------------------------------------------------------------------- /lib/CLASS_7za.ahk: -------------------------------------------------------------------------------- 1 | Class 7za { 2 | Static ExeFile := A_ScriptDir "\data\7za.exe" 3 | Static AddArgs := "a -w""" A_ScriptDir """ -t7z -x!backup\ -x!.git\ -x!.github\ -x!github\ -x!.vscode\" 4 | Static SourceFile := ".\*" 5 | Static LogOutput := A_ScriptDir "\logs\Archive.log" 6 | Static Mtee := A_ScriptDir "\data\Mtee.exe" 7 | Static Source := A_ScriptDir "\data\source.zip" 8 | backup(){ 9 | ToZip := A_ScriptDir "\backup\" A_Now ".7z" 10 | RunWait % comspec " /c "" """ This.ExeFile """ " This.AddArgs " """ ToZip """ """ This.SourceFile """ | """ This.Mtee """ /D/T/+ """ This.LogOutput """ """,, hide UseErrorLevel, ZipPID 11 | } 12 | restore(date){ 13 | loc := A_ScriptDir "\backup\" date ".7z" 14 | If FileExist(loc){ 15 | ExtArgs := "x """ loc """ -o""" A_ScriptDir """ -y" 16 | RunWait % comspec " /c "" """ This.ExeFile """ " ExtArgs " | """ This.Mtee """ /D/T/+ """ This.LogOutput """ """,, hide UseErrorLevel, ZipPID 17 | } 18 | } 19 | install(branch){ 20 | Static Acc := "BanditTech" 21 | Static Proj := "WingmanReloaded" 22 | Link := "https://github.com/" Acc "/" Proj "/archive/refs/heads/" branch ".zip" 23 | This.backup() 24 | UrlDownloadToFile,% Link,% This.Source 25 | ExtArgs := "x """ This.Source """ -o""" A_ScriptDir """ -y" 26 | subfolder := Proj "-" branch 27 | RunWait % comspec " /c "" """ This.ExeFile """ " ExtArgs " | """ This.Mtee """ /D/T/+ """ This.LogOutput """ """,, hide UseErrorLevel, ZipPID 28 | MoveArgs := "ROBOCOPY " subfolder " /S /IT """ A_ScriptDir """ /MOVE" 29 | RunWait % comspec " /c " MoveArgs,,hide 30 | RemoveArgs := "rmdir /s /q " subfolder 31 | RunWait % comspec " /c " RemoveArgs,,hide 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lib/CLASS_ColorPicker.ahk: -------------------------------------------------------------------------------- 1 | ; ColorPicker - Create a color Picker into any GUI window or stand alone 2 | class ColorPicker { 3 | __New(pGroup_GUI_NAME:="ColorPicker", pGroup_ID:="ColorPicker" , pGroup_X:=10 , pGroup_Y:=30 , pGroup_W:=90 , pGroup_H:=280, pGroup_SideBar:=110, pGroup_Start_Color:="000000"){ 4 | This.GUI_NAME := pGroup_GUI_NAME 5 | This.ID := pGroup_ID 6 | This.X := pGroup_X 7 | This.Y := pGroup_Y 8 | This.W := pGroup_W 9 | This.H := pGroup_H 10 | This.SideBar := pGroup_SideBar 11 | This.Spacing := This.W // 2.5 12 | This.W_Bar := This.W // 4 13 | This.Start_Color := pGroup_Start_Color 14 | This.Start_Red := (0xff0000 & pGroup_Start_Color) >> 16 15 | This.Start_Green := (0x00ff00 & pGroup_Start_Color) >> 8 16 | This.Start_Blue := 0x0000ff & pGroup_Start_Color 17 | 18 | ; Gui,% This.GUI_NAME ":Destroy" 19 | Gui,% This.GUI_NAME ":+AlwaysOnTop +ToolWindow" 20 | Gui,% This.GUI_NAME ":Color",000000 21 | Gui,% This.GUI_NAME ":Font",s10 w600 22 | 23 | Edit_Trigger := This.UpdateColor.BIND( THIS ) 24 | 25 | Gui,% This.GUI_NAME ":Add",Edit,% "x" This.X - 9 " y" This.Y - 18 " w40 h17 -E0x200 Center Disabled v" This.ID "_Red_Edit_Hex" ,% Format("{1:02X}",This.Start_Red) 26 | This.Slider_Red := New Progress_Slider(This.GUI_NAME,This.ID "_Red",This.X ,This.Y,This.W_Bar,This.H,0,255,This.Start_Red,"550000","BB0000",2,This.ID "_Red_Edit",0,1) 27 | Gui,% This.GUI_NAME ":Add",Edit,% "x" This.X - 10 " y" This.Y + This.H + 2 " w40 h17 -E0x200 Center Disabled v" This.ID "_Red_Edit hwndRedTriggerhwnd",% This.Start_Red 28 | GUICONTROL +G , %RedTriggerhwnd% , % Edit_Trigger 29 | 30 | Gui,% This.GUI_NAME ":Add",Edit,% "x" This.X - 9 + This.Spacing " y" This.Y - 18 " w40 h17 -E0x200 Center Disabled v" This.ID "_Green_Edit_Hex" ,% Format("{1:02X}",This.Start_Green) 31 | This.Slider_Green := New Progress_Slider(This.GUI_NAME,This.ID "_Green",This.X + This.Spacing,This.Y,This.W_Bar,This.H,0,255,This.Start_Green,"005500","00BB00",2,This.ID "_Green_Edit",0,1) 32 | Gui,% This.GUI_NAME ":Add",Edit,% "x" This.X - 10 + This.Spacing " y" This.Y + This.H + 2 " w40 h17 -E0x200 Center Disabled v" This.ID "_Green_Edit hwndGreenTriggerhwnd" ,% This.Start_Green 33 | GUICONTROL +G , %GreenTriggerhwnd% , % Edit_Trigger 34 | 35 | 36 | Gui,% This.GUI_NAME ":Add",Edit,% "x" This.X - 9 + This.Spacing * 2 " y" This.Y - 18 " w40 h17 -E0x200 Center Disabled v" This.ID "_Blue_Edit_Hex" ,% Format("{1:02X}",This.Start_Blue) 37 | This.Slider_Blue := New Progress_Slider(This.GUI_NAME,This.ID "_Blue",This.X + This.Spacing*2,This.Y,This.W_Bar,This.H,0,255,This.Start_Blue,"000055","0000BB",2,This.ID "_Blue_Edit",0,1) 38 | Gui,% This.GUI_NAME ":Add",Edit,% "x" This.X - 10 + This.Spacing * 2 " y" This.Y + This.H + 2 " w40 h17 -E0x200 Center Disabled v" This.ID "_Blue_Edit hwndBlueTriggerhwnd" ,% This.Start_Blue 39 | GUICONTROL +G , %BlueTriggerhwnd% , % Edit_Trigger 40 | 41 | 42 | Gui,% This.GUI_NAME ":Font",s15 w600 43 | Gui,% This.GUI_NAME ":Add",Edit,% "x" This.X + This.Spacing * 3 " y" This.Y - 22 " w" This.SideBar "h17 -E0x200 Center Disabled v" This.ID "_Group_Color_Hex" ,% Format("0x{1:06X}",This.Start_Color) 44 | 45 | Copy_Trigger := This.CopyColor.BIND( THIS ) 46 | 47 | Gui,% This.GUI_NAME ":Add",Text,% "x" This.X + This.Spacing * 3 " y" This.Y " w" This.SideBar " h" This.H // 2 + 40 " hwndCopyTriggerhwnd center", 48 | GUICONTROL +G , %CopyTriggerhwnd% , % Copy_Trigger 49 | 50 | Gui,% This.GUI_NAME ":Add",Progress,% "x" This.X + This.Spacing * 3 " y" This.Y " w" This.SideBar " h" This.H // 2 + 20 " Background000000 c" Format("{1:06X}",This.Start_Color) " v" This.ID "_Group_Color", 100 51 | 52 | Gui,% This.GUI_NAME ":Font",s25 w600 c77BB77 53 | Gui,% This.GUI_NAME ":Add",Text,% "x" This.X + This.Spacing * 3 " y" This.Y + This.H // 2 + 30 " w" This.SideBar " h" (This.H // 2 - 40) // 2 + 10 " hwndCopyTriggerhwnd center", Copy 54 | GUICONTROL +G , %CopyTriggerhwnd% , % Copy_Trigger 55 | Gui,% This.GUI_NAME ":Font",s25 w600 cBB7777 56 | Gui,% This.GUI_NAME ":Add",Text,% "x" This.X + This.Spacing * 3 " y" This.Y + This.H // 2 + 40 + 10 + (This.H // 2 - 40) // 2 " w" This.SideBar " h" (This.H // 2 - 40) // 2 + 10 " gCoordCommand center", Coord 57 | 58 | 59 | ; Gui,% This.GUI_NAME ":Show", AutoSize, Color Picker 60 | } 61 | UpdateColor(){ 62 | GuiControl, % This.GUI_NAME ": +c" Format("{1:02X}",This.Slider_Red.Slider_Value) Format("{1:02X}",This.Slider_Green.Slider_Value) Format("{1:02X}",This.Slider_Blue.Slider_Value), % This.ID "_Group_Color", 63 | GuiControl, % This.GUI_NAME ":", % This.ID "_Group_Color_Hex", % "0x" Format("{1:02X}",This.Slider_Red.Slider_Value) Format("{1:02X}",This.Slider_Green.Slider_Value) Format("{1:02X}",This.Slider_Blue.Slider_Value) 64 | } 65 | SetColor(newColor){ 66 | This.Start_Color := Format("0x{1:06X}",newColor) 67 | This.Start_Red := (0xff0000 & newColor) >> 16 68 | This.Start_Green := (0x00ff00 & newColor) >> 8 69 | This.Start_Blue := 0x0000ff & newColor 70 | This.Slider_Red.SET_pSlider(This.Start_Red) 71 | This.Slider_Green.SET_pSlider(This.Start_Green) 72 | This.Slider_Blue.SET_pSlider(This.Start_Blue) 73 | } 74 | CopyColor(){ 75 | Clipboard := "0x" Format("{1:02X}",This.Slider_Red.Slider_Value) Format("{1:02X}",This.Slider_Green.Slider_Value) Format("{1:02X}",This.Slider_Blue.Slider_Value) 76 | ; MsgBox, 262144, Color Copied, The Hex color code has been copied to the Clipboard `n`n %Clipboard% 77 | Notify("Copied To Clipboard`n`n" Clipboard,"",3) 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /lib/CLASS_Craft.ahk: -------------------------------------------------------------------------------- 1 | Class Craft { 2 | __New(Type,Method,Desired){ 3 | ; Type := "Chance","Color","Link","Socket" 4 | This.Type := Type 5 | 6 | If (Method = 1) 7 | Method := "cursor" 8 | Else If (Method = 2) 9 | Method := "stash" 10 | Else If (Method = 3) 11 | Method := "bulk" 12 | ; Method := "cursor","stash","bulk" 13 | This.Method := Method 14 | 15 | ; Desired := SettingObject 16 | This.Desired := Desired 17 | 18 | ; Determine target object 19 | If (This.Method = "bulk") { 20 | ; add for expansion of this feature later 21 | This.Target := "inventory" 22 | } Else { 23 | If (This.Method = "stash") 24 | This.Target := WR.Loc.Pixel["Currency Craft Slot"] 25 | Else If (This.Method = "cursor"){ 26 | MouseGetPos, xx, yy 27 | This.Target := {X:xx,Y:yy} 28 | } 29 | } 30 | 31 | ; Begin the specified crafting routine 32 | 33 | This.Initiate() 34 | 35 | Return This 36 | } 37 | GetAuto(){ 38 | local lvl := Item.Prop.ItemLevel 39 | If This.Type = "Link" 40 | Return Item.Prop.Sockets_Num 41 | If (lvl < 2) 42 | Return 2 43 | Else If (lvl < 25) 44 | Return 3 45 | Else If (IndexOf(Item.Prop.SlotType,["One Hand","Shield"])) 46 | Return 3 47 | Else If (lvl < 35) 48 | Return 4 49 | Else If (!IndexOf(Item.Prop.SlotType,["Two Hand","Body"])) 50 | Return 4 51 | Else If (lvl < 50) 52 | Return 5 53 | Else If (lvl <= 100) 54 | Return 6 55 | } 56 | Validate(){ 57 | If (Item.Prop.ItemName = "") 58 | || (This.Desired.Links > Item.Prop.Sockets_Num && !This.Desired.Auto) 59 | || ((!Item.Prop.SlotType || indexOf(Item.Prop.SlotType,["Belt","Ring","Amulet"])) && indexOf(This.Type,["Color","Link","Socket"])) 60 | || (Item.Prop.ItemLevel < 2 && This.Desired.Sockets >= 3 && !This.Desired.Auto) 61 | || (Item.Prop.ItemLevel < 25 && This.Desired.Sockets >= 4 && !This.Desired.Auto) 62 | || (Item.Prop.ItemLevel < 35 && This.Desired.Sockets >= 5 && !This.Desired.Auto) 63 | || (Item.Prop.ItemLevel < 50 && This.Desired.Sockets >= 6 && !This.Desired.Auto) 64 | || (This.Desired.Sockets > 4 && !IndexOf(Item.Prop.SlotType,["Two Hand","Body"]) && !This.Desired.Auto) 65 | || (This.Desired.Sockets > 3 && IndexOf(Item.Prop.SlotType,["One Hand","Shield"]) && !This.Desired.Auto) 66 | || ((This.Desired.R + This.Desired.G + This.Desired.B) > Item.Prop.Sockets_Num) 67 | { 68 | Notify("Validation Failed","",2) 69 | Return False 70 | } 71 | Else 72 | Return True 73 | } 74 | Initiate(){ 75 | WinActivate, % GameStr 76 | If (This.Method = "bulk") { 77 | 78 | } Else { 79 | This.Looping(This.Target.X,This.Target.Y) 80 | } 81 | } 82 | Logic(){ 83 | If (This.Type = "Chance"){ 84 | If Item.Prop.Rarity_Digit = 4 85 | Return True 86 | Else If (Item.Prop.Rarity_Digit > 1 && !This.Desired.Scour) 87 | Return True 88 | Else 89 | Return False 90 | } Else If (This.Type = "Color"){ 91 | If This.Colormatch() 92 | Return True 93 | Else 94 | Return False 95 | } Else If (This.Type = "Link"){ 96 | If (This.Desired.Auto && Item.Prop.Sockets_Link >= This.Desired.Auto) 97 | || (!This.Desired.Auto && Item.Prop.Sockets_Link >= This.Desired.Links) 98 | Return True 99 | Else 100 | Return False 101 | } Else If (This.Type = "Socket"){ 102 | If (This.Desired.Auto && Item.Prop.Sockets_Num >= This.Desired.Auto) 103 | || (!This.Desired.Auto && Item.Prop.Sockets_Num >= This.Desired.Sockets) 104 | Return True 105 | Else 106 | Return False 107 | } 108 | } 109 | ColorMatch(){ 110 | If This.Desired.R 111 | RDif := This.Desired.R - Item.Prop.Sockets_R 112 | If This.Desired.G 113 | GDif := This.Desired.G - Item.Prop.Sockets_G 114 | If This.Desired.B 115 | BDif := This.Desired.B - Item.Prop.Sockets_B 116 | TDif := (RDif<=0?0:RDif) + (GDif<=0?0:GDif) + (BDif<=0?0:BDif) 117 | If TDif { 118 | If (Item.Prop.Sockets_W >= TDif) 119 | Return True 120 | Else 121 | Return False 122 | } Else { 123 | Return True 124 | } 125 | } 126 | ApplyCurrency(cname, x, y){ 127 | Global WR 128 | MoveStash(StashTabCurrency) 129 | RightClick(WR.loc.pixel[cname].X, WR.loc.pixel[cname].Y) 130 | Sleep, 45*Latency 131 | LeftClick(x,y) 132 | Sleep, 90*Latency 133 | ClipItem(x,y) 134 | Sleep, 45*Latency 135 | return 136 | } 137 | Looping(x,y){ 138 | Global RunningToggle 139 | Static namearr := {Chance:"Chance",Color:"Chromatic",Link:"Fusing",Socket:"Jeweller"} 140 | ClipItem(x,y) 141 | If Item.Affix.Unidentified 142 | WisdomScroll(x,y), ClipItem(x,y) 143 | If This.Desired.Auto 144 | This.Desired.Auto := This.GetAuto() 145 | If This.Validate() 146 | While !This.Logic() && RunningToggle { 147 | If (This.Type = "Chance") { 148 | If (Item.Prop.Rarity_Digit != 1 && This.Desired.Scour) 149 | This.ApplyCurrency("Scouring",x,y) 150 | } 151 | This.ApplyCurrency(namearr[This.Type],x,y) 152 | } 153 | Notify("Loop Complete","",1) 154 | } 155 | } 156 | -------------------------------------------------------------------------------- /lib/CLASS_FilterAdjuster.ahk: -------------------------------------------------------------------------------- 1 | Class FilterAdjuster { 2 | Run(FilePath,NewContent,MarkerText:="",PositionalText:=""){ 3 | This.SetFilterFile(FilePath) 4 | This.SetMarkerText(MarkerText,PositionalText) 5 | If This.CheckMarkers() { 6 | This.ReplaceContent(IsObject(NewContent)?This.CompileString(NewContent):NewContent) 7 | Return True 8 | } Else { 9 | Return This.CheckMarkers() 10 | } 11 | } 12 | CompileString(Object){ 13 | string := "" 14 | For k, v in Object { 15 | string .= (string?"`r`n":"") v 16 | } 17 | Return string 18 | } 19 | SetFilterFile(FilePath){ 20 | This.FilePath := FilePath 21 | This.GetContent() 22 | } 23 | GetContent(){ 24 | This.Content := FileOpen(This.FilePath, "r").Read() 25 | } 26 | SetMarkerText(MarkerText:="",PositionalText:=""){ 27 | Static PosText := "#------------------------------------`r`n# [1001] ILVL 86`r`n#------------------------------------" 28 | Static Marker := "# Chaos Recipe" 29 | This.MarkerText := MarkerText ? MarkerText : Marker 30 | This.PositionalText := PositionalText ? PositionalText : PosText 31 | } 32 | CheckMarkers(){ 33 | This.MarkerFlags() 34 | If (This.MarkerFound) 35 | Return True 36 | If (!This.MarkerFound && !This.CanInsert) 37 | Return "000" 38 | This.InsertMarkers() 39 | This.GetContent() 40 | Return True 41 | } 42 | MarkerFlags(){ 43 | This.MarkerFound := False 44 | If InStr(This.Content, This.MarkerText) { 45 | This.MarkerFound := True 46 | } Else If InStr(This.Content, This.PositionalText) { 47 | This.CanInsert := True 48 | } Else { 49 | This.CanInsert := False 50 | } 51 | } 52 | InsertMarkers(){ 53 | file := FileOpen(This.FilePath, "w") 54 | split := StrSplit(This.Content, This.PositionalText) 55 | file.Write(split.1) 56 | file.WriteLine(This.PositionalText "`r`n") 57 | file.WriteLine(This.MarkerText) 58 | file.Write(This.MarkerText) 59 | file.Write(split.2) 60 | file.Close() 61 | } 62 | ReplaceContent(NewContent){ 63 | file := FileOpen(This.FilePath, "w") 64 | split := StrSplit(This.Content, This.MarkerText) 65 | file.Write(split.1) 66 | file.WriteLine(This.MarkerText "`r`n") 67 | file.WriteLine(NewContent) 68 | file.Write(This.MarkerText) 69 | file.Write(split.3) 70 | file.Close() 71 | This.GetContent() 72 | } 73 | } -------------------------------------------------------------------------------- /lib/CLASS_ItemBuild.ahk: -------------------------------------------------------------------------------- 1 | ; ItemBuild - Create Prop and Affix Values in WR format from GGG Stash API 2 | class ItemBuild extends ItemScan 3 | { 4 | __New(Object,quad){ 5 | This.Data := {"Blocks":{"Affix":"","FlavorText":""}} 6 | This.Pseudo := OrderedArray() 7 | This.Affix := OrderedArray() 8 | This.Prop := OrderedArray() 9 | This.Prop.Rarity := (Object.frameType=0?"Normal" 10 | :(Object.frameType=1?"Magic" 11 | :(Object.frameType=2?"Rare" 12 | :(Object.frameType=3?"Unique" 13 | :(Object.frameType=4?"Gem" 14 | :(Object.frameType=5?"Currency" 15 | :(Object.frameType=6?"Divination Card" 16 | :(Object.frameType>=7?"Unknown":"ERROR")))))))) 17 | If (Object.frameType >= 0 && Object.frameType <= 3) 18 | This.Prop.Rarity_Digit := Object.frameType + 1 19 | 20 | For k, v in Object.explicitMods 21 | { 22 | If (v != "") 23 | This.Data.Blocks.Affix .= v . "`r`n" 24 | } 25 | For k, v in Object.enchantMods 26 | { 27 | If (v != "") 28 | This.Data.Blocks.Affix .= v . " (enchant)`r`n" 29 | } 30 | For k, v in Object.implicitMods 31 | { 32 | If (v != "") 33 | This.Data.Blocks.Affix .= v . " (implicit)`r`n" 34 | } 35 | If Object.descrText 36 | This.Data.Blocks.FlavorText := Object.descrText 37 | Else If Object.FlavorText 38 | { 39 | For k, v in Object.FlavorText 40 | This.Data.Blocks.FlavorText .= RegExReplace(RegExReplace(RegExReplace(v, "`n", ""), "[{}]", ""), "\<.+\>", "") . "`n" 41 | } 42 | 43 | This.Prop.ItemName := (Object.name!=""?Object.name:Object.typeLine) 44 | This.Prop.ItemBase := Object.baseType 45 | This.MatchBaseType() 46 | This.Prop.ItemLevel := Object.ilvl 47 | This.Prop.Item_Width := Object.w 48 | This.Prop.Item_Height := Object.h 49 | If !Object.identified 50 | This.Affix.Unidentified := 1 51 | This.Prop.StashX := Object.x +1 52 | This.Prop.StashY := Object.y +1 53 | This.Prop.StashTab := (RegExMatch(Object.inventoryId, "Stash(\d{1,3})",RxMatch)?RxMatch1:False) 54 | If quad 55 | This.Prop.StashQuad := True 56 | Else 57 | This.Prop.StashQuad := False 58 | If (Object.stackSize != "") 59 | This.Prop.Stack_Size := Object.stackSize 60 | If (Object.maxStackSize != "") 61 | This.Prop.Stack_Max := Object.maxStackSize 62 | 63 | This.MatchAffixes(This.Data.Blocks.Affix) 64 | This.MatchBase2Slot() 65 | This.MatchChaosRegal() 66 | ;This.MatchCraftingBases(True) 67 | } 68 | MatchBaseType(){ 69 | For k, v in BasesWR 70 | { 71 | for a, b in v{ 72 | If (a == This.Prop.ItemBase) 73 | { 74 | This.Prop.DropLevel := b["drop_level"] 75 | This.Prop.ItemClass := k 76 | 77 | If InStr(This.Prop.ItemClass, "Ring") 78 | This.Prop.Ring := True 79 | If InStr(This.Prop.ItemClass, "Amulet") 80 | This.Prop.Amulet := True 81 | If InStr(This.Prop.ItemClass, "Belt") 82 | This.Prop.Belt := True 83 | If (This.Prop.ItemClass = "Support Skill Gem") 84 | This.Prop.Support := True 85 | Break 86 | } 87 | } 88 | } 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /lib/CLASS_ModAlias.ahk: -------------------------------------------------------------------------------- 1 | Class ModAlias { 2 | Translate(StatKey){ 3 | If !(This.Loaded) { 4 | This.LoadDatabase() 5 | } 6 | Reference := This.GetReference(StatKey) 7 | possible := This.Locate(Reference.id) 8 | ; Later we can convert to AHK for evaluating conditions 9 | ; possible := This.ConvertJStoAHK(possible) 10 | ; for now we just return the first entry 11 | string := possible[0]["string"] 12 | string := RegExReplace(string,"\{\d\}","#") 13 | string := RegExReplace(string,RxNum,"#") 14 | Return string 15 | } 16 | LoadDatabase(){ 17 | This.ModObject := JSONcom.Parse(FileOpen(A_ScriptDir "\Data\mods.min.json","r").Read(),true) 18 | This.TransObject := JSONcom.Parse(FileOpen(A_ScriptDir "\Data\stat_translations.min.json","r").Read(),true) 19 | This.Loaded := True 20 | } 21 | GetReference(StatKey){ 22 | referenceid := This.ModObject[StatKey]["stats"][0]["id"] 23 | referencemax := This.ModObject[StatKey]["stats"][0]["max"] 24 | referencemin := This.ModObject[StatKey]["stats"][0]["min"] 25 | Return {"id":referenceid,"max":referencemax,"min":referencemin} 26 | } 27 | Locate(StatID){ 28 | Loop % This.TransObject.length { 29 | k := A_Index - 1 30 | v := This.TransObject[k]["ids"] 31 | loop % v.length { 32 | i := A_Index - 1 33 | strkey := v[i] 34 | If (strkey = StatID) { 35 | return This.TransObject[k]["English"] 36 | } 37 | } 38 | } 39 | Return False 40 | } 41 | ConvertJStoAHK(Obj){ 42 | Return JSON.Load(JSONcom.Stringify(Obj,true)) 43 | } 44 | } -------------------------------------------------------------------------------- /lib/CLASS_PanelManager.ahk: -------------------------------------------------------------------------------- 1 | ; PanelManager - This class manages every gamestate within one place 2 | Class PanelManager 3 | { 4 | __New(){ 5 | This.List := {} 6 | } 7 | AddPanel(Pixel){ 8 | This.List[Pixel.Name] := Pixel 9 | } 10 | AddFailsafe(Pixel){ 11 | This.Failsafe := Pixel 12 | } 13 | Status(ScreenShot := 1){ 14 | Active := "" 15 | If ScreenShot 16 | FindText.ScreenShot(GameX,GameY,GameX + GameW,GameY + GameH) 17 | If IsObject(This.Failsafe) 18 | { 19 | If !This.Failsafe.On() 20 | Active .= This.Failsafe.Name 21 | } 22 | For k, Panel in This.List 23 | { 24 | If Panel.On() 25 | Active .= (Active != "" ? " " : "") Panel.Name 26 | } 27 | Return This.Active := (Active != "" ? Active : False) 28 | } 29 | } 30 | 31 | ; PixelStatus - This class manages pixel sample and comparison 32 | Class PixelStatus 33 | { 34 | __New(Name,X,Y,Hex){ 35 | This.Name := Name 36 | This.X := X 37 | This.Y := Y 38 | This.Hex := Hex 39 | This.Status := False 40 | } 41 | On(){ 42 | pSample := FindText.GetColor(This.X,This.Y) 43 | Return (This.Status := (pSample = This.Hex ? True : False)) 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /lib/CLASS_Perfect.ahk: -------------------------------------------------------------------------------- 1 | Class Perfect { 2 | __New(mod){ 3 | This.o := New OrderedAssociativeArray 4 | This.o.isvar := 0 5 | This.o.key:=This.Standardize(mod) 6 | This.SetVals(mod) 7 | This.o.text:=mod 8 | } 9 | Standardize(str){ 10 | str := RegExReplace(str, "\+?"rxNum, "#") 11 | str := RegExReplace(str, "\(#-#\)", "#",replacecount) 12 | str := RegExReplace(str, "\+?#", "#") 13 | This.o.isvar := replacecount 14 | Return str 15 | } 16 | GetValues(lineString){ 17 | values := [] 18 | position := 1 19 | RxMatch:={"Len":[0]} 20 | While (position := RegExMatch(lineString, "O`am)"rxNum, RxMatch, position + RxMatch.Len[1])) 21 | { 22 | If (RxMatch[1] != "") 23 | values.push(RxMatch[1]) 24 | } 25 | If values.Count() 26 | Return values 27 | Else 28 | Return False 29 | } 30 | SetVals(line){ 31 | If (line = "") 32 | Return 33 | If (vals := This.GetValues(line)) 34 | { 35 | If (vals.Count() >= 2) 36 | { 37 | If (line ~= "\d[ a-zA-Z%]*\(\d+-\d+\)") 38 | This.o.values := [vals[1]] 39 | , This.o.ranges := [[vals[2],vals[3]]] 40 | , vals.RemoveAt(1, 3) 41 | Else If (line ~= "\("rxNum "-"rxNum "\) to \(" rxNum "-"rxNum "\)") 42 | This.o.ranges := [[vals[1],vals[2]],[vals[3],vals[4]]] 43 | , vals.RemoveAt(1, 4) 44 | Else If (line ~= "\("rxNum "-"rxNum "\)") 45 | This.o.ranges := [[vals[1],vals[2]]] 46 | , vals.RemoveAt(1, 2) 47 | If vals.Count() 48 | { 49 | If !IsObject(This.values) 50 | This.o.values := [] 51 | For k, v in vals 52 | This.o.values.Push(v) 53 | } 54 | } 55 | Else If (vals.Count() == 1) 56 | { 57 | This.o.values := [vals[1]] 58 | } 59 | } 60 | Else 61 | This.o.values := [""] 62 | } 63 | } 64 | 65 | RefreshPoeWatchPerfect(){ 66 | Global selectedLeague 67 | RequestURL := "https://api.poe.watch/perfect?league=" selectedLeague 68 | UrlDownloadToFile, %RequestURL%, %A_ScriptDir%\temp\PoE.Watch_PerfectUnique_orig.json 69 | JSONtext := FileOpen(A_ScriptDir "\temp\PoE.Watch_PerfectUnique_orig.json","r").Read() 70 | Try { 71 | WR.Data.Perfect := JSON.Load(JSONtext,,1) 72 | For ku, itemDB in WR.Data.Perfect { 73 | pushto := {} 74 | For kt, type in ["implicits","explicits"] { 75 | pushto[type] := {} 76 | For ki, mod in itemDB[type] { 77 | mod := RegExReplace(mod, "1 to \(", "(1-1) to (") 78 | replace := new Perfect(mod) 79 | WR.Data.Perfect[ku][type][ki] := replace.o 80 | } 81 | } 82 | } 83 | FileOpen(A_ScriptDir "\data\PoE.Watch_PerfectUnique.json","w").Write(JSON_Beautify(WR.Data.Perfect," ",3)) 84 | } Catch e { 85 | MsgBox % "There was an Error while Loading Perfect Price `n`n" ErrorText(e) 86 | WR.Data.Perfect := {} 87 | } 88 | } -------------------------------------------------------------------------------- /lib/CLASS_Progress_Slider.ahk: -------------------------------------------------------------------------------- 1 | ; Progress_Slider - Class written by Hellbent on AHK forum, adjusted by Bandit 2 | class Progress_Slider { 3 | __New(pSlider_GUI_NAME , pSlider_Control_ID , pSlider_X , pSlider_Y , pSlider_W , pSlider_H , pSlider_Range_Start , pSlider_Range_End , pSlider_Value:=0 , pSlider_Background_Color := "Black" , pSlider_Top_Color := "Red" , pSlider_Pair_With_Edit := 0 , pSlider_Paired_Edit_ID := "" , pSlider_Use_Tooltip := 0 , pSlider_Vertical := 0 , pSlider_Smooth := 1, SaveINISection := ""){ 4 | This.GUI_NAME:=pSlider_GUI_NAME 5 | This.Control_ID:=pSlider_Control_ID 6 | This.X := pSlider_X 7 | This.Y := pSlider_Y 8 | This.W := pSlider_W 9 | This.H := pSlider_H 10 | This.Start_Range := pSlider_Range_Start 11 | This.End_Range := pSlider_Range_End 12 | This.Slider_Value := pSlider_Value 13 | This.Background_Color := pSlider_Background_Color 14 | This.Top_Color := pSlider_Top_Color 15 | This.Vertical := pSlider_Vertical 16 | This.Smooth := pSlider_Smooth 17 | This.Pair_With_Edit := pSlider_Pair_With_Edit 18 | ; Options 19 | ; 0 := Do not pair with edit 20 | ; 1 := Pair with only Decimal Edit 21 | ; 2 := Pair with both Decimal and Hex Edit 22 | ; 3 := Pair with only Hex Edit 23 | This.Paired_Edit_ID := pSlider_Paired_Edit_ID 24 | This.Paired_Edit_ID_Hex := (pSlider_Paired_Edit_ID != "" ? pSlider_Paired_Edit_ID . "_Hex" : "") 25 | This.Use_Tooltip := pSlider_Use_Tooltip 26 | This.SaveINISection := SaveINISection 27 | This.Add_pSlider() 28 | } 29 | Add_pSlider(){ 30 | global 31 | Gui, % This.GUI_NAME ":Add" , Text , % "x" This.X " y" This.Y " w" This.W " h" This.H " hwndpSliderTriggerhwnd" 32 | pSlider_Trigger := This.Adjust_pSlider.BIND( THIS ) 33 | GUICONTROL +G , %pSliderTriggerhwnd% , % pSlider_Trigger 34 | if(This.Smooth=1&&This.Vertical=0) 35 | Gui, % This.GUI_NAME ":Add" , Progress , % "x" This.X " y" This.Y " w" This.W " h" This.H " Background" This.Background_Color " c" This.Top_Color " Range" This.Start_Range "-" This.End_Range " v" This.Control_ID ,% This.Slider_Value 36 | else if(This.Smooth=0&&This.Vertical=0) 37 | Gui, % This.GUI_NAME ":Add" , Progress , % "x" This.X " y" This.Y " w" This.W " h" This.H " -Smooth Range" This.Start_Range "-" This.End_Range " v" This.Control_ID ,% This.Slider_Value 38 | else if(This.Smooth=1&&This.Vertical=1) 39 | Gui, % This.GUI_NAME ":Add" , Progress , % "x" This.X " y" This.Y " w" This.W " h" This.H " Background" This.Background_Color " c" This.Top_Color " Range" This.Start_Range "-" This.End_Range " Vertical v" This.Control_ID ,% This.Slider_Value 40 | else if(This.Smooth=0&&This.Vertical=1) 41 | Gui, % This.GUI_NAME ":Add" , Progress , % "x" This.X " y" This.Y " w" This.W " h" This.H " -Smooth Range" This.Start_Range "-" This.End_Range " Vertical v" This.Control_ID ,% This.Slider_Value 42 | } 43 | Adjust_pSlider(){ 44 | Static OldVal 45 | CoordMode,Mouse,Client 46 | while(GetKeyState("LButton")){ 47 | Static LastTT := 0 48 | MouseGetPos,pSlider_Temp_X,pSlider_Temp_Y 49 | pSlider_Temp_X := Scale_PositionFromDPI(pSlider_Temp_X), pSlider_Temp_Y := Scale_PositionFromDPI(pSlider_Temp_Y) 50 | if(This.Vertical=0) 51 | This.Slider_Value := Round((pSlider_Temp_X - This.X ) / ( This.W / (This.End_Range - This.Start_Range) )) + This.Start_Range 52 | else 53 | This.Slider_Value := Round(((pSlider_Temp_Y - This.Y ) / ( This.H / (This.End_Range - This.Start_Range) )) + This.Start_Range )* -1 + This.End_Range 54 | if(This.Slider_Value > This.End_Range ) 55 | This.Slider_Value:=This.End_Range 56 | else if(This.Slider_Value=1 && This.Slider_Value != OldVal) 60 | { 61 | OldVal := This.Slider_Value 62 | if(This.Pair_With_Edit<=2) 63 | { 64 | GuiControl,% This.GUI_NAME ":" ,% This.Paired_Edit_ID , % This.Slider_Value 65 | If (This.SaveINISection) 66 | IniWrite, % This.Slider_Value, %A_ScriptDir%\save\Settings.ini, % This.SaveINISection, % This.Paired_Edit_ID 67 | } 68 | if(This.Pair_With_Edit>=2) 69 | GuiControl,% This.GUI_NAME ":" ,% This.Paired_Edit_ID_Hex , % Format("{1:02X}",This.Slider_Value) 70 | } 71 | if(This.Add_Method!=0) 72 | { 73 | 74 | GuiControl,% This.GUI_NAME ":" ,% This.Paired_Edit_ID_Hex , % Format("{1:02X}",This.Slider_Value) 75 | } 76 | if(This.Use_Tooltip=1 && A_TickCount - LastTT > 100 ) 77 | { 78 | LastTT := A_TickCount 79 | ToolTip , % This.Slider_Value 80 | } 81 | } 82 | if(This.Use_Tooltip=1) 83 | ToolTip, 84 | } 85 | SET_pSlider(NEW_pSlider_Value){ 86 | This.Slider_Value := NEW_pSlider_Value 87 | GuiControl,% This.GUI_NAME ":" ,% This.Control_ID , % This.Slider_Value 88 | if(This.Pair_With_Edit>=1) 89 | { 90 | if(This.Pair_With_Edit<=2) 91 | GuiControl,% This.GUI_NAME ":" ,% This.Paired_Edit_ID , % This.Slider_Value 92 | if(This.Pair_With_Edit>=2) 93 | GuiControl,% This.GUI_NAME ":" ,% This.Paired_Edit_ID_Hex , % Format("{1:02X}",This.Slider_Value) 94 | } 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /lib/CLASS_RefreshAffixes.ahk: -------------------------------------------------------------------------------- 1 | Class RefreshAffixes { 2 | Maps(){ 3 | Static FileList := [ {"category":"Map", "subfield":"low_tier_map"} 4 | ,{"category":"Map", "subfield":"mid_tier_map"} 5 | ,{"category":"Map", "subfield":"top_tier_map"}] 6 | Download := {} 7 | This.ReturnList := [] 8 | For k, v in FileList { 9 | Download[v.subfield] := This.Download(v.category,v.subfield) 10 | } 11 | For subfield, v in Download { 12 | Try { 13 | obj := Json.Load(v) 14 | ; MsgBox % isObject(obj) 15 | } Catch e { 16 | Util.Err(e,"Issue loading JSON for " subfield) 17 | } 18 | For k, vv in obj.normal { 19 | This.SplitKeys(vv.str) 20 | } 21 | } 22 | Util.Save(Util.Dir.Data "\Affix_List_Map.json",This.ReturnList) 23 | This.ReturnList := "" 24 | Download := "" 25 | } 26 | SplitKeys(Str){ 27 | Static ignored := ["#% increased Pack size" 28 | ,"#% increased Rarity of Items found in this Area" 29 | ,"#% increased Quantity of Items found in this Area"] 30 | line := RegexReplace(Str,"\d+","#") 31 | line := RegexReplace(line,"\(#-#\)","#") 32 | line := RegexReplace(line,"\(-#--#\)","-#") 33 | ; MsgBox % line 34 | strLines := StrSplit(line, "
") 35 | For k, v in strLines { 36 | If (v = "" || indexOf(v,ignored) || indexOf(v,This.ReturnList)) 37 | Continue 38 | This.ReturnList.Push(v) 39 | } 40 | } 41 | Download(category,subfield){ 42 | Static replace := [["–","-"] 43 | ,["(
)?.*?",""] 44 | ,["",""] 45 | ,["",""]] 46 | Str := Util.HttpGet("https://poedb.tw/us/json.php/Mods/Gen?cn=" category "&an=&tags=" subfield) 47 | For k, v in replace { 48 | Str := RegexReplace(Str,v.1,v.2) 49 | } 50 | Return Str 51 | } 52 | } 53 | 54 | -------------------------------------------------------------------------------- /lib/CheckAspectRatio.ahk: -------------------------------------------------------------------------------- 1 | CheckAspectRatio(){ 2 | v := GameW/GameH 3 | If GamePID 4 | MsgBox,262144,Game Aspect Ratio, % v=16/9?"Standard 16:9" 5 | :v=12/9?"Classic 12:9 (4:3)" 6 | :v=21/9?"Cinematic 21:9" 7 | :v=43/18?"Cinematic 21.5:9 (43:18)" 8 | :v=32/9?"UltraWide 32:9" 9 | :v=16/10?"WXGA 16:10" 10 | :"The script does not have a matching aspect ratio" 11 | Else 12 | MsgBox,262144,Game Aspect Ratio, Open the game to calculate its window ratio 13 | } 14 | -------------------------------------------------------------------------------- /lib/Class_FilterBuilder.ahk: -------------------------------------------------------------------------------- 1 | Class FilterBuilder { 2 | Static FBheader := "# FilterBlade: Conditional Entry" 3 | __New(Settings){ 4 | This.String := [] 5 | This.Settings := Settings 6 | This.Add(This.FBheader) 7 | This.Add("Show") 8 | If This.Settings.HasKey("ItemLevel") { 9 | This.ItemLevel() 10 | } 11 | This.Add("Rarity Rare") 12 | This.Add("Identified False") 13 | If This.Settings.HasKey("Classes") { 14 | This.Classes() 15 | } 16 | If This.Settings.HasKey("BorderColor") { 17 | This.SetColor("Border") 18 | } 19 | If This.Settings.HasKey("FontSize") { 20 | This.FontSize() 21 | } 22 | If This.Settings.HasKey("BackgroundColor") { 23 | This.SetColor("Background") 24 | } 25 | If This.Settings.HasKey("TextColor") { 26 | This.SetColor("Text") 27 | } 28 | If This.Settings.HasKey("Dimensions") { 29 | This.Dimensions() 30 | } 31 | This.Add("") 32 | Return This.ReturnString() 33 | } 34 | ReturnString(){ 35 | str := "" 36 | For k, v in This.String { 37 | str .= (str?"`r`n":"") v 38 | } 39 | Return str 40 | } 41 | Add(String){ 42 | This.String.Push(String) 43 | } 44 | Classes(){ 45 | str := "Class ==" 46 | For k, v in This.Settings.Classes { 47 | str .= " """ v """" 48 | } 49 | This.Add(str) 50 | } 51 | SetColor(kind){ 52 | c := This.Settings[kind "Color"] 53 | If (c is xdigit) { 54 | colors := ToRGB(c) 55 | This.Add("Set" kind "Color " colors.r " " colors.g " " colors.b) 56 | } Else If (c ~= "^\d+ \d+ \d+") { 57 | This.Add("Set" kind "Color " c) 58 | } 59 | } 60 | FontSize(){ 61 | This.Add("SetFontSize " This.Settings.FontSize) 62 | } 63 | ItemLevel(){ 64 | This.Add("ItemLevel >= " This.Settings.ItemLevel.Min) 65 | This.Add("ItemLevel <= " This.Settings.ItemLevel.Max) 66 | } 67 | Dimensions(){ 68 | If This.Settings.Dimensions.HasKey("Height") { 69 | This.Add("Height = " This.Settings.Dimensions.Height) 70 | } 71 | If This.Settings.Dimensions.HasKey("Width") { 72 | This.Add("Width = " This.Settings.Dimensions.Width) 73 | } 74 | } 75 | } -------------------------------------------------------------------------------- /lib/ColorHex.ahk: -------------------------------------------------------------------------------- 1 | ; Compare two hex colors as their R G B elements, puts all the below together 2 | CompareHex(color1, color2, vary:=1, BGR:=0){ 3 | If BGR 4 | { 5 | c1 := ToRGBfromBGR(color1) 6 | c2 := ToRGBfromBGR(color2) 7 | } 8 | Else 9 | { 10 | c1 := ToRGB(color1) 11 | c2 := ToRGB(color2) 12 | } 13 | Return CompareRGB(c1,c2,vary) 14 | } 15 | ; Convert a color to a pixel findtext string 16 | Hex2FindText(Color,vary:=0,BGR:=0,Comment:="",Width:=2,Height:=2,LR_Border:=0){ 17 | If (Width < 1) 18 | Width := 1 19 | If (Height < 1) 20 | Height := 1 21 | bitstr := "" 22 | Loop % LR_Border 23 | bitstr .= "0" 24 | Loop % Width 25 | bitstr .= "1" 26 | Loop % LR_Border 27 | bitstr .= "0" 28 | endstr := bitstr 29 | Loop % Height - 1 30 | endstr .= "`n" . bitstr 31 | bitstr := FindText.bit2base64(endstr) 32 | ; Width += 2*LR_Border 33 | If IsObject(Color) 34 | { 35 | build := "" 36 | For k, v in Color 37 | { 38 | If BGR 39 | v := hexBGRToRGB(v) 40 | build .= "|<" k ">" . v . "@" . Round((100-vary)/100,2) . "$" . Width + 2 * LR_Border . "." . bitstr 41 | } 42 | Return build 43 | } 44 | Else 45 | { 46 | If BGR 47 | Color := hexBGRToRGB(Color) 48 | Return "|<" Comment ">" . Color . "@" . Round((100-vary)/100,2) . "$" . Width + 2 * LR_Border . "." . bitstr 49 | } 50 | } 51 | ; Converts a hex BGR color into its R G B elements 52 | ToRGBfromBGR(color){ 53 | return { "b": (color >> 16) & 0xFF, "g": (color >> 8) & 0xFF, "r": color & 0xFF } 54 | } 55 | ; Converts a hex RGB color into its R G B elements 56 | ToRGB(color){ 57 | return { "r": (color >> 16) & 0xFF, "g": (color >> 8) & 0xFF, "b": color & 0xFF } 58 | } 59 | ; Converts R G B elements back to hex 60 | ToHex(Color){ 61 | If IsObject(Color) 62 | { 63 | C := (Color.r & 0xFF) << 16, C |= (Color.g & 0xFF) << 8, C |= (Color.b & 0xFF) 64 | Return Format("0x{1:06X}",C) 65 | } 66 | Else 67 | Return Format("0x{1:02X}",Color) 68 | } 69 | ; Converts a hex BGR color into RGB format or vice versa 70 | hexBGRToRGB(color){ 71 | b := Format("{1:02X}",(color >> 16) & 0xFF) 72 | g := Format("{1:02X}",(color >> 8) & 0xFF) 73 | r := Format("{1:02X}",color & 0xFF) 74 | return "0x" . r . g . b 75 | } 76 | ; Compares two converted HEX codes as R G B within the variance range (use ToRGB to convert first) 77 | CompareRGB(c1, c2, vary:=1){ 78 | rdiff := Abs( c1.r - c2.r ) 79 | gdiff := Abs( c1.g - c2.g ) 80 | bdiff := Abs( c1.b - c2.b ) 81 | return rdiff <= vary && gdiff <= vary && bdiff <= vary 82 | } 83 | ColorPercent(percent){ 84 | Local key 85 | Static ColorRange := "" 86 | Static ColorCount := "" 87 | If !IsObject(ColorRange) 88 | ColorRange := ColorRange("0xff0000","0x00ff00") 89 | If !ColorCount 90 | ColorCount := ColorRange.Length() 91 | percent := percent>100?100 92 | :percent<1?1 93 | :percent 94 | key := percent!=1 ? Round(ColorCount * ((Percent) / 100)) : 1 95 | Return ColorRange[key] 96 | } 97 | ; Gather the pixel information of an area, then average the hex values 98 | AverageAreaColor(AreaObj){ 99 | Static 100 | X1:=AreaObj.X1 101 | Y1:=AreaObj.Y1 102 | X2:=AreaObj.X2 103 | Y2:=AreaObj.Y2 104 | W := X2 - X1 +1 105 | H := Y2 - Y1 +1 106 | M_Index := W * H 107 | Size := Round((W * H) / 300) 108 | ColorList := [] 109 | FindText.ScreenShot() 110 | Load_BarControl(,,1) 111 | ColorCount:=R_Count:=G_Count:=B_Count:=LastDisplay_LB:=EscBreak:=0 112 | Loop, % W 113 | { 114 | W_Index := A_Index 115 | Cur_X := X1 + (A_Index - 1) 116 | Loop, % H 117 | { 118 | Cur_Y := Y1 + (A_Index - 1) 119 | Temp_Hex := FindText.GetColor(Cur_X,Cur_Y) 120 | if !(indexOf(Temp_Hex, ColorList)) 121 | { 122 | ColorCount++ 123 | ColorList.Push(Temp_Hex) 124 | } 125 | If (A_TickCount - LastDisplay_LB > Size) 126 | { 127 | T_Index := (W_Index-1)*H + A_Index 128 | Percent := Round((T_Index / M_Index) * 100) 129 | uText := ColorCount " variations - Escape to cancel" 130 | Load_BarControl(Percent,uText) 131 | LastDisplay_LB := A_TickCount 132 | } 133 | } Until EscBreak := GetKeyState("Escape", "P") 134 | If EscBreak 135 | { 136 | Notify("Canceled area calculation","",3,,110) 137 | Load_BarControl(100,"Canceled",-1) 138 | Return 139 | } 140 | } 141 | For k, color in ColorList 142 | { 143 | Split := ToRGB(color) 144 | R_Count += Split.r 145 | G_Count += Split.g 146 | B_Count += Split.b 147 | } 148 | Split := {"r":Round(R_Count / ColorCount),"g":Round(G_Count / ColorCount),"b":Round(B_Count / ColorCount)} 149 | Load_BarControl(100,"Done.",-1) 150 | Return ToHex(Split) 151 | } 152 | ; Check if a specific hex value is part of an array within a variance and return the index 153 | indexOfHex(var, Arr, fromIndex:=1, vary:=2){ 154 | for index, value in Arr { 155 | h1 := ToRGB(value) 156 | h2 := ToRGB(var) 157 | if (index < fromIndex){ 158 | Continue 159 | }else if (CompareRGB(h1, h2, vary)){ 160 | return index 161 | } 162 | } 163 | } 164 | -------------------------------------------------------------------------------- /lib/CoolTime.ahk: -------------------------------------------------------------------------------- 1 | ; CoolTime - Return a more accurate MS value - Forbidden function! will cause massive CPU strain 2 | CoolTime() { 3 | VarSetCapacity(PerformanceCount, 8, 0) 4 | VarSetCapacity(PerformanceFreq, 8, 0) 5 | DllCall("QueryPerformanceCounter", "Ptr", &PerformanceCount) 6 | DllCall("QueryPerformanceFrequency", "Ptr", &PerformanceFreq) 7 | return NumGet(PerformanceCount, 0, "Int64") / NumGet(PerformanceFreq, 0, "Int64") 8 | } 9 | 10 | -------------------------------------------------------------------------------- /lib/DatabaseHelpers.ahk: -------------------------------------------------------------------------------- 1 | LoadActualTierName() { 2 | Return JSON.Load(FileOpen(A_ScriptDir "\data\ActualTierName.json","r").Read()) 3 | } 4 | 5 | ActualTierCreator() { 6 | ActualTierNameJSON := LoadActualTierName() 7 | For kii , vii in POEData{ 8 | WR.ActualTier[kii] := [] 9 | for kiii, viii in vii{ 10 | Mods := LoadOnDemand(kii,viii) 11 | For k, v in Mods 12 | { 13 | if(v["influence"] == "Normal"){ 14 | AffixWRLine := FirstLineToWRFormat(v["text"]) 15 | ModGenerationType := v["generation_type"] 16 | If(ActualTierName:=CheckAffixWRFromJson(AffixWRLine,ModGenerationType,ActualTierNameJSON)) { 17 | If(index := CheckAffixWR(AffixWRLine,v["generation_type"],WR.ActualTier[kii])) { 18 | aux := False 19 | aux2 := 0 20 | for a, b in WR.ActualTier[kii][index]["ILvL"]{ 21 | if (b == v["required_level"]){ 22 | aux := true 23 | break 24 | } 25 | if(v["required_level"] > b){ 26 | aux2 = %A_Index% 27 | } 28 | } 29 | if(!aux){ 30 | WR.ActualTier[kii][index]["AffixLine"].InsertAt(aux2+1, v["name"]) 31 | WR.ActualTier[kii][index]["ILvL"].InsertAt(aux2+1, v["required_level"]) 32 | } 33 | } Else { 34 | aux := {"ActualTierName":ActualTierName,"ModGenerationType":v["generation_type"],"AffixWRLine":FirstLineToWRFormat(v["text"]),"AffixLine":[v["name"]],"ILvL":[v["required_level"]]} 35 | WR.ActualTier[kii].Push(aux) 36 | } 37 | } 38 | } 39 | } 40 | } 41 | } 42 | ;Save Json 43 | Settings("ActualTier","Save") 44 | Return 45 | } 46 | 47 | CheckAffixWR(Line,ModGenerationType,Obj) { 48 | for k , v in Obj { 49 | If (v["AffixWRLine"] == Line && ModGenerationType == v["ModGenerationType"]) { 50 | Return k 51 | } 52 | } 53 | } 54 | 55 | CheckAffixWRFromJson(Line,ModGenerationType,Obj) { 56 | for k , v in Obj { 57 | If(v["AffixWRLine"] == Line and (v["ModGenerationType"] == ModGenerationType)) { 58 | aux:= "ActualTier" . v["ActualTierName"] 59 | Return aux 60 | } 61 | } 62 | } 63 | 64 | FirstLineToWRFormat(FullLine) { 65 | FullLine := ItemCraftingNaming(FullLine) 66 | ; Create WR Mod Line 67 | Line := RegExReplace(FullLine,"\(" rxNum "-" rxNum "\)", "$1") 68 | Line := RegExReplace(Line,"\(-" rxNum "--" rxNum "\)", "$1") 69 | Mod := RegExReplace(Line, "\+?"rxNum , "#") 70 | Return Mod 71 | } 72 | 73 | CraftingBasesRequest(ShouldRun) { 74 | If (!ShouldRun || PoECookie == "") { 75 | Return 76 | } 77 | If (!AccountNameSTR) { 78 | Log("Crafting Bases Request","You need define your account name in save/Account.ini",Strings*) 79 | Return 80 | } 81 | Object := PoERequest.Stash(StashTabCrafting) 82 | ClearQuantCraftingBase() 83 | Strings := [] 84 | For k, v in Object.items { 85 | item := new ItemBuild(v,Object.quadLayout) 86 | Strings.Push("Item Base: " item["Prop"]["ItemBase"] 87 | . ", Name: " item["Prop"]["ItemName"] 88 | . ", ILVL: " item["Prop"]["CraftingBaseHigherILvLFound"] 89 | . ", Quantity: " item["Prop"]["CraftingBaseQuantFound"]) 90 | } 91 | Log("Crafting Bases ","Refreshing quantity and minimum ilvl from stash items",Strings*) 92 | Return 93 | } 94 | 95 | ClearQuantCraftingBase() { 96 | for ki,vi in ["str_armour","dex_armour","int_armour","str_dex_armour","str_int_armour","dex_int_armour","amulet","ring","belt","weapon","quiver"]{ 97 | for k,v in WR.CustomCraftingBases[vi] { 98 | v.Quant:=0 99 | v.ILvL:=0 100 | } 101 | } 102 | Return 103 | } -------------------------------------------------------------------------------- /lib/FindText Helpers.ahk: -------------------------------------------------------------------------------- 1 | String2ASCII(String:="",One:="#",Zero:="."){ 2 | local 3 | s := StrSplit(String, ".") 4 | w := StrSplit(s.1, "$").2 5 | s := StrSplit(StrReplace(StrReplace(FindText.base64tobit(s.2),"1",One),"0",Zero)) 6 | v := "" 7 | For k, c in s 8 | { 9 | v .= c 10 | If !Mod(k,w) 11 | v .= "`n" 12 | } 13 | Return v 14 | } 15 | 16 | -------------------------------------------------------------------------------- /lib/Header.ahk: -------------------------------------------------------------------------------- 1 | #IfWinActive Path of Exile 2 | #NoEnv 3 | #MaxHotkeysPerInterval 99000000 4 | #HotkeyInterval 99000000 5 | #KeyHistory 0 6 | #SingleInstance force 7 | #Warn UseEnv 8 | #Persistent 9 | #InstallMouseHook 10 | #InstallKeybdHook 11 | #MaxThreadsPerHotkey 2 12 | #MaxMem 256 13 | 14 | ListLines Off 15 | SetBatchLines, -1 16 | 17 | ; Load default delays values from INI 18 | IniRead, SetKeyDelayValue1, %A_ScriptDir%\save\Settings.ini, Delays, SetKeyDelayValue1, 60 19 | IniRead, SetKeyDelayValue2, %A_ScriptDir%\save\Settings.ini, Delays, SetKeyDelayValue2, 90 20 | IniRead, SetMouseDelayValue, %A_ScriptDir%\save\Settings.ini, Delays, SetMouseDelayValue, 90 21 | IniRead, SetDefaultMouseSpeedValue, %A_ScriptDir%\save\Settings.ini, Delays, SetDefaultMouseSpeedValue, 5 22 | 23 | ; Set default delays 24 | SetKeyDelay, %SetKeyDelayValue1%, %SetKeyDelayValue2%, Play 25 | SetMouseDelay, %SetMouseDelayValue% 26 | SetDefaultMouseSpeed, %SetDefaultMouseSpeedValue% 27 | 28 | CoordMode, Mouse, Screen 29 | CoordMode, Pixel, Screen 30 | CoordMode, Tooltip, Screen 31 | FileEncoding , UTF-8 32 | SendMode Input 33 | StringCaseSense, On ; Match strings with case. 34 | If A_AhkVersion < 1.1.28 35 | { 36 | Log("Error","Too Low version") 37 | msgbox 1, ,% "Version " A_AhkVersion " AutoHotkey has been found`nThe script requires minimum version 1.1.28+`nPress OK to go to download page" 38 | IfMsgBox, OK 39 | { 40 | Run, "https://www.autohotkey.com/download/" 41 | ExitApp 42 | } 43 | Else 44 | ExitApp 45 | } 46 | 47 | SetTitleMatchMode 2 48 | SetWorkingDir %A_ScriptDir% 49 | Thread, interrupt, 0 50 | I_Icon = %A_ScriptDir%\data\WR.ico 51 | IfExist, %I_Icon% 52 | Menu, Tray, Icon, %I_Icon% 53 | 54 | OnMessage(0x5555, "MsgMonitor") 55 | OnMessage( 0xF, "WM_PAINT") 56 | OnMessage(0x200, Func("ShowToolTip")) ; WM_MOUSEMOVE 57 | -------------------------------------------------------------------------------- /lib/Library.ahk: -------------------------------------------------------------------------------- 1 | #Include, %A_ScriptDir%\lib\list.ahk 2 | 3 | #Include, %A_ScriptDir%\lib\ChatStashHotkeys.ahk 4 | #Include, %A_ScriptDir%\lib\CheckAspectRatio.ahk 5 | #Include, %A_ScriptDir%\lib\CLASS_7za.ahk 6 | #Include, %A_ScriptDir%\lib\CLASS_ColorPicker.ahk 7 | #Include, %A_ScriptDir%\lib\CLASS_Craft.ahk 8 | #Include, %A_ScriptDir%\lib\CLASS_FilterAdjuster.ahk 9 | #Include, %A_ScriptDir%\lib\CLASS_FilterBuilder.ahk 10 | #Include, %A_ScriptDir%\lib\CLASS_ItemBuild.ahk 11 | #Include, %A_ScriptDir%\lib\CLASS_ItemScan.ahk 12 | #Include, %A_ScriptDir%\lib\CLASS_ModAlias.ahk 13 | #Include, %A_ScriptDir%\lib\CLASS_Perfect.ahk 14 | #Include, %A_ScriptDir%\lib\CLASS_Progress_Slider.ahk 15 | #Include, %A_ScriptDir%\lib\CLASS_RefreshAffixes.ahk 16 | #Include, %A_ScriptDir%\lib\CLASS_SortByNum.ahk 17 | #Include, %A_ScriptDir%\lib\CLASS_Util.ahk 18 | #Include, %A_ScriptDir%\lib\ColorHex.ahk 19 | #Include, %A_ScriptDir%\lib\Controller.ahk 20 | #Include, %A_ScriptDir%\lib\FindText Helpers.ahk 21 | #Include, %A_ScriptDir%\lib\GameLogs.ahk 22 | #Include, %A_ScriptDir%\lib\GuiStatus.ahk 23 | #Include, %A_ScriptDir%\lib\Helpers.ahk 24 | #Include, %A_ScriptDir%\lib\MainMenu.ahk 25 | #Include, %A_ScriptDir%\lib\MsgMonitor.ahk 26 | #Include, %A_ScriptDir%\lib\POE_Click.ahk 27 | #Include, %A_ScriptDir%\lib\POE_WindowCheck.ahk 28 | #Include, %A_ScriptDir%\lib\Rescale.ahk 29 | #Include, %A_ScriptDir%\lib\SaveLoad.ahk 30 | #Include, %A_ScriptDir%\lib\SendHotkey.ahk 31 | #Include, %A_ScriptDir%\lib\Toggle.ahk 32 | #Include, %A_ScriptDir%\lib\Tooltips.ahk 33 | #Include, %A_ScriptDir%\lib\TrayLabels.ahk 34 | #Include, %A_ScriptDir%\lib\Trigger.ahk 35 | #Include, %A_ScriptDir%\lib\DatabaseHelpers.ahk 36 | 37 | #Include, %A_ScriptDir%\lib\api\CLASS_PoERequest.ahk 38 | #Include, %A_ScriptDir%\lib\api\POE_UpdateLeagues.ahk 39 | #Include, %A_ScriptDir%\lib\api\ScrapeNinjaData.ahk 40 | #Include, %A_ScriptDir%\lib\api\RefreshStatsList.ahk 41 | #Include, %A_ScriptDir%\lib\api\Update.ahk 42 | 43 | #Include, %A_ScriptDir%\lib\gui\Calibrate.ahk 44 | #Include, %A_ScriptDir%\lib\gui\CraftingPopup.ahk 45 | #Include, %A_ScriptDir%\lib\gui\DPI.ahk 46 | #Include, %A_ScriptDir%\lib\gui\DrawZoom.ahk 47 | #Include, %A_ScriptDir%\lib\gui\FlaskMenu.ahk 48 | #Include, %A_ScriptDir%\lib\gui\GUI helpers.ahk 49 | #Include, %A_ScriptDir%\lib\gui\Ignore List.ahk 50 | #Include, %A_ScriptDir%\lib\gui\LootColorsMenu.ahk 51 | #Include, %A_ScriptDir%\lib\gui\OHB_Editor.ahk 52 | #Include, %A_ScriptDir%\lib\gui\perCharMenu.ahk 53 | #Include, %A_ScriptDir%\lib\gui\PromptForObject.ahk 54 | #Include, %A_ScriptDir%\lib\gui\RestockMenu.ahk 55 | #Include, %A_ScriptDir%\lib\gui\UtilityMenu.ahk 56 | #Include, %A_ScriptDir%\lib\gui\WR_Menu.ahk 57 | #Include, %A_ScriptDir%\lib\gui\CustomCraftingBase.ahk 58 | #Include, %A_ScriptDir%\lib\gui\CustomMapMods.ahk 59 | #Include, %A_ScriptDir%\lib\gui\ItemCrafting.ahk 60 | 61 | #Include, %A_ScriptDir%\lib\routine\AutoLevelGems.ahk 62 | #Include, %A_ScriptDir%\lib\routine\ChaosRecipe.ahk 63 | #Include, %A_ScriptDir%\lib\routine\CheckDebuffs.ahk 64 | #Include, %A_ScriptDir%\lib\routine\Coord.ahk 65 | #Include, %A_ScriptDir%\lib\routine\Crafting.ahk 66 | #Include, %A_ScriptDir%\lib\routine\GemSwap.ahk 67 | #Include, %A_ScriptDir%\lib\routine\GrabCurrency.ahk 68 | #Include, %A_ScriptDir%\lib\routine\Inventory.ahk 69 | #Include, %A_ScriptDir%\lib\routine\Logout.ahk 70 | #Include, %A_ScriptDir%\lib\routine\LootScan.ahk 71 | #Include, %A_ScriptDir%\lib\routine\MainLogic.ahk 72 | #Include, %A_ScriptDir%\lib\routine\PopFlasks.ahk 73 | #Include, %A_ScriptDir%\lib\routine\QuickPortal.ahk 74 | #Include, %A_ScriptDir%\lib\routine\StackRelease.ahk 75 | #Include, %A_ScriptDir%\lib\routine\ZoneChange.ahk 76 | 77 | #Include *i %A_ScriptDir%\save\MyCustomLib.ahk 78 | -------------------------------------------------------------------------------- /lib/MainMenu.ahk: -------------------------------------------------------------------------------- 1 | ; Hotkeys - Open main menu 2 | MainMenu(){ 3 | global 4 | if (!A_IsCompiled and A_LineFile=A_ScriptFullPath) 5 | Return 6 | if(YesGuiLastPosition) 7 | { 8 | If (WinGuiX = "" || WinGuiY = "") 9 | WinGuiX := WinGuiY := 0 10 | Gui, 1: Show, Autosize x%WinGuiX% y%WinGuiY%, WingmanReloaded 11 | } 12 | Else 13 | { 14 | Gui, 1: Show, Autosize Center, WingmanReloaded 15 | } 16 | mainmenuGameLogicState(True) 17 | GuiUpdate() 18 | CheckGamestates := True 19 | processWarningFound:=0 20 | return 21 | } 22 | -------------------------------------------------------------------------------- /lib/MsgMonitor.ahk: -------------------------------------------------------------------------------- 1 | SendMSG(wParam:=0, lParam:=0, script:="BlankSubscript.ahk ahk_exe AutoHotkey.exe"){ 2 | DetectHiddenWindows On 3 | if WinExist(script) 4 | PostMessage, 0x5555, wParam, lParam 5 | DetectHiddenWindows Off ; Must not be turned off until after PostMessage. 6 | Return 7 | } 8 | 9 | MsgMonitor(wParam, lParam, msg) { 10 | If (wParam==1) 11 | LoadArray() 12 | Return 13 | } 14 | -------------------------------------------------------------------------------- /lib/POE_Click.ahk: -------------------------------------------------------------------------------- 1 | ; PoE Click v1.0.1 : Developed by Bandit 2 | SpamClick(Toggle:="",Modifier:=""){ 3 | Static Spam := False 4 | If (Toggle != "") { 5 | If (Toggle == 1 || Toggle == 0) 6 | Spam := Toggle 7 | Else If (Toggle = "True" || Toggle = "true" || Toggle = "on" || Toggle = "On") 8 | Spam := True 9 | Else If (Toggle = "False" || Toggle = "false" || Toggle = "off" || Toggle = "Off") 10 | Spam := False 11 | } Else 12 | Spam := !Spam 13 | If (Modifier != "") { 14 | If !isObject(Modifier) 15 | Modifier := StrSplit(Modifier,",") 16 | For k, mod in Modifier{ 17 | Send {%mod% Down} 18 | Sleep, 60+(ClickLatency*15) 19 | } 20 | } 21 | While Spam { 22 | Send {Click} 23 | Sleep, 60+(ClickLatency*15) 24 | } 25 | If (Modifier != "") { 26 | For k, mod in Modifier{ 27 | Send {%mod% Up} 28 | Sleep, 60+(ClickLatency*15) 29 | } 30 | } 31 | } 32 | ; LeftClick - Left Click at Coord 33 | LeftClick(x, y){ 34 | Log("Verbose","LeftClick: " x ", " y) 35 | BlockInput, MouseMove 36 | MouseMove, x, y 37 | Sleep, 60+(ClickLatency*15) 38 | Send {Click} 39 | Sleep, 60+(ClickLatency*15) 40 | BlockInput, MouseMoveOff 41 | Return 42 | } 43 | ; RightClick - Right Click at Coord 44 | RightClick(x, y){ 45 | Log("Verbose","RightClick: " x ", " y) 46 | BlockInput, MouseMove 47 | MouseMove, x, y 48 | Sleep, 60+(ClickLatency*15) 49 | Send {Click, Right} 50 | Sleep, 60+(ClickLatency*15) 51 | BlockInput, MouseMoveOff 52 | Return 53 | } 54 | ; ShiftClick - Shift Click +Click at Coord 55 | ShiftClick(x, y){ 56 | Log("Verbose","ShiftClick: " x ", " y) 57 | BlockInput, MouseMove 58 | MouseMove, x, y 59 | Sleep, 60+(ClickLatency*15) 60 | Send {Shift down} 61 | Send {Click} 62 | Sleep, 60 63 | Send {Shift up} 64 | Sleep, 60+(ClickLatency*15) 65 | BlockInput, MouseMoveOff 66 | return 67 | } 68 | ; CtrlClick - Ctrl Click ^Click at Coord 69 | CtrlClick(x, y){ 70 | Log("Verbose","CtrlClick: " x ", " y) 71 | BlockInput, MouseMove 72 | MouseMove, x, y 73 | Sleep, 60+(ClickLatency*15) 74 | Send {Ctrl down} 75 | Send {Click} 76 | Sleep, 60 77 | Send {Ctrl up} 78 | Sleep, 60+(ClickLatency*15) 79 | BlockInput, MouseMoveOff 80 | return 81 | } 82 | ; CtrlShiftClick - Ctrl + Shift Click +^Click at Coord 83 | CtrlShiftClick(x, y){ 84 | Log("Verbose","CtrlShiftClick: " x ", " y) 85 | BlockInput, MouseMove 86 | MouseMove, x, y 87 | Sleep, 60+(ClickLatency*15) 88 | Send {Ctrl down} 89 | Send {Shift down} 90 | Send {Click} 91 | Sleep, 60 92 | Send {Ctrl up} 93 | Send {Shift up} 94 | Sleep, 60+(ClickLatency*15) 95 | BlockInput, MouseMoveOff 96 | return 97 | } 98 | ; RandClick - Randomize Click area around middle of cell using lower left Coord 99 | RandClick(x, y){ 100 | Random, Rx, x+10, x+30 101 | Random, Ry, y-30, y-10 102 | If DebugMessages 103 | Log("Verbose","Randomize: " x ", " y " position to " Rx ", " Ry ) 104 | return {"X": Rx, "Y": Ry} 105 | } 106 | ; ClipItem - Capture Clip at Coord 107 | ClipItem(x, y){ 108 | Global RunningToggle 109 | BlockInput, MouseMove 110 | Backup := Clipboard 111 | Clipboard := "" 112 | Item := "" 113 | MouseMove, x, y 114 | Sleep, 60+(ClipLatency*15) 115 | Send {Ctrl down} 116 | Send {Alt down} 117 | Send c 118 | Sleep, 30 119 | Send {Ctrl up} 120 | Send {Alt up} 121 | ClipWait, 0.1 122 | If ErrorLevel 123 | { 124 | Sleep, 120+(ClipLatency*15) 125 | Send {Ctrl down} 126 | Send {Alt down} 127 | Send c 128 | Sleep, 30 129 | Send {Ctrl up} 130 | Send {Alt up} 131 | ClipWait, 0.1 132 | If (ErrorLevel && ItemParseActive) 133 | Clipboard := Backup 134 | } 135 | Clip_Contents := Clipboard 136 | Clipboard := Backup 137 | BlockInput, MouseMoveOff 138 | Item := new ItemScan 139 | Return 140 | } 141 | ; WisdomScroll - Identify Item at Coord 142 | WisdomScroll(x, y){ 143 | BlockInput, MouseMove 144 | Found := False 145 | For C, vv in WR.Restock { 146 | For R, v in vv { 147 | If (!v.Normal && v.RestockName = "Wisdom"){ 148 | Found := True 149 | Break 2 150 | } 151 | } 152 | } 153 | If !Found { 154 | Notify("Missing Configuration","Assign an inventory slot to Wisdom Scrolls`nMake sure to select Ignore or Restock") 155 | Log("Error","Wisdom Scroll is not configured in inventory slot options","Please configure the slot in your inventory from which to draw Wisdom Scrolls","The slot must be configured to Restock or Ignore and select Wisdom in the dropdown menu") 156 | Return False 157 | } 158 | Log("Currency","Applying Wisdom onto item at " x "," y) 159 | XX := InventoryGridX[C], YY := InventoryGridY[R] 160 | o := RandClick(XX,YY) 161 | RightClick(o.X,o.Y) 162 | Sleep, 45 163 | LeftClick(x,y) 164 | Sleep, 45 165 | BlockInput, MouseMoveOff 166 | return 167 | } 168 | -------------------------------------------------------------------------------- /lib/POE_WindowCheck.ahk: -------------------------------------------------------------------------------- 1 | ; PoEWindowCheck - Check for the game window. 2 | ; ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 3 | PoEWindowCheck() 4 | { 5 | Global GamePID, NoGame, GameActive, WR 6 | try { 7 | If (GamePID := WinExist(GameStr)) 8 | { 9 | GameActive := WinActive(GameStr) 10 | WinGetPos, , , nGameW, nGameH 11 | newDim := (nGameW != GameW || nGameH != GameH) 12 | global RescaleRan, ToggleExist 13 | If (!GameBound || newDim ) 14 | { 15 | GameBound := True 16 | if YesDX12 { 17 | FindText.BindWindow(GamePID,4) 18 | } else { 19 | FindText.BindWindow(GamePID) 20 | } 21 | WinGet, s, Style, ahk_class POEWindowClass 22 | If (s & +0x80000000) 23 | WinSet, Style, -0x80000000, ahk_class POEWindowClass 24 | } 25 | If (!RescaleRan || newDim) 26 | Rescale() 27 | If ((!ToggleExist || newDim) && GameActive) 28 | { 29 | Gui 2: Show,% "x" WR.loc.pixel.Gui.X " y" WR.loc.pixel.Gui.Y - 15 " NA" 30 | Gui Chaos: Show,% "x" (WR.loc.pixel.GuiChaos.X - 300) " y" WR.loc.pixel.GuiChaos.Y " NA" 31 | GuiUpdate() 32 | ToggleExist := True 33 | NoGame := False 34 | } 35 | Else If (ToggleExist && !GameActive) 36 | { 37 | ToggleExist := False 38 | Gui 2: Show, Hide 39 | Gui Chaos: Show, Hide 40 | } 41 | } 42 | Else 43 | { 44 | If CheckTime("seconds",5,"CheckActiveType") 45 | CheckActiveType() 46 | If GameActive 47 | GameActive := False 48 | If GameBound 49 | { 50 | GameBound := False 51 | FindText.BindWindow() 52 | } 53 | If (ToggleExist) 54 | { 55 | Gui 2: Show, Hide 56 | Gui Chaos: Show, Hide 57 | ToggleExist := False 58 | RescaleRan := False 59 | NoGame := True 60 | } 61 | If (!AutoUpdateOff && ScriptUpdateTimeType != "Off" && ScriptUpdateTimeInterval != 0 && CheckTime(ScriptUpdateTimeType,ScriptUpdateTimeInterval,"updateScript")) 62 | { 63 | checkUpdate() 64 | } 65 | } 66 | } catch e { 67 | Log("Error","PoEWindowCheck", ErrorText(e)) 68 | } 69 | Return 70 | } 71 | -------------------------------------------------------------------------------- /lib/RunAdmin.ahk: -------------------------------------------------------------------------------- 1 | ; Rerun as admin if not already admin, required to disconnect client 2 | if not A_IsAdmin 3 | if A_IsCompiled 4 | Run *RunAs "%A_ScriptFullPath%" /restart 5 | else 6 | Run *RunAs "%A_AhkPath%" /restart "%A_ScriptFullPath%" 7 | Sleep, -1 -------------------------------------------------------------------------------- /lib/SendHotkey.ahk: -------------------------------------------------------------------------------- 1 | SendHotkey(keyStr:="",hold:=0){ 2 | For i, keys in StrSplit(keyStr," "){ 3 | If RegExMatch(keys, "O)\[(\d+)\]\(([\d\w]+)\)", DelayKey) 4 | { 5 | DelayAction.Push({"TriggerAt":A_TickCount+DelayKey[1],"Key":DelayKey[2]}) 6 | Continue 7 | } 8 | Obj := SplitModsFromKey(keys) 9 | If (GameActive := WinActive(GameStr)) 10 | Send, % Obj.Mods "{" Obj.Key ( hold ? " " hold : "" ) "}" 11 | Else 12 | controlsend, , % Obj.Mods "{" Obj.Key ( hold ? " " hold : "" ) "}", %GameStr% 13 | } 14 | } 15 | SendDelayAction(){ 16 | For k, keys in DelayAction 17 | { 18 | If (keys.TriggerAt <= A_TickCount) 19 | { 20 | SendHotkey(keys.Key) 21 | DelayAction.Delete(k) 22 | } 23 | } 24 | } 25 | IsModifier(Character) { 26 | static Modifiers := {"!": 1, "#": 1, "~": 1, "^": 1, "*": 1, "+": 1} 27 | return Modifiers.HasKey(Character) 28 | } 29 | SplitModsFromKey(key){ 30 | Mods := String := "" 31 | for k, Letter in StrSplit(key) { 32 | if (IsModifier(Letter)) { 33 | Mods .= Letter 34 | } 35 | else { 36 | String .= Letter 37 | } 38 | } 39 | Return {"Mods":Mods, "Key":String } 40 | } 41 | -------------------------------------------------------------------------------- /lib/Timers.ahk: -------------------------------------------------------------------------------- 1 | ; Check for window to be active 2 | SetTimer, PoEWindowCheck, 1000 3 | ; Check once an hour to see if we should updated database 4 | SetTimer, DBUpdateCheck, 360000 5 | ; Log file parser 6 | If FileExist(ClientLog) 7 | { 8 | Monitor_GameLogs(1) 9 | SetTimer, Monitor_GameLogs, 300 10 | } 11 | Else 12 | { 13 | MsgBox, 262144, Client Log Error, Client.txt Log File not found!`nAssign the location in Configuration Tab`nClick ""Locate Logfile"" to find yours 14 | Log("Error","Client Log not Found",ClientLog) 15 | SB_SetText("Client.txt file not found", 2) 16 | } 17 | ; Check for Flask presses 18 | SetTimer, TimerPassthrough, %KeyscanRate% 19 | ; Main Game Timer 20 | SetTimer, TGameTick, %Tick% 21 | -------------------------------------------------------------------------------- /lib/Toggle.ahk: -------------------------------------------------------------------------------- 1 | ; AutoQuit - Toggle the scripts quit function on 2 | toggleAutoQuit(){ 3 | WR.func.Toggle.Quit := !WR.func.Toggle.Quit 4 | Settings("func","Save") 5 | GuiUpdate() 6 | return 7 | } 8 | 9 | ; AutoFlask - Toggle flask usage on 10 | toggleAutoFlask(){ 11 | WR.func.Toggle.Flask := !WR.func.Toggle.Flask 12 | Settings("func","Save") 13 | GuiUpdate() 14 | return 15 | } 16 | ; AutoMove - Toggle movement triggers 17 | toggleAutoMove(){ 18 | WR.func.Toggle.Move := !WR.func.Toggle.Move 19 | Settings("func","Save") 20 | GuiUpdate() 21 | return 22 | } 23 | ; AutoUtility - Toggle utility triggers 24 | toggleAutoUtility(){ 25 | WR.func.Toggle.Utility := !WR.func.Toggle.Utility 26 | Settings("func","Save") 27 | GuiUpdate() 28 | return 29 | } 30 | ; Hotkey to pause the detonate mines 31 | PauseMines(){ 32 | PauseMinesCommand: 33 | if (!WR.perChar.Setting.autominesEnable || !GuiCheck()) 34 | return 35 | static keyheld := 0 36 | keyheld++ 37 | settimer, keyheldReset, 200 38 | if keyheld > 1 39 | return 40 | KeyWait, %hotkeyPauseMines%, T0.3 ; Wait .3 seconds until Detonate key is released. 41 | If ErrorLevel = 1 ; If not released, just exit out 42 | Exit 43 | keyheld := 0 44 | If (WR.perChar.Setting.autominesPauseSingleTap == 1) 45 | pauseToggle := !pauseToggle 46 | else if (A_PriorHotkey <> "$~" . hotkeyPauseMines || A_TimeSincePriorHotkey > WR.perChar.Setting.autominesPauseDoubleTapSpeed) 47 | { ;This is a not a double tap 48 | pauseToggle := false 49 | } 50 | else if (A_TimeSincePriorHotkey > 50 && A_TimeSincePriorHotkey < WR.perChar.Setting.autominesPauseDoubleTapSpeed) 51 | { ;This is a double tap that works if within range 25-set value 52 | pauseToggle := true 53 | } 54 | else if A_TimeSincePriorHotkey < 50 55 | { 56 | return 57 | } 58 | if (!pauseToggle) 59 | { 60 | Detonated := False 61 | PauseTooltips := 0 62 | Tooltip 63 | } 64 | else if (pauseToggle) 65 | { 66 | SetTimer, TDetonated, Delete 67 | Detonated := True 68 | PauseTooltips := 1 69 | Tooltip, Auto-Mines Paused, % A_ScreenWidth / 2 - 57, % A_ScreenHeight / 8 70 | } 71 | Return 72 | 73 | keyheldReset: 74 | keyheld := 0 75 | return 76 | } 77 | 78 | -------------------------------------------------------------------------------- /lib/Tooltips.ahk: -------------------------------------------------------------------------------- 1 | ; Debug messages within script 2 | Ding(Timeout:=500, MultiTooltip:=0 , Message*) 3 | { 4 | If (!DebugMessages && MultiTooltip >= 0) 5 | Return 6 | Else 7 | { 8 | If MultiTooltip < 0 9 | MultiTooltip := Abs(MultiTooltip) 10 | debugStr := "" 11 | If Message.Count() 12 | { 13 | For mkey, mval in Message 14 | { 15 | If mval= 16 | Continue 17 | If A_Index = 1 18 | { 19 | If MultiTooltip 20 | ToolTip, %mval%, 20, % 40 + MultiTooltip* 23, %MultiTooltip% 21 | Else 22 | debugStr .= Message.A_Index 23 | } 24 | Else if A_Index <= 20 25 | { 26 | If MultiTooltip 27 | ToolTip, %mval%, 20, % 40 + A_Index* 23, %A_Index% 28 | Else 29 | debugStr .= "`n" . Message.A_Index 30 | } 31 | } 32 | If !MultiTooltip 33 | Tooltip, %debugStr% 34 | } 35 | Else 36 | { 37 | If MultiTooltip 38 | ToolTip, Ding, 20, % 40 + MultiTooltip* 23, %MultiTooltip% 39 | Else 40 | Tooltip, Ding 41 | } 42 | } 43 | If Timeout 44 | { 45 | If MultiTooltip 46 | SetTimer, RemoveTT%MultiTooltip%, %Timeout% 47 | Else 48 | SetTimer, RemoveToolTip, %Timeout% 49 | } 50 | Return 51 | } 52 | ; tooltip management 53 | RemoveToolTip() 54 | { 55 | SetTimer, , Off 56 | Loop, 20 57 | { 58 | SetTimer, RemoveTT%A_Index%, Off 59 | ToolTip,,,,%A_Index% 60 | } 61 | PauseTooltips := 0 62 | return 63 | 64 | RemoveTT1: 65 | SetTimer, , Off 66 | ToolTip,,,,1 67 | Return 68 | 69 | RemoveTT2: 70 | SetTimer, , Off 71 | ToolTip,,,,2 72 | Return 73 | 74 | RemoveTT3: 75 | SetTimer, , Off 76 | ToolTip,,,,3 77 | Return 78 | 79 | RemoveTT4: 80 | SetTimer, , Off 81 | ToolTip,,,,4 82 | Return 83 | 84 | RemoveTT5: 85 | SetTimer, , Off 86 | ToolTip,,,,5 87 | Return 88 | 89 | RemoveTT6: 90 | SetTimer, , Off 91 | ToolTip,,,,6 92 | Return 93 | 94 | RemoveTT7: 95 | SetTimer, , Off 96 | ToolTip,,,,7 97 | Return 98 | 99 | RemoveTT8: 100 | SetTimer, , Off 101 | ToolTip,,,,8 102 | Return 103 | 104 | RemoveTT9: 105 | SetTimer, , Off 106 | ToolTip,,,,9 107 | Return 108 | 109 | RemoveTT10: 110 | SetTimer, , Off 111 | ToolTip,,,,10 112 | Return 113 | 114 | RemoveTT11: 115 | SetTimer, , Off 116 | ToolTip,,,,11 117 | Return 118 | 119 | RemoveTT12: 120 | SetTimer, , Off 121 | ToolTip,,,,12 122 | Return 123 | 124 | RemoveTT13: 125 | SetTimer, , Off 126 | ToolTip,,,,13 127 | Return 128 | 129 | RemoveTT14: 130 | SetTimer, , Off 131 | ToolTip,,,,14 132 | Return 133 | 134 | RemoveTT15: 135 | SetTimer, , Off 136 | ToolTip,,,,15 137 | Return 138 | 139 | RemoveTT16: 140 | SetTimer, , Off 141 | ToolTip,,,,16 142 | Return 143 | 144 | RemoveTT17: 145 | SetTimer, , Off 146 | ToolTip,,,,17 147 | Return 148 | 149 | RemoveTT18: 150 | SetTimer, , Off 151 | ToolTip,,,,18 152 | Return 153 | 154 | RemoveTT19: 155 | SetTimer, , Off 156 | ToolTip,,,,19 157 | Return 158 | 159 | RemoveTT20: 160 | SetTimer, , Off 161 | ToolTip,,,,20 162 | Return 163 | } 164 | ShowToolTip() 165 | { 166 | global ft_ToolTip_Text 167 | If (PauseTooltips || GameActive) 168 | Return 169 | ListLines, Off 170 | static CurrControl, PrevControl, _TT 171 | CurrControl := A_GuiControl 172 | if (CurrControl != PrevControl) { 173 | PrevControl := CurrControl 174 | ToolTip 175 | if (CurrControl != "") 176 | SetTimer, ft_DisplayToolTip, -500 177 | } 178 | return 179 | 180 | ft_DisplayToolTip: 181 | If PauseTooltips 182 | Return 183 | ListLines, Off 184 | MouseGetPos,,, _TT 185 | WinGetClass, _TT, ahk_id %_TT% 186 | if (_TT = "AutoHotkeyGUI") { 187 | stripCtrl := StrReplace(CurrControl,"ft_") 188 | stripCtrl := RegExReplace(stripCtrl,"^Utility\d*","") 189 | stripCtrl := RegExReplace(stripCtrl,"^Flask\d*","") 190 | ToolTip, % RegExMatch(ft_ToolTip_Text, "m`n)^" stripCtrl "\K\s*=.*", _TT) 191 | ? StrReplace(Trim(_TT,"`t ="),"\n","`n") : "" 192 | SetTimer, ft_RemoveToolTip, -10000 193 | } 194 | return 195 | 196 | ft_RemoveToolTip: 197 | ToolTip 198 | return 199 | } 200 | -------------------------------------------------------------------------------- /lib/TrayLabels.ahk: -------------------------------------------------------------------------------- 1 | ; Tray Labels 2 | WINSPY: 3 | SplitPath, A_AhkPath, , AHKDIR 4 | Run, %AHKDIR%\WindowSpy.ahk 5 | Return 6 | RELOAD: 7 | Reload 8 | Return 9 | QuitNow: 10 | ExitApp 11 | Return 12 | -------------------------------------------------------------------------------- /lib/TrayMenu.ahk: -------------------------------------------------------------------------------- 1 | ForceUpdate := Func("checkUpdate").Bind(True) 2 | 3 | Menu, Tray, Tip, WingmanReloaded Dev Ver%VersionNumber% 4 | Menu, Tray, NoStandard 5 | Menu, Tray, Add, WingmanReloaded, optionsCommand 6 | Menu, Tray, Default, WingmanReloaded 7 | Menu, Tray, Add 8 | Menu, Tray, Add, Project Site, LaunchSite 9 | Menu, Tray, Add 10 | Menu, Tray, Add, Make a Donation, LaunchDonate 11 | Menu, Tray, Add 12 | Menu, Tray, Add, Run Calibration Wizard, StartCalibrationWizard 13 | Menu, Tray, Add 14 | Menu, Tray, add, Print Object, PromptForObject 15 | Menu, Tray, add 16 | Menu, Tray, Add, Custom Loot Filter, LaunchLootFilter 17 | Menu, Tray, Add 18 | Menu, Tray, Add, Refresh Chaos Data, RefreshChaosRecipe 19 | Menu, Tray, Add 20 | Menu, Tray, Add, Open FindText interface, ft_Start 21 | Menu, Tray, Add 22 | Menu, Tray, add, Window Spy, WINSPY 23 | Menu, Tray, Add 24 | Menu, Tray, add, Force Update, %ForceUpdate% 25 | Menu, Tray, add 26 | Menu, Tray, add, Reload This Script, RELOAD 27 | Menu, Tray, add 28 | Menu, Tray, add, Exit, QuitNow ; added exit script option 29 | -------------------------------------------------------------------------------- /lib/api/CLASS_PoERequest.ahk: -------------------------------------------------------------------------------- 1 | ; Efficient HTTP requests for POE resources 2 | Class PoERequest { 3 | Stash(TabDigit) { 4 | Static Url := "https://www.pathofexile.com/character-window/get-stash-items" 5 | Static Headers := { "connection":"keep-alive", "cache-control":"max-age=0"} 6 | Headers["cookie"] := PoECookie 7 | postdata := {} 8 | postdata.league := UriEncode(selectedLeague) 9 | postdata.accountName := AccountNameSTR 10 | postdata.tabs := 0 11 | postdata.tabIndex := TabDigit - 1 12 | response := Util.HttpGet(Url,Headers,postdata) 13 | ; Log("Stash API Reply ", "`n" response) 14 | Return This.HandleResponse(response) 15 | } 16 | Account() { 17 | Static Url := "https://www.pathofexile.com/character-window/get-account-name" 18 | Static Headers := { "cache-control":"max-age=0", "accept-encoding":"gzip, deflate, br" } 19 | Headers["cookie"] := PoECookie 20 | response := Util.HttpGet(Url,Headers) 21 | ; Log("Account Response ","Request for account information returned:",response) 22 | obj := This.HandleResponse(response) 23 | Return ( obj ? obj.accountName : False ) 24 | } 25 | Leagues(){ 26 | Static Url := "http://api.pathofexile.com/leagues" 27 | response := Util.HttpGet(Url) 28 | Return This.HandleResponse(response) 29 | } 30 | HandleResponse(response){ 31 | ; response := RegexReplace(response,"[ƒ€ ]","") 32 | response := RegexReplace(response,"^[^\]\[\{\}""]*","") 33 | response := RegexReplace(response,"[^\]\[\{\}""]*$","") 34 | Try { 35 | obj := JSON.Load(response) 36 | If obj.error { 37 | Log("POERequest Error ", "API endpoint returned an error code",obj) 38 | Return False 39 | } 40 | } Catch e { 41 | Log("POERequest Error ","Invalid JSON error" . "`n" response) 42 | Return False 43 | } 44 | Return obj 45 | } 46 | } -------------------------------------------------------------------------------- /lib/api/DBUpdateCheck.ahk: -------------------------------------------------------------------------------- 1 | ; DBUpdateCheck - Check if the database should be updated 2 | ; ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 3 | DBUpdateCheck() 4 | { 5 | Global LastDatabaseParseDate 6 | FormatTime, Date_now, A_Now, yyyyMMdd 7 | 8 | try { 9 | IfWinExist, ahk_group POEGameGroup 10 | { 11 | Return 12 | } 13 | Else If (YesNinjaDatabase && DaysSince()) 14 | { 15 | For k, apiKey in apiList 16 | ScrapeNinjaData(apiKey) 17 | JSONtext := JSON.Dump(Ninja,,2) 18 | FileDelete, %A_ScriptDir%\data\Ninja.json 19 | FileAppend, %JSONtext%, %A_ScriptDir%\data\Ninja.json 20 | IniWrite, %Date_now%, %A_ScriptDir%\save\Settings.ini, Database, LastDatabaseParseDate 21 | LastDatabaseParseDate := Date_now 22 | } 23 | } catch e { 24 | Log("Error","DBUpdateCheck Error: " ErrorText(e)) 25 | } 26 | Return 27 | } 28 | -------------------------------------------------------------------------------- /lib/api/POE_UpdateLeagues.ahk: -------------------------------------------------------------------------------- 1 | ; UpdateLeagues - Grab the League info from GGG API 2 | UpdateLeagues: 3 | Gui, Submit, nohide 4 | UrlDownloadToFile, http://api.pathofexile.com/leagues, %A_ScriptDir%\data\leagues.json 5 | LeagueIndex := JSON.Load(FileOpen(A_ScriptDir "\data\leagues.json","r").Read()) 6 | textList= 7 | For K, V in LeagueIndex 8 | textList .= "|" LeagueIndex[K]["id"] 9 | GuiControl, , selectedLeague, % "|" selectedLeague "|" textList 10 | GuiControl, ChooseString, selectedLeague, %selectedLeague% 11 | Return 12 | -------------------------------------------------------------------------------- /lib/api/RefreshStatsList.ahk: -------------------------------------------------------------------------------- 1 | RefreshStatsList(){ 2 | tooltip, refreshing stats 3 | UrlDownloadToFile, https://www.pathofexile.com/api/trade/data/stats, %A_ScriptDir%\temp\new_Stats.json 4 | result := JSON.Load(RegExReplace(FileOpen(A_ScriptDir "\temp\new_Stats.json","r").Read(), " \(\\u00d7#\)", ""),,1).result 5 | AffixKeyList := [] 6 | EnchantKeyList := [] 7 | for Ck, Cv in result 8 | { 9 | For k, v in Cv.entries 10 | { 11 | v.text := RegExReplace(v.text, rxNum, "#") 12 | If InStr(v.text,"`n") 13 | { 14 | tlist := [] 15 | For k, t in StrSplit(v.text,"`n") 16 | tlist.Push(t) 17 | v.text := tlist 18 | } 19 | If indexOf(Cv.label,["Explicit","Implicit"]) 20 | { 21 | If IsObject(v.text) 22 | { 23 | for i, t in v.text 24 | If !indexOf(t,AffixKeyList) 25 | AffixKeyList.Push(t) 26 | } Else { 27 | If !indexOf(v.text,AffixKeyList) 28 | AffixKeyList.Push(v.text) 29 | } 30 | } 31 | If indexOf(Cv.label,["Enchant"]) 32 | { 33 | If IsObject(v.text) 34 | { 35 | for i, t in v.text 36 | If !indexOf(t,EnchantKeyList) 37 | EnchantKeyList.Push(t) 38 | } Else If IsObject(v.option) { 39 | desc := StrSplit(v.text,"#").1 40 | For i, t in v.option.options 41 | for i, tx in StrSplit(RegExReplace(RegExReplace(t.text, "\+", ""), rxNum, "#"), "`n") 42 | If !indexOf(desc tx,EnchantKeyList) 43 | EnchantKeyList.Push(desc tx) 44 | } Else { 45 | If !indexOf(v.text,EnchantKeyList) 46 | EnchantKeyList.Push(v.text) 47 | } 48 | } 49 | } 50 | } 51 | ; MsgBoxVals(AffixKeyList) 52 | 53 | tooltip, 54 | FileOpen(A_ScriptDir "\data\GGG_Stats.json","w").Write(JSON_Beautify(result," ",3)) 55 | FileOpen(A_ScriptDir "\data\WR_Affix.json","w").Write(JSON_Beautify(AffixKeyList," ",3)) 56 | FileOpen(A_ScriptDir "\data\WR_Enchant.json","w").Write(JSON_Beautify(EnchantKeyList," ",3)) 57 | } -------------------------------------------------------------------------------- /lib/api/Update.ahk: -------------------------------------------------------------------------------- 1 | checkUpdate(force:=False){ 2 | Global BranchName 3 | If (!AutoUpdateOff || force) 4 | { 5 | UrlDownloadToFile, https://raw.githubusercontent.com/BanditTech/WingmanReloaded/%BranchName%/data/version.html, %A_ScriptDir%\temp\version.html 6 | newestVersion := FileOpen(A_ScriptDir "\temp\version.html","r").Read() 7 | If InStr(newestVersion, ":") 8 | { 9 | Log("Error","There was an issue when attempting to download the version file",newestVersion) 10 | Return 11 | } 12 | If RegExMatch(newestVersion, "[.0-9]+", matchVersion) 13 | newestVersion := matchVersion 14 | if ( VersionNumber < newestVersion || force) 15 | { 16 | UrlDownloadToFile, https://raw.githubusercontent.com/BanditTech/WingmanReloaded/%BranchName%/data/changelog.txt, %A_ScriptDir%\temp\changelog.txt 17 | changelog := FileOpen(A_ScriptDir "\temp\changelog.txt","r").Read() 18 | Gui, Update: +AlwaysOnTop 19 | Gui, Update:Add, Button, x0 y0 h1 w1, a 20 | Gui, Update:Add, Text,, Update Available.`nYoure running version %VersionNumber%. The newest is version %newestVersion%`n 21 | Gui, Update:Add, Edit, w600 h200 +ReadOnly, %changelog% 22 | Gui, Update:Add, Button, x70 section default grunUpdate, Update to the Newest Version! 23 | Gui, Update:Add, Button, x+35 ys gLaunchDonate, Support the Project 24 | Gui, Update:Add, Button, x+35 ys gdontUpdate, Turn off Auto-Update 25 | Gui, Update:Show,, WingmanReloaded Update 26 | IfWinExist WingmanReloaded Update ahk_exe AutoHotkey.exe 27 | { 28 | WinWaitClose 29 | } 30 | } 31 | } 32 | Return 33 | 34 | UpdateGuiClose: 35 | UpdateGuiEscape: 36 | Gui, Update: Destroy 37 | Return 38 | runUpdate: 39 | Fail:=False 40 | Log("Update","Running") 41 | 7za.install(BranchName) 42 | Run "%A_ScriptFullPath%" 43 | Sleep 5000 ;This shouldn't ever hit. 44 | Log("Error","There was an issue with the update") 45 | Return 46 | dontUpdate: 47 | IniWrite, 1, %A_ScriptDir%\save\Settings.ini, General, AutoUpdateOff 48 | MsgBox, Auto-Updates have been disabled.`nCheck back on the forum for more information!`nTo resume updates, uncheck the box in config page. 49 | Gui, 4:Destroy 50 | return 51 | } 52 | 53 | ; DaysSince - Check how many days has it been since the last update 54 | DaysSince() 55 | { 56 | Global LastDatabaseParseDate, UpdateDatabaseInterval 57 | FormatTime, Date_now, A_Now, yyyyMMdd 58 | If Date_now = LastDatabaseParseDate ; 59 | Return False 60 | daysCount := Date_now 61 | daysCount -= LastDatabaseParseDate, days 62 | If daysCount= 63 | { 64 | ;the value is too large of a dif to calculate, this means we should update 65 | Return True 66 | } 67 | Else If (daysCount >= UpdateDatabaseInterval) 68 | { 69 | ;The Count between the two dates is at/above the threshold, this means we should update 70 | Return daysCount 71 | } 72 | Else 73 | { 74 | ;The Count between the two dates is below the threshold, this means we should not 75 | Return False 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /lib/gui/CraftingPopup.ahk: -------------------------------------------------------------------------------- 1 | CraftBasicPopUp(){ 2 | static _init_ := CraftBasicPopUpBuild() 3 | Global CraftMenu, RunningToggle 4 | CheckRunning() 5 | 6 | If !(CraftMenu.Active){ 7 | MouseGetPos itemx, itemy 8 | CraftMenu.SetKey(hotkeyCraftBasic) 9 | ; CraftMenu.SetKeySpecial("Ctrl") 10 | selection := CraftMenu.Show() 11 | MouseMove %itemx%, %itemy% 12 | 13 | If selection 14 | { 15 | If DebugMessages 16 | { 17 | If (selection = "Maps") 18 | Notify("Begin Bulk Crafting Maps","",2) 19 | Else If (selection = "Socket") 20 | Notify("Socketing Selected Item","",2) 21 | Else If (selection = "Color") 22 | Notify("Coloring Selected Item","",2) 23 | Else If (selection = "Link") 24 | Notify("Linking Selected Item","",2) 25 | Else If (selection = "Chance") 26 | Notify("Chance Selected Item until Unique","Either Bulk mode or Scour",2) 27 | Else 28 | Notify("Result is:",selection,2) 29 | } 30 | WinActivate, % GameStr 31 | Crafting(selection) 32 | } 33 | Else WinActivate, % GameStr 34 | } 35 | } 36 | ; Build crafting popup menu 37 | CraftBasicPopUpBuild(){ 38 | global hotkeyCraftBasic, CraftMenu 39 | CraftMenu := new Radial_Menu 40 | CraftMenu.SetSections("5") 41 | CraftMenu.Add("Chance","Images/Chance.png", "1") 42 | CraftMenu.Add("Socket","Images/Jeweller.png", "2") 43 | CraftMenu.Add("Color","Images/Chromatic.png", "3") 44 | CraftMenu.Add("Link","Images/Fusing.png", "4") 45 | CraftMenu.Add("Maps","Images/Maps.png", "5") 46 | ; CraftMenu.Add2("Jeweller","Images/Jeweller.png", "4") 47 | } 48 | -------------------------------------------------------------------------------- /lib/gui/DPI.ahk: -------------------------------------------------------------------------------- 1 | Get_DpiFactor() { 2 | return A_ScreenDPI=96?1:A_ScreenDPI/96 3 | } 4 | Scale_PositionFromDPI(val){ 5 | dpif := Get_DpiFactor() 6 | If (dpif != 1) 7 | val := val / dpif 8 | Return val 9 | } 10 | -------------------------------------------------------------------------------- /lib/gui/Ignore List.ahk: -------------------------------------------------------------------------------- 1 | IgnoreClose: 2 | IgnoreEscape: 3 | SaveIgnoreArray() 4 | Gui, Ignore: Destroy 5 | Gui, Inventory: Show 6 | Return 7 | 8 | 9 | BuildIgnoreMenu: 10 | Gui, Submit 11 | Gui, Ignore: +LabelIgnore -MinimizeBox +AlwaysOnTop 12 | Gui, Ignore: Font, Bold 13 | Gui, Ignore: Add, GroupBox, w660 h305 Section xm ym, Ignored Inventory Slots: 14 | Gui, Ignore: Add, Picture, w650 h-1 xs+5 ys+15, %A_ScriptDir%\data\InventorySlots.png 15 | Gui, Ignore: Font 16 | LoadIgnoreArray() 17 | 18 | Gui, Ignore: Add, Text, w1 h1 xs+25 ys+13, "" 19 | For C, GridX in InventoryGridX 20 | { 21 | If (C != 1) 22 | Gui, Ignore: Add, Text, w1 h1 x+18 ys+13, "" 23 | For R, GridY in InventoryGridY 24 | { 25 | ++ind 26 | checkboxStr := "IgnoredSlot_" . C . "_" . R 27 | checkboxTik := IgnoredSlot[C][R] 28 | Gui, Ignore: Add, Checkbox, v%checkboxStr% gUpdateCheckbox y+25 h27 Checked%checkboxTik%,% (ind < 10 ? "0" . ind : ind) 29 | } 30 | } 31 | ind=0 32 | MainMenu() 33 | Gui, Ignore: Show 34 | Return 35 | 36 | UpdateCheckbox: 37 | Gui, Ignore: Submit, NoHide 38 | btnArr := StrSplit(A_GuiControl, "_") 39 | C := btnArr[2] 40 | R := btnArr[3] 41 | IgnoredSlot[C][R] := %A_GuiControl% 42 | Return 43 | 44 | LoadIgnoreArray() 45 | { 46 | IgnoredSlot := JSON.Load(FileOpen(A_ScriptDir "\save\IgnoredSlot.json","r").Read()) 47 | Return 48 | } 49 | 50 | SaveIgnoreArray() 51 | { 52 | SaveIgnoreArray: 53 | Gui, Ignore: Submit, NoHide 54 | JSONtext := JSON.Dump(IgnoredSlot,,2) 55 | FileDelete, %A_ScriptDir%\save\IgnoredSlot.json 56 | FileAppend, %JSONtext%, %A_ScriptDir%\save\IgnoredSlot.json 57 | LoadIgnoreArray() 58 | Return 59 | } 60 | 61 | IgnoreSlotSetup(){ 62 | ;Ignore Slot setup 63 | IfNotExist, %A_ScriptDir%\save\IgnoredSlot.json 64 | { 65 | For C, GridX in InventoryGridX 66 | { 67 | IgnoredSlot[C] := {} 68 | For R, GridY in InventoryGridY 69 | { 70 | IgnoredSlot[C][R] := False 71 | } 72 | } 73 | SaveIgnoreArray() 74 | } 75 | Else 76 | LoadIgnoreArray() 77 | } -------------------------------------------------------------------------------- /lib/gui/IngameOverlay.ahk: -------------------------------------------------------------------------------- 1 | ; Trigger Status Overlay 2 | Gui 2:Color, 0X130F13 3 | Gui 2:+LastFound +AlwaysOnTop +ToolWindow -Caption +E0x20 4 | WinSet, TransColor, 0X130F13 5 | Gui 2:Font, bold cFFFFFF S9, Trebuchet MS 6 | Gui 2:Add, Text, y+0.5 BackgroundTrans voverlayT1, Quit: OFF 7 | Gui 2:Add, Text, y+0.5 BackgroundTrans voverlayT2, Flask: OFF 8 | Gui 2:Add, Text, y+0.5 BackgroundTrans voverlayT3, Move: OFF 9 | Gui 2:Add, Text, y+0.5 BackgroundTrans voverlayT4, Util: OFF 10 | 11 | ; Chaos Recipe Overlay 12 | Gui Chaos:Color, 0X130F13 13 | Gui Chaos:+LastFound +AlwaysOnTop +ToolWindow -Caption +E0x20 14 | WinSet, TransColor, 0X130F13 15 | Gui Chaos:Font, bold cFFFFFF S9, Trebuchet MS 16 | Gui Chaos:Add, Text, Right BackgroundTrans cRed , Chest: 17 | Gui Chaos:Add, Text, Center w25 x+5 BackgroundTrans vGuiChaosCountChest , %GuiChaosCountChest% 18 | 19 | Gui Chaos:Add, Text, Right x+8 BackgroundTrans cGreen , Helmet: 20 | Gui Chaos:Add, Text, Center w25 x+5 BackgroundTrans vGuiChaosCountHelmet , %GuiChaosCountHelmet% 21 | 22 | Gui Chaos:Add, Text, Right x+8 BackgroundTrans cBlue , Boot: 23 | Gui Chaos:Add, Text, Center w25 x+5 BackgroundTrans vGuiChaosCountBoot , %GuiChaosCountBoot% 24 | 25 | Gui Chaos:Add, Text, Right x+8 BackgroundTrans cAqua , Glove: 26 | Gui Chaos:Add, Text, Center w25 x+5 BackgroundTrans vGuiChaosCountGlove , %GuiChaosCountGlove% 27 | 28 | Gui Chaos:Add, Text, Right x+8 BackgroundTrans cOlive , Belt: 29 | Gui Chaos:Add, Text, Center w25 x+5 BackgroundTrans vGuiChaosCountBelt , %GuiChaosCountBelt% 30 | 31 | Gui Chaos:Add, Text, Right x+8 BackgroundTrans cWhite , Weapons: 32 | Gui Chaos:Add, Text, Center w25 x+5 BackgroundTrans vGuiChaosCountWeapons, %GuiChaosCountWeapons% 33 | 34 | Gui Chaos:Add, Text, Right x+8 BackgroundTrans cPurple , Rings: 35 | Gui Chaos:Add, Text, Center w25 x+5 BackgroundTrans vGuiChaosCountRings , %GuiChaosCountRings% 36 | 37 | Gui Chaos:Add, Text, Right x+8 BackgroundTrans cFuchsia , Amulet: 38 | Gui Chaos:Add, Text, Center w25 x+5 BackgroundTrans vGuiChaosCountAmulet , %GuiChaosCountAmulet% 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | IfWinExist, ahk_group POEGameGroup 51 | { 52 | Rescale() 53 | Gui 2: Show,% "x" WR.loc.pixel.Gui.X " y" WR.loc.pixel.Gui.Y - 15 " NA" 54 | Gui Chaos: Show,% "x" (WR.loc.pixel.GuiChaos.X - 300) " y" WR.loc.pixel.GuiChaos.Y " NA" 55 | GuiUpdate() 56 | ToggleExist := True 57 | } 58 | -------------------------------------------------------------------------------- /lib/gui/ItemInfo.ahk: -------------------------------------------------------------------------------- 1 | Gui, ItemInfo: +AlwaysOnTop +LabelItemInfo -MinimizeBox 2 | Gui, ItemInfo: Margin, 10, 10 3 | Gui, ItemInfo: Font, Bold s8 c4D7186, Verdana 4 | Gui, ItemInfo: Add, GroupBox, vGroupBox1 xm+1 y+1 h251 w554 , %GroupBox1% 5 | Gui, ItemInfo: Add, Text, xp+3 yp+20 Section h1 w1 , "" 6 | Loop, % 21 + ( Y := 15 ) - 15 ; Loop 21 times 7 | { 8 | addY := y + 10 9 | Gui, ItemInfo: Add, Text, vPercentText1G%A_Index% xs+10 y%addY% w70 h10 0x200 Right, % Abs( 125 - ( Y += 10 ) ) "`%" 10 | } 11 | 12 | Gui, ItemInfo: Add, Text, % "x+5 ys w" (graphWidth + 2) " h" (graphHeight + 2) " 0x1000" ; SS_SUNKEN := 0x1000 13 | Gui, ItemInfo: Add, Text, % "xp+1 yp+1 w" graphWidth " h" graphHeight " hwndhGraph1", pGraph1 14 | Gui, ItemInfo: Add, Text, Section x+8 vPComment1, %PComment1% 15 | Gui, ItemInfo: Add, Text, x+8 vPData1, %PData1% 16 | Gui, ItemInfo: Add, Text, xs vPComment2, %PComment2% 17 | Gui, ItemInfo: Add, Text, x+8 vPData2, %PData2% 18 | Gui, ItemInfo: Add, Text, xs vPComment3, %PComment3% 19 | Gui, ItemInfo: Add, Text, x+8 vPData3, %PData3% 20 | Gui, ItemInfo: Add, Text, xs vPComment4, %PComment4% 21 | Gui, ItemInfo: Add, Text, x+8 vPData4, %PData4% 22 | Gui, ItemInfo: Add, Text, xs vPComment5, %PComment5% 23 | Gui, ItemInfo: Add, Text, x+8 vPData5, %PData5% 24 | Gui, ItemInfo: Add, Text, xs vPComment6, %PComment6% 25 | Gui, ItemInfo: Add, Text, x+8 vPData6, %PData6% 26 | Gui, ItemInfo: Add, Text, xs vPComment7, %PComment7% 27 | Gui, ItemInfo: Add, Text, x+8 vPData7, %PData7% 28 | Gui, ItemInfo: Add, Text, xs vPComment8, %PComment8% 29 | Gui, ItemInfo: Add, Text, x+8 vPData8, %PData8% 30 | Gui, ItemInfo: Add, Text, xs vPComment9, %PComment9% 31 | Gui, ItemInfo: Add, Text, x+8 vPData9, %PData9% 32 | Gui, ItemInfo: Add, Text, xs vPComment10, %PComment10% 33 | Gui, ItemInfo: Add, Text, x+8 vPData10, %PData10% 34 | 35 | Gui, ItemInfo: Add, GroupBox, vGroupBox2 x+15 ys-21 h251 w554 , %GroupBox2% 36 | Gui, ItemInfo: Add, Text, xp+3 ys Section h1 w1 , "" 37 | Loop, % 21 + ( Y := 15 ) - 15 ; Loop 21 times 38 | { 39 | addY := y + 10 40 | Gui, ItemInfo: Add, Text, vPercentText2G%A_Index% xs+10 y%addY% w70 h10 0x200 Right, % Abs( 125 - ( Y += 10 ) ) "`%" 41 | } 42 | Gui, ItemInfo: Add, Text, % "x+5 ys w" (graphWidth + 2) " h" (graphHeight + 2) " 0x1000" ; SS_SUNKEN := 0x1000 43 | Gui, ItemInfo: Add, Text, % "xp+1 yp+1 w" graphWidth " h" graphHeight " hwndhGraph2", pGraph2 44 | Gui, ItemInfo: Add, Text, Section x+8 vSComment1, %SComment1% 45 | Gui, ItemInfo: Add, Text, x+8 vSData1, %SData1% 46 | Gui, ItemInfo: Add, Text, xs vSComment2, %SComment2% 47 | Gui, ItemInfo: Add, Text, x+8 vSData2, %SData2% 48 | Gui, ItemInfo: Add, Text, xs vSComment3, %SComment3% 49 | Gui, ItemInfo: Add, Text, x+8 vSData3, %SData3% 50 | Gui, ItemInfo: Add, Text, xs vSComment4, %SComment4% 51 | Gui, ItemInfo: Add, Text, x+8 vSData4, %SData4% 52 | Gui, ItemInfo: Add, Text, xs vSComment5, %SComment5% 53 | Gui, ItemInfo: Add, Text, x+8 vSData5, %SData5% 54 | Gui, ItemInfo: Add, Text, xs vSComment6, %SComment6% 55 | Gui, ItemInfo: Add, Text, x+8 vSData6, %SData6% 56 | Gui, ItemInfo: Add, Text, xs vSComment7, %SComment7% 57 | Gui, ItemInfo: Add, Text, x+8 vSData7, %SData7% 58 | Gui, ItemInfo: Add, Text, xs vSComment8, %SComment8% 59 | Gui, ItemInfo: Add, Text, x+8 vSData8, %SData8% 60 | Gui, ItemInfo: Add, Text, xs vSComment9, %SComment9% 61 | Gui, ItemInfo: Add, Text, x+8 vSData9, %SData9% 62 | Gui, ItemInfo: Add, Text, xs vSComment10, %SComment10% 63 | Gui, ItemInfo: Add, Text, x+8 vSData10, %SData10% 64 | 65 | global hBM := CreateDIB( "E9F5F8|E9F5F8|AFAFAF|AFAFAF|E9F5F8|E9F5F8", 2, 3, graphWidth, graphHeight, 0) 66 | global pGraph1 := XGraph( hGraph1, hBM, 21, "1,10,0,10", 0xFF0000, 2 ) 67 | global pGraph2 := XGraph( hGraph2, hBM, 21, "1,10,0,10", 0xFF0000, 2 ) 68 | 69 | 70 | Gui, ItemInfo: Add, GroupBox, Section xm+1 y+30 h251 w364 , Item Properties 71 | Gui, ItemInfo: Add, Edit, VScroll HScroll vItemInfoPropText xp+2 ys+17 w358, %ItemInfoPropText% 72 | Gui, ItemInfo: Add, GroupBox, x+10 ys h251 w364 , Item Statistics 73 | Gui, ItemInfo: Add, Edit, VScroll HScroll vItemInfoStatText xp+2 ys+17 w358, %ItemInfoStatText% 74 | Gui, ItemInfo: Add, GroupBox, x+9 ys h251 w364 , Item Affixes 75 | Gui, ItemInfo: Add, Edit, VScroll HScroll vItemInfoAffixText xp+2 ys+17 w358, %ItemInfoAffixText% 76 | Gui, ItemInfo: Add, GroupBox, x+9 ys h251 w364 , Item Modifiers 77 | Gui, ItemInfo: Add, Edit, VScroll HScroll vItemInfoModifierText xp+2 ys+17 w358, %ItemInfoModifierText% 78 | -------------------------------------------------------------------------------- /lib/gui/LootColorsMenu.ahk: -------------------------------------------------------------------------------- 1 | LootColorsMenu(){ 2 | DrawLootColors: 3 | Static LG_Add, LG_Rem 4 | Global LootColors, LG_Vary 5 | Gui, Submit 6 | CheckGamestates := False 7 | gui,LootColors: new, LabelLootColors 8 | gui,LootColors: -MinimizeBox 9 | Gui LootColors: Add, Checkbox, section gUpdateExtra vLootVacuum Checked%LootVacuum% xm+5 ym+8 , Enable Loot Vacuum 10 | Gui LootColors: Add, Checkbox, gUpdateExtra vLootVacuumTapZ Checked%LootVacuumTapZ% x+5 yp , Double tap Z 11 | Gui LootColors: Add, Checkbox, gUpdateExtra vLootVacuumTapZEnd Checked%LootVacuumTapZEnd% x+5 yp , on release 12 | Gui LootColors: Add, Text, x+5 yp , %LootVacuumTapZSec% 13 | Gui LootColors: Add, UpDown, gUpdateExtra vLootVacuumTapZSec range1-10, %LootVacuumTapZSec% 14 | 15 | Gui,LootColors: Add, DropDownList, gUpdateExtra vAreaScale w45 xm+5 y+8, 0|30|40|50|60|70|80|90|100|200|300|400|500 16 | GuiControl,LootColors: ChooseString, AreaScale, %AreaScale% 17 | Gui,LootColors: Add, Text, x+3 yp+5 , Area around mouse 18 | Gui,LootColors: Add, DropDownList, gUpdateExtra vLVdelay w45 x+5 yp-5, 0|15|30|45|60|75|90|105|120|135|150|195|300 19 | GuiControl,LootColors: ChooseString, LVdelay, %LVdelay% 20 | Gui,LootColors: Add, Text, x+3 yp+5 , Delay after click 21 | gui,LootColors: add, CheckBox, gUpdateExtra vYesLootChests Checked%YesLootChests% Right xm h22, Open Containers? 22 | Gui,LootColors: +Delimiter? 23 | Gui,LootColors: Add, ComboBox, x+5 w210 vChestStr gUpdateStringEdit , %ChestStr%??"%1080_ChestStr%"?"%1050_ChestStr%" 24 | Gui,LootColors: +Delimiter| 25 | gui,LootColors: add, CheckBox, gUpdateExtra vYesLootDelve Checked%YesLootDelve% Right xm h22, Delve Containers? 26 | Gui,LootColors: +Delimiter? 27 | Gui,LootColors: Add, ComboBox, x+5 w210 vDelveStr gUpdateStringEdit , %DelveStr%??"%1080_DelveStr%" 28 | Gui,LootColors: +Delimiter| 29 | gui,LootColors: add, groupbox,% "section xm y+10 w330 h" 24 * (LootColors.Count() / 2) + 30 , Loot Colors: 30 | gui,LootColors: add, Button, gSaveLootColorArray yp-5 xp+70 h22 w80, Save to INI 31 | gui,LootColors: add, Button, gAdjustLootGroup vLG_Add yp x+5 h22 wp, Add Color Set 32 | gui,LootColors: add, Button, gAdjustLootGroup vLG_Rem yp x+5 h22 wp, Rem Color Set 33 | Item := 0 34 | For k, color in LootColors 35 | { 36 | ; color := val ; hexBGRToRGB(Format("0x{1:06X}",val)) 37 | If !Mod(k,2) ;Check for a remainder when dividing by 2, this groups the colors 38 | { 39 | gui,LootColors: add, Progress, x+1 yp w50 h20 c%color% BackgroundBlack,100 40 | gui,LootColors: add, Button, gResampleLootColor yp x+5 h20,% "Resample " Item 41 | continue 42 | } 43 | Item++ 44 | If A_Index = 1 45 | { 46 | gui,LootColors: add, text, yp+38 xs+10,% "Background " Item " Colors: " 47 | gui,LootColors: add, Progress, x+10 yp-5 w50 h20 c%color% BackgroundBlack,100 48 | continue 49 | } 50 | gui,LootColors: add, text, yp+29 xs+10,% "Background " Item " Colors: " 51 | gui,LootColors: add, Progress, x+10 yp-5 w50 h20 c%color% BackgroundBlack,100 52 | } 53 | Gui,LootColors: show,,Loot Vacuum settings 54 | return 55 | 56 | AdjustLootGroup: 57 | Global LootColors 58 | Gui, Submit 59 | ind := LootColors.MaxIndex() 60 | If (A_GuiControl = "LG_Add") 61 | { 62 | LootColors[ind + 1] := 0xFFFFFF 63 | LootColors[ind + 2] := 0xFFFFFF 64 | } 65 | Else If (A_GuiControl = "LG_Rem" && ind > 2) 66 | { 67 | LootColors.Pop(ind) 68 | LootColors.Pop(ind - 1) 69 | } 70 | Gui, LootColors: Destroy 71 | LootColorsMenu() 72 | Return 73 | 74 | ResampleLootColor: 75 | ; Thread, NoTimers, True ; Critical 76 | RemoveToolTip() 77 | PauseTooltips := 1 78 | groupNumber := StrSplit(A_GuiControl, A_Space)[2] 79 | MO_Index := (BG_Index := groupNumber * 2) - 1 80 | IfWinExist, ahk_group POEGameGroup 81 | { 82 | WinActivate, ahk_group POEGameGroup 83 | } else { 84 | MsgBox % "PoE Window does not exist. `nCannot sample the loot color." 85 | Return 86 | } 87 | ToolTip,% "Press ""A"" to sample loot background" 88 | . "`nHold Escape and press ""A"" to cancel" 89 | , % ScrCenter.X - 115 , % ScrCenter.Y - GameH // 3 90 | KeyWait, a, D L 91 | ToolTip 92 | KeyWait, a 93 | If GetKeyState("Escape", "P") 94 | { 95 | MsgBox % "Escape key was held`n" 96 | . "Canceling the sample!" 97 | Gui, LootColors: Show 98 | Exit 99 | } 100 | if WinActive(ahk_group POEGameGroup){ 101 | BlockInput, MouseMove 102 | MouseGetPos, mX, mY 103 | FindText.ScreenShot(), BG_Color := FindText.GetColor(mX,mY) 104 | LootColors[BG_Index] := Format("0x{1:06X}",BG_Color) 105 | Sleep, 100 106 | SendInput {%hotkeyLootScan% down} 107 | Sleep, 200 108 | FindText.ScreenShot(), MO_Color := FindText.GetColor(mX,mY) 109 | LootColors[MO_Index] := Format("0x{1:06X}",MO_Color) 110 | SendInput {%hotkeyLootScan% up} 111 | BlockInput, MouseMoveOff 112 | } else { 113 | MsgBox % "PoE Window is not active. `nSampling the loot color didn't work" 114 | Gui, LootColors: Show 115 | Exit 116 | } 117 | Gui, LootColors: Destroy 118 | PauseTooltips := 0 119 | LootColorsMenu() 120 | Thread, NoTimers, False ;End Critical 121 | Return 122 | 123 | SaveLootColorArray: 124 | LCstr := hexArrToStr(LootColors) 125 | IniWrite, %LCstr%, %A_ScriptDir%\save\Settings.ini, Loot Colors, LootColors 126 | LootScan(1) 127 | MsgBox % "LootColors saved with the following hex values:" 128 | . "`n" . LCstr 129 | Return 130 | 131 | LootColorsClose: 132 | LootColorsEscape: 133 | Gui, LootColors: Destroy 134 | MainMenu() 135 | Return 136 | } 137 | -------------------------------------------------------------------------------- /lib/gui/OHB_Editor.ahk: -------------------------------------------------------------------------------- 1 | OHB_Editor(){ 2 | Static OHB_Width := 104, OHB_Height := 1, OHB_Variance := 1, OHB_LR_border:=1, OHB_Split := ToRGB(0x221415), Initialized := 0, OHB_CReset, OHB_Test 3 | global OHB_Preview,OHB_r,OHB_g,OHB_b, OHB_Color = 0x221415,OHB_StringEdit 4 | If !Initialized 5 | { 6 | Gui, OHB: new 7 | Gui, OHB: +AlwaysOnTop 8 | Gui, OHB: Font, cBlack s20 9 | Gui, OHB: add, Text, xm , Output String: 10 | Gui, OHB: add, Button, x+120 yp hp wp vOHB_Test gOHBUpdate, Test String 11 | Gui, OHB: Font, 12 | Gui, OHB: add, edit, xm vOHB_StringEdit gOHBUpdate w480 h25, % Hex2FindText(OHB_Color,OHB_Variance,0,"OHB_Bar",OHB_Width,OHB_Height,OHB_LR_border) 13 | Gui, OHB: Font, cBlack s20 14 | Gui, OHB: add, text, xm y+35, Width: 15 | Gui, OHB: add, text, x+0 yp w65, %OHB_Width% 16 | Gui, OHB: add, UpDown, vOHB_Width gOHBUpdate Range20-300 , %OHB_Width% 17 | Gui, OHB: add, text, x+20 , Height: 18 | Gui, OHB: add, text, x+0 yp w40, %OHB_Height% 19 | Gui, OHB: add, UpDown, vOHB_Height gOHBUpdate Range1-5 , %OHB_Height% 20 | Gui, OHB: add, text, x+20 , Variance: 21 | Gui, OHB: add, text, x+0 yp w40, %OHB_Variance% 22 | Gui, OHB: add, UpDown, vOHB_Variance gOHBUpdate , %OHB_Variance% 23 | 24 | Gui, OHB: add, Edit, xm y+35 w140 h35 vOHB_Color gOHBUpdate, %OHB_Color% 25 | Gui, OHB: add, text, x+20 yp, R: 26 | Gui, OHB: add, text, x+0 yp w65,% OHB_Split.r 27 | Gui, OHB: add, updown, vOHB_r gOHBUpdate range0-255, % OHB_Split.r 28 | Gui, OHB: add, text, x+20 yp, G: 29 | Gui, OHB: add, text, x+0 yp w65,% OHB_Split.g 30 | Gui, OHB: add, updown, vOHB_g gOHBUpdate range0-255, % OHB_Split.g 31 | Gui, OHB: add, text, x+20 yp, B: 32 | Gui, OHB: add, text, x+0 yp w65,% OHB_Split.b 33 | Gui, OHB: add, updown, vOHB_b gOHBUpdate range0-255, % OHB_Split.b 34 | Gui, OHB: add, Progress, xm y+5 w140 h40 vOHB_Preview c%OHB_Color% BackgroundBlack,100 35 | Gui, OHB: add, Button, x+90 yp hp wp+40 vOHB_CReset gOHBUpdate, Reset Color 36 | } 37 | Gui, OHB: show , w535 h300, OHB String Builder 38 | Return 39 | 40 | OHBUpdate: 41 | If (A_GuiControl = "OHB_Test") 42 | { 43 | If GamePID 44 | { 45 | Gui, OHB: Submit 46 | WinActivate, %GameStr% 47 | Sleep, 145 48 | WinGetPos, GameX, GameY, GameW, GameH 49 | } 50 | Else 51 | { 52 | MsgBox, 262144, Cannot find game, Make sure you have the game open 53 | Return 54 | } 55 | If (Bar:=FindText(GameX + Round((GameW / 2)-(OHB_Width/2 + 1)), GameY + Round(GameH / (1080 / 177)), GameX + Round((GameW / 2 + 1)+(OHB_Width/2)), Round(GameH / (1080 / 370)) , 0, 0, OHB_StringEdit)) 56 | { 57 | MsgBox, 262144, String Found, OHB string was found!`nMake sure the highlighted matched area is the entire width of the healthbar`nThe red and blue flashing boxes should go to the very inner edge`n`nIf you are done, copy the string into the String Tab 58 | MouseTip(Bar.1.1, Bar.1.2, (Bar.1.3<2?2:Bar.1.3), (Bar.1.4<2?2:Bar.1.4)) 59 | OHB_Editor() 60 | } 61 | Else 62 | { 63 | MsgBox, 262144, Cannot find string, OHB string was not found!`nMake sure the width is an even number`nTry reset the color if its adjusted 64 | OHB_Editor() 65 | } 66 | } 67 | Else If (A_GuiControl = "OHB_EditorBtn") 68 | { 69 | Gui,Strings: submit 70 | OHB_Editor() 71 | return 72 | } 73 | Else 74 | Gui, OHB: Submit, NoHide 75 | If (A_GuiControl = "OHB_r" || A_GuiControl = "OHB_g" || A_GuiControl = "OHB_b") 76 | { 77 | OHB_Split.r := OHB_r, OHB_Split.g := OHB_g, OHB_Split.b := OHB_b, OHB_Color := ToHex(OHB_Split) 78 | GuiControl,OHB: , OHB_Color, %OHB_Color% 79 | GuiControl,OHB: +c%OHB_Color%, OHB_Preview 80 | } 81 | Else If (A_GuiControl = "OHB_Color" || A_GuiControl = "OHB_CReset") 82 | { 83 | If (A_GuiControl = "OHB_CReset") 84 | { 85 | OHB_Color = 0x221415 86 | GuiControl,OHB: , OHB_Color, %OHB_Color% 87 | } 88 | OHB_Split := ToRGB(OHB_Color) 89 | GuiControl,OHB: , OHB_r, % OHB_Split.r 90 | GuiControl,OHB: , OHB_g, % OHB_Split.g 91 | GuiControl,OHB: , OHB_b, % OHB_Split.b 92 | GuiControl,OHB: +c%OHB_Color%, OHB_Preview 93 | } 94 | GuiControl, , OHB_StringEdit, % Hex2FindText(OHB_Color,OHB_Variance,0,"OHB_Bar",OHB_Width,OHB_Height,OHB_LR_border) 95 | Return 96 | 97 | OHBGuiClose: 98 | OHBGuiEscape: 99 | Gui, OHB: hide 100 | Gui, Strings: show 101 | return 102 | } 103 | -------------------------------------------------------------------------------- /lib/gui/PromptForObject.ahk: -------------------------------------------------------------------------------- 1 | ; horrible looking UI to print an object, needs work 2 | PromptForObject(){ 3 | Global 4 | Gui, ArrayPrint: New 5 | Gui, ArrayPrint: Add, Edit, xm+20 ym+20 w200 h23 vSubmitObjectName 6 | Gui, ArrayPrint: Add, Button, wp hp gPrintObj, Submit 7 | Gui, ArrayPrint: Show 8 | Return 9 | 10 | PrintObj: 11 | Gui, Submit, NoHide 12 | Gui, ArrayPrint: Destroy 13 | If IsObject(SubmitObjectName) 14 | Array_Gui(%SubmitObjectName%) 15 | Else 16 | MsgBox % %SubmitObjectName% 17 | Return 18 | } 19 | -------------------------------------------------------------------------------- /lib/list.ahk: -------------------------------------------------------------------------------- 1 | #Include, %A_ScriptDir%\lib\ref\JSON.ahk 2 | #Include, %A_ScriptDir%\lib\ref\JSONcom.ahk 3 | #Include, %A_ScriptDir%\lib\ref\GDIP.ahk 4 | #Include, %A_ScriptDir%\lib\ref\TF.ahk 5 | #Include, %A_ScriptDir%\lib\ref\XGraph.ahk 6 | #Include, %A_ScriptDir%\lib\ref\RadialMenu.ahk 7 | #Include, %A_ScriptDir%\lib\ref\DeepClone.ahk 8 | #Include, %A_ScriptDir%\lib\ref\Decimal2Fraction.ahk 9 | #Include, %A_ScriptDir%\lib\ref\Class_CtlColors.ahk 10 | #Include, %A_ScriptDir%\lib\ref\Hotkey.ahk 11 | #Include, %A_ScriptDir%\lib\ref\CreateScript.ahk 12 | #Include, %A_ScriptDir%\lib\ref\DynaRun.ahk 13 | #Include, %A_ScriptDir%\lib\ref\LutBotLite.ahk 14 | #Include, %A_ScriptDir%\lib\ref\OrderedArray.ahk 15 | #Include, %A_ScriptDir%\lib\ref\OrderedAssociativeArray.ahk 16 | #Include, %A_ScriptDir%\lib\ref\LetUserSelectRect.ahk 17 | #Include, %A_ScriptDir%\lib\ref\XInput.ahk 18 | #Include, %A_ScriptDir%\lib\ref\Notify.ahk 19 | #Include, %A_ScriptDir%\lib\ref\Hotkey.ahk 20 | #Include, %A_ScriptDir%\lib\ref\Load_Bar.ahk 21 | #Include, %A_ScriptDir%\lib\ref\Ping4.ahk 22 | #Include, %A_ScriptDir%\lib\ref\CBMatchingGUI.ahk 23 | #Include, %A_ScriptDir%\lib\ref\FindText.ahk 24 | #Include, %A_ScriptDir%\lib\ref\ColorRange.ahk 25 | #Include, %A_ScriptDir%\lib\ref\DoPoePricesRequest.ahk 26 | #Include, %A_ScriptDir%\lib\ref\FindText.ahk 27 | #Include, %A_ScriptDir%\lib\ref\BigA.ahk 28 | -------------------------------------------------------------------------------- /lib/ref/ColorRange.ahk: -------------------------------------------------------------------------------- 1 |  2 | ColorRange(c1,c2){ ; Create a list of colors between two https://www.autohotkey.com/boards/viewtopic.php?t=29205 3 | Color2 := {RGB:c2 4 | ,R:((c2 >> 16) & 0xFF) 5 | ,G:((c2 >> 8) & 0xFF) 6 | ,B:((c2 >> 0) & 0xFF)} 7 | 8 | Color1 := {RGB:c1 9 | ,R:((c1 >> 16) & 0xFF) 10 | ,G:((c1 >> 8) & 0xFF) 11 | ,B:((c1 >> 0) & 0xFF)} 12 | ColorList := [] 13 | If !IsObject(Color1) || !IsObject(Color2) 14 | MsgBox % "Color objects are not initialized: One-" IsObject(Color1) " - " c1 " Two-" IsObject(Color2) " - " c2 15 | ;----------------------------------- 16 | ; color distance for each color individually 17 | ; this distance may be positive or negative 18 | ;----------------------------------- 19 | Distance_R := Color2.R - Color1.R 20 | Distance_G := Color2.G - Color1.G 21 | Distance_B := Color2.B - Color1.B 22 | 23 | 24 | ;----------------------------------- 25 | ; MCD is maximum color distance 26 | ; MCD deals only with absolute values 27 | ;----------------------------------- 28 | MCD := max(Abs(Distance_R), Abs(Distance_G), Abs(Distance_B)) 29 | 30 | ;----------------------------------- 31 | ; list all gradient colors between Color1 and Color2 32 | ;----------------------------------- 33 | ColorList.Push(Color1.RGB) ; start at Color1 34 | Loop, % MCD - 1 35 | ColorList.Push("0x" . Format("{:02X}", Color1.R + A_Index / MCD * Distance_R) . Format("{:02X}", Color1.G + A_Index / MCD * Distance_G) . Format("{:02X}", Color1.B + A_Index / MCD * Distance_B)) 36 | ColorList.Push(Color2.RGB) ; stop at Color2 37 | Return ColorList 38 | } 39 | -------------------------------------------------------------------------------- /lib/ref/CreateScript.ahk: -------------------------------------------------------------------------------- 1 | CreateScript(script){ 2 | static mScript 3 | StringReplace,script,script,`n,`r`n,A 4 | StringReplace,script,script,`r`r,`r,A 5 | If RegExMatch(script,"m)^[^:]+:[^:]+|[a-zA-Z0-9#_@]+\{}$"){ 6 | If !(mScript){ 7 | If (A_IsCompiled){ 8 | lib := DllCall("GetModuleHandle", "ptr", 0, "ptr") 9 | If !(res := DllCall("FindResource", "ptr", lib, "str", ">AUTOHOTKEY SCRIPT<", "ptr", Type:=10, "ptr")) 10 | If !(res := DllCall("FindResource", "ptr", lib, "str", ">AHK WITH ICON<", "ptr", Type:=10, "ptr")){ 11 | MsgBox Could not extract script! 12 | return 13 | } 14 | DataSize := DllCall("SizeofResource", "ptr", lib, "ptr", res, "uint") 15 | ,hresdata := DllCall("LoadResource", "ptr", lib, "ptr", res, "ptr") 16 | ,pData := DllCall("LockResource", "ptr", hresdata, "ptr") 17 | If (DataSize){ 18 | mScript:=StrGet(pData,"UTF-8") 19 | StringReplace,mScript,mScript,`n,`r`n,A 20 | StringReplace,mScript,mScript,`r,`r`n,A 21 | StringReplace,mScript,mScript,`r`r,`r,A 22 | StringReplace,mScript,mScript,`n`n,`n,A 23 | mScript :="`r`n" mScript "`r`n" 24 | } 25 | } else { 26 | FileRead,mScript,%A_ScriptFullPath% 27 | StringReplace,mScript,mScript,`n,`r`n,A 28 | StringReplace,mScript,mScript,`r`r,`r,A 29 | mScript := "`r`n" mScript "`r`n" 30 | Loop,Parse,mScript,`n,`r 31 | { 32 | If A_Index=1 33 | mScript:="" 34 | If RegExMatch(A_LoopField,"i)^\s*#include"){ 35 | temp:=RegExReplace(A_LoopField,"i)^\s*#include[\s+|,]") 36 | If InStr(temp,"%"){ 37 | Loop,Parse,temp,`% 38 | { 39 | If (A_Index=1) 40 | temp:=A_LoopField 41 | else if !Mod(A_Index,2) 42 | _temp:=A_LoopField 43 | else { 44 | _temp:=%_temp% 45 | temp.=_temp A_LoopField 46 | _temp:="" 47 | } 48 | } 49 | } 50 | If InStr(FileExist(trim(temp,"<>")),"D"){ 51 | SetWorkingDir % trim(temp,"<>") 52 | continue 53 | } else if InStr(FileExist(temp),"D"){ 54 | SetWorkingDir % temp 55 | continue 56 | } else If (SubStr(temp,1,1) . SubStr(temp,0) = "<>"){ 57 | If !FileExist(_temp:=A_ScriptDir "\lib\" trim(temp,"<>") ".ahk") 58 | If !FileExist(_temp:=A_MyDocuments "\AutoHotkey\lib\" trim(temp,"<>") ".ahk") 59 | If !FileExist(_temp:=SubStr(A_AhkPath,1,InStr(A_AhkPath,"\",1,0)) "lib\" trim(temp,"<>") ".ahk") 60 | If FileExist(_temp:=SubStr(A_AhkPath,1,InStr(A_AhkPath,"\",1,0)) "lib.lnk"){ 61 | FileGetShortcut,_temp,_temp 62 | _temp:=_temp "\" trim(temp,"<>") ".ahk" 63 | } 64 | FileRead,_temp,%_temp% 65 | mScript.= _temp "`r`n" 66 | } else { 67 | FileRead,_temp,%temp% 68 | mScript.= _temp "`r`n" 69 | } 70 | } else mScript.=A_LoopField "`r`n" 71 | } 72 | } 73 | } 74 | Loop,Parse,script,`n,`r 75 | { 76 | If A_Index=1 77 | script= 78 | else If A_LoopField= 79 | Continue 80 | If (RegExMatch(A_LoopField,"^[^:\s]+:[^:\s=]+$")){ 81 | StringSplit,label,A_LoopField,: 82 | If (label0=2 and IsLabel(label1) and IsLabel(label2)){ 83 | script .=SubStr(mScript 84 | , h:=InStr(mScript,"`r`n" label1 ":`r`n") 85 | , InStr(mScript,"`r`n" label2 ":`r`n")-h) . "`r`n" 86 | } 87 | } else if RegExMatch(A_LoopField,"^[^\{}\s]+\{}$"){ 88 | StringTrimRight,label,A_LoopField,2 89 | script .= SubStr(mScript 90 | , h:=RegExMatch(mScript,"i)\n" label "\([^\)\n]*\)\n?\s*\{") 91 | , RegExMatch(mScript "`r`n","\n\s*}\s*\K\n",1,h)-h) . "`r`n" 92 | } else 93 | script .= A_LoopField "`r`n" 94 | } 95 | } 96 | StringReplace,script,script,`r`n,`n,All 97 | Return Script 98 | } 99 | -------------------------------------------------------------------------------- /lib/ref/DeepClone.ahk: -------------------------------------------------------------------------------- 1 | /* DeepClone v1 : A library of functions to make unlinked array Clone 2 | ; 3 | ; Function: 4 | ; Array_Print 5 | ; Description: 6 | ; Quick and dirty text visualization of an array 7 | ; Syntax: 8 | ; Arrary_Print(Array) 9 | ; Parameters: 10 | ; Param1 - Array 11 | ; An array, associative array, or object. 12 | ; Return Value: 13 | ; A text visualization of the input array 14 | ; Remarks: 15 | ; Supports sub-arrays 16 | ; Related: 17 | ; Array_Gui, Array_DeepClone, Array_IsCircle 18 | ; Example: 19 | ; MsgBox, % Array_Print({"A":["Aardvark", "Antelope"], "B":"Bananas"}) 20 | ; 21 | ; 22 | ; Function: 23 | ; Array_Gui 24 | ; Description: 25 | ; Displays an array as a treeview in a GUI 26 | ; Syntax: 27 | ; Array_Gui(Array) 28 | ; Parameters: 29 | ; Param1 - Array 30 | ; An array, associative array, or object. 31 | ; Return Value: 32 | ; Null 33 | ; Remarks: 34 | ; Resizeable 35 | ; Related: 36 | ; Array_Print, Array_DeepClone, Array_IsCircle 37 | ; Example: 38 | ; Array_Gui({"GeekDude":["Smart", "Charming", "Interesting"], "tidbit":"Weird"}) 39 | ; 40 | ; 41 | ; Function: 42 | ; Array_DeepClone 43 | ; Description: 44 | ; Deep clone 45 | ; Syntax: 46 | ; Arrary_DeepClone(Array) 47 | ; Parameters: 48 | ; Param1 - Array 49 | ; An array, associative array, or object. 50 | ; Return Value: 51 | ; A copy of the array, that is not linked to the original 52 | ; Remarks: 53 | ; Supports sub-arrays, and circular refrences 54 | ; Related: 55 | ; Array_Gui, Array_Print, Array_IsCircle 56 | ; Example: 57 | ; Array1 := {"A":["Aardvark", "Antelope"], "B":"Bananas"} 58 | ; Array2 := Array_DeepClone(Array1) 59 | ; 60 | ; 61 | ; Function: 62 | ; Array_IsCircle 63 | ; Description: 64 | ; Checks for circular refrences that could crash my other functions 65 | ; Syntax: 66 | ; Arrary_IsCircle(Array) 67 | ; Parameters: 68 | ; Param1 - Array 69 | ; An array, associative array, or object. 70 | ; Return Value: 71 | ; Boolean value according to whether it has a circular refrence 72 | ; Remarks: 73 | ; Takes an average of 0.023 seconds 74 | ; Related: 75 | ; Array_Gui, Array_Print(), Array_DeepClone() 76 | ; Example: 77 | ; Array1 := {"A":["Aardvark", "Antelope"], "B":"Bananas"} 78 | ; Array2 := Array_Copy(Array1) 79 | ; 80 | */ 81 | 82 | Array_Print(Array) { 83 | if Array_IsCircle(Array) 84 | return "Error: Circular refrence" 85 | For Key, Value in Array 86 | { 87 | If Key is not Number 88 | Output .= """" . Key . """:" 89 | Else 90 | Output .= Key . ":" 91 | 92 | If (IsObject(Value)) 93 | Output .= "[" . Array_Print(Value) . "]" 94 | Else If Value is not number 95 | Output .= """" . Value . """" 96 | Else 97 | Output .= Value 98 | 99 | Output .= ", " 100 | } 101 | StringTrimRight, OutPut, OutPut, 2 102 | Return OutPut 103 | } 104 | 105 | Array_Gui(Array, Parent="") { 106 | static 107 | global GuiArrayTree, GuiArrayTreeX, GuiArrayTreeY 108 | if Array_IsCircle(Array) 109 | { 110 | MsgBox, 16, GuiArray, Error: Circular refrence 111 | return "Error: Circular refrence" 112 | } 113 | if !Parent 114 | { 115 | Gui, +HwndDefault 116 | Gui, GuiArray:New, +HwndGuiArray +LabelGuiArray +Resize 117 | Gui, Add, TreeView, vGuiArrayTree 118 | 119 | Parent := "P1" 120 | %Parent% := TV_Add("Array", 0, "+Expand") 121 | Array_Gui(Array, Parent) 122 | GuiControlGet, GuiArrayTree, Pos 123 | Gui, Show,, GuiArray 124 | Gui, %Default%:Default 125 | 126 | WinWaitActive, ahk_id%GuiArray% 127 | WinWaitClose, ahk_id%GuiArray% 128 | return 129 | } 130 | For Key, Value in Array 131 | { 132 | %Parent%C%A_Index% := TV_Add(Key, %Parent%) 133 | KeyParent := Parent "C" A_Index 134 | if (IsObject(Value)) 135 | Array_Gui(Value, KeyParent) 136 | else 137 | %KeyParent%C1 := TV_Add(Value, %KeyParent%) 138 | } 139 | return 140 | 141 | GuiArrayClose: 142 | Gui, Destroy 143 | return 144 | 145 | GuiArraySize: 146 | if !(A_GuiWidth || A_GuiHeight) ; Minimized 147 | return 148 | GuiControl, Move, GuiArrayTree, % "w" A_GuiWidth - (GuiArrayTreeX* 2) " h" A_GuiHeight - (GuiArrayTreeY* 2) 149 | return 150 | } 151 | 152 | Array_DeepClone(Array, Objs=0) 153 | { 154 | if !Objs 155 | Objs := {} 156 | Obj := Array.Clone() 157 | Objs[&Array] := Obj ; Save this new array 158 | For Key, Val in Obj 159 | if (IsObject(Val)) ; If it is a subarray 160 | Obj[Key] := Objs[&Val] ; If we already know of a refrence to this array 161 | ? Objs[&Val] ; Then point it to the new array 162 | : Array_DeepClone(Val,Objs) ; Otherwise, clone this sub-array 163 | return Obj 164 | } 165 | 166 | Array_IsCircle(Obj, Objs=0) 167 | { 168 | if !Objs 169 | Objs := {} 170 | For Key, Val in Obj 171 | if (IsObject(Val)&&(Objs[&Val]||Array_IsCircle(Val,(Objs,Objs[&Val]:=1)))) 172 | return 1 173 | return 0 174 | } 175 | 176 | Array_IsLinear(arr, i=0) { 177 | For k, v in arr { 178 | If (++i != k) 179 | Return 0 180 | } 181 | Return 1 182 | } 183 | 184 | -------------------------------------------------------------------------------- /lib/ref/DynaRun.ahk: -------------------------------------------------------------------------------- 1 | DynaRun(script, name:="", args*) { ;// http://goo.gl/ECC6Qw 2 | if (name == "") 3 | name := "AHK_" . A_TickCount 4 | ;// Create named pipe(s), first one is a dummy 5 | for each, pipe in ["__PIPE_GA_", "__PIPE_"] 6 | %pipe% := DllCall( 7 | (Join Q C 8 | "CreateNamedPipe", ;// http://goo.gl/3aJQg7 9 | "Str", "\\.\pipe\" . name, ;// lpName 10 | "UInt", 2, ;// dwOpenMode = PIPE_ACCESS_OUTBOUND 11 | "UInt", 0, ;// dwPipeMode = PIPE_TYPE_BYTE 12 | "UInt", 255, ;// nMaxInstances 13 | "UInt", 0, ;// nOutBufferSize 14 | "UInt", 0, ;// nInBufferSize 15 | "Ptr", 0, ;// nDefaultTimeOut 16 | "Ptr", 0 ;// lpSecurityAttributes 17 | )) 18 | 19 | if (__PIPE_ == -1 || __PIPE_GA_ == -1) 20 | return false 21 | 22 | q := Chr(34) ;// for v1.1 and v2.0-a compatibility 23 | for each, arg in args 24 | args .= " " . q . arg . q 25 | Run "%A_AhkPath%" "\\.\pipe\%name%" %args%,, UseErrorLevel Hide, PID 26 | if ErrorLevel 27 | MsgBox, 262144, ERROR, Could not open file:`n%A_AhkPath%\\.\pipe\%name% 28 | 29 | DllCall("ConnectNamedPipe", "Ptr", __PIPE_GA_, "Ptr", 0) ;// http://goo.gl/pwTnxj 30 | DllCall("CloseHandle", "Ptr", __PIPE_GA_) 31 | DllCall("ConnectNamedPipe", "Ptr", __PIPE_, "Ptr", 0) 32 | 33 | script := (A_IsUnicode ? Chr(0xfeff) : (Chr(239) . Chr(187) . Chr(191))) . script 34 | if !DllCall( 35 | (Join Q C 36 | "WriteFile", ;// http://goo.gl/fdyWm0 37 | "Ptr", __PIPE_, ;// hFile 38 | "Str", script, ;// lpBuffer 39 | "UInt", (StrLen(script)+1)*(A_IsUnicode+1), ;// nNumberOfBytesToWrite 40 | "UInt*", 0, ;// lpNumberOfBytesWritten 41 | "Ptr", 0 ;// lpOverlapped 42 | )) 43 | return A_LastError 44 | /* FileOpen() version 45 | if !(f := FileOpen(__PIPE_, "h", A_IsUnicode ? "UTF-8" : "")) 46 | return A_LastError 47 | f.Write(script), f.Close() ;// .Close() -> Redundant, no effect 48 | */ 49 | DllCall("CloseHandle", "Ptr", __PIPE_) 50 | 51 | return PID 52 | } 53 | -------------------------------------------------------------------------------- /lib/ref/LetUserSelectRect.ahk: -------------------------------------------------------------------------------- 1 | ; Rectangular selection function written by Lexikos 2 | LetUserSelectRect(PixelToo:=0) 3 | { 4 | Global Picker 5 | Hotkey Ifwinactive 6 | static r := 1 7 | ; Create the "selection rectangle" GUIs (one for each edge). 8 | Loop 4 { 9 | Gui, Rect%A_Index%: -Caption +ToolWindow +AlwaysOnTop 10 | Gui, Rect%A_Index%: Color, Red 11 | } 12 | PauseTooltips := 1 13 | If (GamePID) 14 | { 15 | Gui, Submit 16 | WinActivate, %GameStr% 17 | } 18 | If PixelToo 19 | Ding(0,-11,"Click and hold left mouse to draw box`nUse arrow keys to move mouse,and mousewheel to zoom`nPress Ctrl to Clipboard the color and X,Y") 20 | Else 21 | Ding(0,-11,"Click and hold left mouse to begin`nUse arrow keys to move mouse,and mousewheel to zoom") 22 | ; Wait for release of LButton 23 | KeyWait, LButton 24 | ; Wait for release of Ctrl 25 | If PixelToo 26 | KeyWait, Ctrl 27 | ; Disable LButton. 28 | Hotkey, *LButton, lusr_return, On 29 | DrawZoom("Toggle") 30 | Loop 31 | { 32 | ; Get initial coordinates. 33 | MouseGetPos, xorigin, yorigin 34 | PixelGetColor, col, %xorigin%, %yorigin%, RGB 35 | Picker.SetColor(col) 36 | ToolTip, % (PixelToo?" " col " @ ":" ") xorigin "," yorigin 37 | DrawZoom("Repaint") 38 | DrawZoom("MoveAway") 39 | If (GetKeyState("Ctrl", "P") && PixelToo) 40 | { 41 | Hotkey, *LButton, Off 42 | Tooltip 43 | Ding(1,-11,"") 44 | PauseTooltips := 0 45 | Clipboard := col " @ " xorigin "," yorigin 46 | Notify(Clipboard,"Copied to the clipboard",5) 47 | DrawZoom("Toggle") 48 | Return False 49 | } 50 | } Until GetKeyState("LButton", "P") 51 | Tooltip 52 | Ding(0,-11,"Drag the mouse then release to select the area") 53 | ; Set timer for updating the selection rectangle. 54 | SetTimer, lusr_update, 10 55 | ; Wait for user to release LButton. 56 | KeyWait, LButton 57 | ; Re-enable LButton. 58 | Hotkey, *LButton, Off 59 | ; Disable timer. 60 | SetTimer, lusr_update, Off 61 | ; Destroy "selection rectangle" GUIs. 62 | Loop 4 63 | Gui, Rect%A_Index%: Destroy 64 | PauseTooltips := 0 65 | Ding(1,-11,"") 66 | DrawZoom("Toggle") 67 | Gui, Show 68 | return { "X1":X1,"Y1":Y1,"X2":X2,"Y2":Y2 } 69 | 70 | lusr_update: 71 | MouseGetPos, x, y 72 | if (x = xlast && y = ylast) 73 | ; Mouse hasn't moved so there's nothing to do. 74 | return 75 | if (x < xorigin) 76 | x1 := x, x2 := xorigin 77 | else x2 := x, x1 := xorigin 78 | if (y < yorigin) 79 | y1 := y, y2 := yorigin 80 | else y2 := y, y1 := yorigin 81 | ; Update the "selection rectangle". 82 | Gui, Rect1:Show, % "NA X" x1 " Y" y1 " W" x2-x1 " H" (r?r:1) 83 | Gui, Rect2:Show, % "NA X" x1 " Y" y2-r " W" x2-x1 " H" (r?r:1) 84 | Gui, Rect3:Show, % "NA X" x1 " Y" y1 " W" (r?r:1) " H" y2-y1 85 | Gui, Rect4:Show, % "NA X" x2-r " Y" y1 " W" (r?r:1) " H" y2-y1 86 | lusr_return: 87 | return 88 | } 89 | 90 | LetUserSelectPixel(){ 91 | Hotkey Ifwinactive 92 | ; Create the "selection rectangle" GUIs (one for each edge). 93 | PauseTooltips := 1 94 | If (GamePID) 95 | { 96 | Gui, Submit 97 | WinActivate, %GameStr% 98 | } 99 | Ding(0,-11,"Click or Press CTRL to select a location") 100 | ; Wait for release of LButton 101 | KeyWait, LButton 102 | ; Wait for release of Ctrl 103 | KeyWait, Ctrl 104 | ; Disable LButton. 105 | Hotkey, *LButton, lusr_return, On 106 | DrawZoom("Toggle") 107 | Loop 108 | { 109 | ; Get initial coordinates. 110 | MouseGetPos, xorigin, yorigin 111 | PixelGetColor, col, %xorigin%, %yorigin%, RGB 112 | ToolTip, % " " col " @ " xorigin "," yorigin 113 | DrawZoom("Repaint") 114 | DrawZoom("MoveAway") 115 | } Until (GetKeyState("LButton", "P") || GetKeyState("Ctrl", "P")) 116 | Tooltip 117 | ; Re-enable LButton. 118 | Hotkey, *LButton, Off 119 | PauseTooltips := 0 120 | Ding(1,-11,"") 121 | DrawZoom("Toggle") 122 | Gui, Show 123 | return { "X":xorigin,"Y":yorigin,"Color":col } 124 | } 125 | -------------------------------------------------------------------------------- /lib/ref/Load_Bar.ahk: -------------------------------------------------------------------------------- 1 |  2 | ; Load_Bar - Cool Gradient progress bar class by joedf (using CreateDIB by SKAN) 3 | class LoaderBar { 4 | __New(GUI_ID:="Default",x:=0,y:=0,w:=280,h:=28,ShowDesc:=0,FontColorDesc:="2B2B2B",FontColor:="EFEFEF",BG:="2B2B2B|2F2F2F|323232",FG:="66A3E2|4B79AF|385D87") { 5 | SetWinDelay,0 6 | SetBatchLines,-1 7 | if (StrLen(A_Gui)) 8 | _GUI_ID:=A_Gui 9 | else 10 | _GUI_ID:=1 11 | if ( (GUI_ID="Default") || !StrLen(GUI_ID) || GUI_ID==0 ) 12 | GUI_ID:=_GUI_ID 13 | this.GUI_ID := GUI_ID 14 | Gui, %GUI_ID%:Default 15 | this.BG := StrSplit(BG,"|") 16 | this.BG.W := w 17 | this.BG.H := h 18 | this.Width:=w 19 | this.Height:=h 20 | this.FG := StrSplit(FG,"|") 21 | this.FG.W := this.BG.W - 2 22 | this.FG.H := (fg_h:=(this.BG.H - 2)) 23 | this.Percent := 0 24 | this.X := x 25 | this.Y := y 26 | fg_x:= this.X + 1 27 | fg_y:= this.Y + 1 28 | this.FontColor := FontColor 29 | this.ShowDesc := ShowDesc 30 | 31 | ;DescBGColor:="4D4D4D" 32 | DescBGColor:="Black" 33 | this.DescBGColor := DescBGColor 34 | 35 | this.FontColorDesc := FontColorDesc 36 | 37 | Gui,Font,s8 38 | 39 | Gui, Add, Text, x%x% y%y% w%w% h%h% 0xE hwndhLoaderBarBG 40 | this.ApplyGradient(this.hLoaderBarBG := hLoaderBarBG,this.BG.1,this.BG.2,this.BG.3,1) 41 | 42 | Gui, Add, Text, x%fg_x% y%fg_y% w0 h%fg_h% 0xE hwndhLoaderBarFG 43 | this.ApplyGradient(this.hLoaderBarFG := hLoaderBarFG,this.FG.1,this.FG.2,this.FG.3,1) 44 | 45 | Gui, Add, Text, x%x% y%y% w%w% h%h% 0x200 border center BackgroundTrans hwndhLoaderNumber c%FontColor%, % "[ 0 % ]" 46 | this.hLoaderNumber := hLoaderNumber 47 | 48 | if (this.ShowDesc) { 49 | ;Gui, Add, Text, xp y+2 w%w% h16 0x200 border Background%DescBGColor% hwndhLoaderDesc, Loading... 50 | Gui, Add, Text, xp y+2 w%w% h16 0x200 border BackgroundTrans hwndhLoaderDesc c%FontColorDesc%, Loading... 51 | this.hLoaderDesc := hLoaderDesc 52 | this.Height:=h+18 53 | } 54 | 55 | Gui,Font 56 | 57 | Gui, %_GUI_ID%:Default 58 | } 59 | 60 | Set(p,w:="Loading...") { 61 | if (StrLen(A_Gui)) 62 | _GUI_ID:=A_Gui 63 | else 64 | _GUI_ID:=1 65 | GUI_ID := this.GUI_ID 66 | Gui, %GUI_ID%:Default 67 | GuiControlGet, LoaderBarBG, Pos, % this.hLoaderBarBG 68 | this.BG.W := LoaderBarBGW 69 | this.FG.W := LoaderBarBGW - 2 70 | this.Percent:=(p>=100) ? p:=100 : p 71 | PercentNum:=Round(this.Percent,0) 72 | PercentBar:=floor((this.Percent/100)*(this.FG.W)) 73 | 74 | hLoaderBarFG := this.hLoaderBarFG 75 | hLoaderNumber := this.hLoaderNumber 76 | 77 | GuiControl,Move,%hLoaderBarFG%,w%PercentBar% 78 | GuiControl,,%hLoaderNumber%,[ %PercentNum% `% ] 79 | 80 | if (this.ShowDesc) { 81 | hLoaderDesc := this.hLoaderDesc 82 | GuiControl,,%hLoaderDesc%, %w% 83 | } 84 | Gui, %_GUI_ID%:Default 85 | } 86 | 87 | ApplyGradient( Hwnd, LT := "101010", MB := "0000AA", RB := "00FF00", Vertical := 1 ) { 88 | Static STM_SETIMAGE := 0x172 89 | ControlGetPos,,, W, H,, ahk_id %Hwnd% 90 | W:=Scale_PositionFromDPI(W), H:=Scale_PositionFromDPI(H) 91 | PixelData := Vertical ? LT "|" LT "|" LT "|" MB "|" MB "|" MB "|" RB "|" RB "|" RB : LT "|" MB "|" RB "|" LT "|" MB "|" RB "|" LT "|" MB "|" RB 92 | hBitmap := this.CreateDIB( PixelData, 3, 3, W, H, True ) 93 | oBitmap := DllCall( "SendMessage", "Ptr",Hwnd, "UInt",STM_SETIMAGE, "Ptr",0, "Ptr",hBitmap ) 94 | Return hBitmap, DllCall( "DeleteObject", "Ptr",oBitmap ) 95 | } 96 | 97 | CreateDIB( PixelData, W, H, ResizeW := 0, ResizeH := 0, Gradient := 1 ) { 98 | ; http://ahkscript.org/boards/viewtopic.php?t=3203 SKAN, CD: 01-Apr-2014 MD: 05-May-2014 99 | Static LR_Flag1 := 0x2008 ; LR_CREATEDIBSECTION := 0x2000 | LR_COPYDELETEORG := 8 100 | , LR_Flag2 := 0x200C ; LR_CREATEDIBSECTION := 0x2000 | LR_COPYDELETEORG := 8 | LR_COPYRETURNORG := 4 101 | , LR_Flag3 := 0x0008 ; LR_COPYDELETEORG := 8 102 | WB := Ceil( ( W * 3 ) / 2 ) * 2, VarSetCapacity( BMBITS, WB * H + 1, 0 ), P := &BMBITS 103 | Loop, Parse, PixelData, | 104 | P := Numput( "0x" A_LoopField, P+0, 0, "UInt" ) - ( W & 1 and Mod( A_Index * 3, W * 3 ) = 0 ? 0 : 1 ) 105 | hBM := DllCall( "CreateBitmap", "Int",W, "Int",H, "UInt",1, "UInt",24, "Ptr",0, "Ptr" ) 106 | hBM := DllCall( "CopyImage", "Ptr",hBM, "UInt",0, "Int",0, "Int",0, "UInt",LR_Flag1, "Ptr" ) 107 | DllCall( "SetBitmapBits", "Ptr",hBM, "UInt",WB * H, "Ptr",&BMBITS ) 108 | If not ( Gradient + 0 ) 109 | hBM := DllCall( "CopyImage", "Ptr",hBM, "UInt",0, "Int",0, "Int",0, "UInt",LR_Flag3, "Ptr" ) 110 | Return DllCall( "CopyImage", "Ptr",hBM, "Int",0, "Int",ResizeW, "Int",ResizeH, "Int",LR_Flag2, "UPtr" ) 111 | } 112 | } 113 | ; Function wrapper for the Load_bar class by Bandit 114 | Load_BarControl(Percent:=0,uText:="Loading...",ShowGui:=0) 115 | { 116 | Global 117 | Static LoadBar_Initialized := 0 118 | If (!LoadBar_Initialized) 119 | { 120 | LoadBar_Initialized := 1 121 | LastDisplay_LB := 0 122 | Gui, load_BarGUI: New 123 | Gui, load_BarGUI:-Border -Caption +ToolWindow +AlwaysOnTop 124 | Gui, load_BarGUI:Color, 0x4D4D4D, 0xFFFFFF 125 | load_Bar := new LoaderBar("load_BarGUI",3,3,280,28,1,"EFEFEF") 126 | LB_wW:=load_Bar.Width + 2*load_Bar.X 127 | LB_wH:=load_Bar.Height + 2*load_Bar.Y 128 | } 129 | If (ShowGui) 130 | { 131 | Gui, load_BarGUI:Show, % "NA w" LB_wW " h" LB_wH " x10 y" Round(A_ScreenHeight * .5) ,Load Bar 132 | } 133 | 134 | load_Bar.Set(Percent,uText) 135 | If (ShowGui < 0) 136 | SetTimer, Load_BarControl_Hide, -1000 137 | Return 138 | 139 | Load_BarControl_Hide: 140 | Gui, load_BarGUI: Hide 141 | Return 142 | } 143 | -------------------------------------------------------------------------------- /lib/ref/LutBotLite.ahk: -------------------------------------------------------------------------------- 1 | /*** Lib from LutBot : Extracted from lite version 2 | * Lib: LutBotLite.ahk 3 | * Path of Exile Quick disconnect. 4 | */ 5 | 6 | ; Main function of the LutBot logout method 7 | logout(executable){ 8 | ; global GetTable, SetEntry, EnumProcesses, OpenProcessToken, LookupPrivilegeValue, AdjustTokenPrivileges, loadedPsapi 9 | 10 | ; Setup for LutBot logout method 11 | ; Static full_command_line := DllCall("GetCommandLine", "str") 12 | Static GetTable := DllCall("GetProcAddress", Ptr, DllCall("LoadLibrary", Str, "Iphlpapi.dll", "Ptr"), Astr, "GetExtendedTcpTable", "Ptr") 13 | Static SetEntry := DllCall("GetProcAddress", Ptr, DllCall("LoadLibrary", Str, "Iphlpapi.dll", "Ptr"), Astr, "SetTcpEntry", "Ptr") 14 | Static EnumProcesses := DllCall("GetProcAddress", Ptr, DllCall("LoadLibrary", Str, "Psapi.dll", "Ptr"), Astr, "EnumProcesses", "Ptr") 15 | ; Static preloadPsapi := DllCall("LoadLibrary", "Str", "Psapi.dll", "Ptr") 16 | Static OpenProcessToken := DllCall("GetProcAddress", Ptr, DllCall("LoadLibrary", Str, "Advapi32.dll", "Ptr"), Astr, "OpenProcessToken", "Ptr") 17 | Static LookupPrivilegeValue := DllCall("GetProcAddress", Ptr, DllCall("LoadLibrary", Str, "Advapi32.dll", "Ptr"), Astr, "LookupPrivilegeValue", "Ptr") 18 | Static AdjustTokenPrivileges := DllCall("GetProcAddress", Ptr, DllCall("LoadLibrary", Str, "Advapi32.dll", "Ptr"), Astr, "AdjustTokenPrivileges", "Ptr") 19 | 20 | Thread, NoTimers, true ;Critical 21 | start := A_TickCount 22 | 23 | poePID := Object() 24 | s := 4096 25 | Process, Exist 26 | h := DllCall("OpenProcess", "UInt", 0x0400, "Int", false, "UInt", ErrorLevel, "Ptr") 27 | 28 | DllCall(OpenProcessToken, "Ptr", h, "UInt", 32, "PtrP", t) 29 | VarSetCapacity(ti, 16, 0) 30 | NumPut(1, ti, 0, "UInt") 31 | 32 | DllCall(LookupPrivilegeValue, "Ptr", 0, "Str", "SeDebugPrivilege", "Int64P", luid) 33 | NumPut(luid, ti, 4, "Int64") 34 | NumPut(2, ti, 12, "UInt") 35 | 36 | r := DllCall(AdjustTokenPrivileges, "Ptr", t, "Int", false, "Ptr", &ti, "UInt", 0, "Ptr", 0, "Ptr", 0) 37 | DllCall("CloseHandle", "Ptr", t) 38 | DllCall("CloseHandle", "Ptr", h) 39 | 40 | try { 41 | s := VarSetCapacity(a, s) 42 | c := 0 43 | DllCall(EnumProcesses, "Ptr", &a, "UInt", s, "UIntP", r) 44 | Loop, % r // 4 45 | { 46 | id := NumGet(a, A_Index* 4, "UInt") 47 | 48 | h := DllCall("OpenProcess", "UInt", 0x0010 | 0x0400, "Int", false, "UInt", id, "Ptr") 49 | 50 | if !h 51 | continue 52 | VarSetCapacity(n, s, 0) 53 | e := DllCall("Psapi\GetModuleBaseName", "Ptr", h, "Ptr", 0, "Str", n, "UInt", A_IsUnicode ? s//2 : s) 54 | if !e 55 | if e := DllCall("Psapi\GetProcessImageFileName", "Ptr", h, "Str", n, "UInt", A_IsUnicode ? s//2 : s) 56 | SplitPath n, n 57 | DllCall("CloseHandle", "Ptr", h) 58 | if (n && e) 59 | if (n == executable) { 60 | poePID.Insert(id) 61 | } 62 | } 63 | 64 | l := poePID.Length() 65 | if ( l = 0 ) { 66 | Process, wait, %executable%, 0.2 67 | if ( ErrorLevel > 0 ) { 68 | poePID.Insert(ErrorLevel) 69 | } 70 | } 71 | 72 | VarSetCapacity(dwSize, 4, 0) 73 | result := DllCall(GetTable, UInt, &TcpTable, UInt, &dwSize, UInt, 0, UInt, 2, UInt, 5, UInt, 0) 74 | VarSetCapacity(TcpTable, NumGet(dwSize), 0) 75 | 76 | result := DllCall(GetTable, UInt, &TcpTable, UInt, &dwSize, UInt, 0, UInt, 2, UInt, 5, UInt, 0) 77 | 78 | tcpNum := NumGet(&TcpTable,0,"UInt") 79 | 80 | IfEqual, tcpNum, 0 81 | { 82 | Log("Logout","ED11",tcpNum,l,executable) 83 | return False 84 | } 85 | 86 | out := 0 87 | Loop %tcpNum% 88 | { 89 | cutby := a_index - 1 90 | cutby*= 24 91 | ownerPID := NumGet(&TcpTable,cutby+24,"UInt") 92 | for index, element in poePID { 93 | if ( ownerPID = element ) 94 | { 95 | VarSetCapacity(newEntry, 20, 0) 96 | NumPut(12,&newEntry,0,"UInt") 97 | NumPut(NumGet(&TcpTable,cutby+8,"UInt"),&newEntry,4,"UInt") 98 | NumPut(NumGet(&TcpTable,cutby+12,"UInt"),&newEntry,8,"UInt") 99 | NumPut(NumGet(&TcpTable,cutby+16,"UInt"),&newEntry,12,"UInt") 100 | NumPut(NumGet(&TcpTable,cutby+20,"UInt"),&newEntry,16,"UInt") 101 | result := DllCall(SetEntry, UInt, &newEntry) 102 | IfNotEqual, result, 0 103 | { 104 | Log("Logout","TCP" . result,out,result,l,executable) 105 | return False 106 | } 107 | out++ 108 | } 109 | } 110 | } 111 | if ( out = 0 ) { 112 | Log("Logout","ED10",out,l,executable) 113 | return False 114 | } else { 115 | Log("Logout",l . ":" . A_TickCount - start,out,l,executable) 116 | } 117 | } catch e { 118 | Log("Logout","ED14","catcherror",ErrorText(e)) 119 | return False 120 | } 121 | 122 | return True 123 | } 124 | 125 | 126 | ; checkActiveType - Check for active executable 127 | checkActiveType() 128 | { 129 | global Active_executable, GameStr 130 | Process, Exist, %Active_executable% 131 | if !ErrorLevel 132 | { 133 | WinGet, id, list,ahk_group POEGameGroup,, Program Manager 134 | Loop, %id% 135 | { 136 | this_id := id%A_Index% 137 | WinGet, this_name, ProcessName, ahk_id %this_id% 138 | Active_executable := this_name 139 | GameStr := "ahk_exe " Active_executable 140 | Return True 141 | } 142 | Return False 143 | } 144 | Else 145 | Return True 146 | } 147 | -------------------------------------------------------------------------------- /lib/ref/OrderedArray.ahk: -------------------------------------------------------------------------------- 1 | /* OrderedArray code by Lexikos 2 | * Modifications and additional methods by rbrtryn 3 | * http://tinyurl.com/lhtvalv 4 | */ 5 | OrderedArray(prm*) 6 | { 7 | ; Define prototype object for ordered arrays: 8 | static base := Object("__Set", "oaSet", "_NewEnum", "oaNewEnum" 9 | , "Remove", "oaRemove", "Insert", "oaInsert", "InsertBefore", "oaInsertBefore") 10 | ; Create and return new ordered array object: 11 | return Object("_keys", Object(), "base", base, prm*) 12 | } 13 | 14 | oaSet(obj, prm*) 15 | { 16 | ; If this function is called, the key must not already exist. 17 | ; Sub-class array if necessary then add this new key to the key list 18 | if prm.maxindex() > 2 19 | ObjInsert(obj, prm[1], OrderedArray()) 20 | ObjInsert(obj._keys, prm[1]) 21 | ; Since we don't return a value, the default behaviour takes effect. 22 | ; That is, a new key-value pair is created and stored in the object. 23 | } 24 | 25 | oaNewEnum(obj) 26 | { 27 | ; Define prototype object for custom enumerator: 28 | static base := Object("Next", "oaEnumNext") 29 | ; Return an enumerator wrapping our _keys array's enumerator: 30 | return Object("obj", obj, "enum", obj._keys._NewEnum(), "base", base) 31 | } 32 | 33 | oaEnumNext(e, ByRef k, ByRef v="") 34 | { 35 | ; If Enum.Next() returns a "true" value, it has stored a key and 36 | ; value in the provided variables. In this case, "i" receives the 37 | ; current index in the _keys array and "k" receives the value at 38 | ; that index, which is a key in the original object: 39 | if r := e.enum.Next(i,k) 40 | ; We want it to appear as though the user is simply enumerating 41 | ; the key-value pairs of the original object, so store the value 42 | ; associated with this key in the second output variable: 43 | v := e.obj[k] 44 | return r 45 | } 46 | 47 | oaRemove(obj, prm*) 48 | { 49 | r := ObjRemove(obj, prm*) ; Remove keys from main object 50 | Removed := [] 51 | for k, v in obj._keys ; Get each index key pair 52 | if not ObjHasKey(obj, v) ; if key is not in main object 53 | Removed.Insert(k) ; Store that keys index to be removed later 54 | for k, v in Removed ; For each key to be removed 55 | ObjRemove(obj._keys, v, "") ; remove that key from key list 56 | return r 57 | } 58 | 59 | oaInsert(obj, prm*) 60 | { 61 | r := ObjInsert(obj, prm*) ; Insert keys into main object 62 | enum := ObjNewEnum(obj) ; Can't use for-loop because it would invoke oaNewEnum 63 | while enum[k] { ; For each key in main object 64 | if (k = "_keys") 65 | continue 66 | for i, kv in obj._keys ; Search for key in obj._keys 67 | if (k = kv) ; If found... 68 | continue 2 ; Get next key in main object 69 | ObjInsert(obj._keys, k) ; Else insert key into obj._keys 70 | } 71 | return r 72 | } 73 | 74 | oaInsertBefore(obj, key, prm*) 75 | { 76 | OldKeys := obj._keys ; Save key list 77 | obj._keys := [] ; Clear key list 78 | for idx, k in OldKeys { ; Put the keys before key 79 | if (k = key) ; back into key list 80 | break 81 | obj._keys.Insert(k) 82 | } 83 | 84 | r := ObjInsert(obj, prm*) ; Insert keys into main object 85 | enum := ObjNewEnum(obj) ; Can't use for-loop because it would invoke oaNewEnum 86 | while enum[k] { ; For each key in main object 87 | if (k = "_keys") 88 | continue 89 | for i, kv in OldKeys ; Search for key in OldKeys 90 | if (k = kv) ; If found... 91 | continue 2 ; Get next key in main object 92 | ObjInsert(obj._keys, k) ; Else insert key into obj._keys 93 | } 94 | 95 | for i, k in OldKeys { ; Put the keys after key 96 | if (i < idx) ; back into key list 97 | continue 98 | obj._keys.Insert(k) 99 | } 100 | return r 101 | } 102 | 103 | -------------------------------------------------------------------------------- /lib/ref/OrderedAssociativeArray.ahk: -------------------------------------------------------------------------------- 1 | Class OrderedAssociativeArray { 2 | __New() { 3 | ObjRawSet(this, "__Data", {}) 4 | ObjRawSet(this, "__Order", []) 5 | } 6 | 7 | __Get(args*) { 8 | return this.__Data[args*] 9 | } 10 | 11 | __Set(args*) { 12 | key := args[1] 13 | val := args.Pop() 14 | if(args.Length() < 2 && this.__Data.HasKey(key)) { 15 | this.Delete(key) 16 | } 17 | if(!this.__Data.HasKey(key)) { 18 | this.__Order.Push(key) 19 | } 20 | this.__Data[args*] := val 21 | return val 22 | } 23 | 24 | InsertAt(pos, key, val) { 25 | this.__Order.InsertAt(pos, key) 26 | this.__Data[key] := val 27 | } 28 | 29 | RemoveAt(pos) { 30 | val := this.__Data[this.__Order[pos]] 31 | this.__Data.Delete(this.__Order[pos]) 32 | this.__Order.RemoveAt(pos) 33 | return val 34 | } 35 | 36 | Delete(key) { 37 | for i, v in this.__Order { 38 | if(key == v) { 39 | return this.RemoveAt(i) 40 | } 41 | } 42 | } 43 | 44 | Length() { 45 | return this.__Order.Length() 46 | } 47 | 48 | HasKey(key) { 49 | return this.__Data.HasKey(key) 50 | } 51 | 52 | _NewEnum() { 53 | return new OrderedAssociativeArray.Enum(this.__Data, this.__Order) 54 | } 55 | 56 | Class Enum { 57 | __New(Data, Order) { 58 | this.Data := Data 59 | this.oEnum := Order._NewEnum() 60 | } 61 | 62 | Next(ByRef key, ByRef val := "") { 63 | res := this.oEnum.next(, key) 64 | val := this.Data[key] 65 | return res 66 | } 67 | } 68 | } 69 | 70 | ; class testOrder 71 | ; { 72 | ; order := [] 73 | 74 | ; __Set(k){ 75 | ; this.order.push(k) 76 | ; } 77 | 78 | ; _NewEnum(){ 79 | ; return new this.customEnum(this) 80 | ; } 81 | 82 | ; class customEnum 83 | ; { 84 | ; __New(obj){ 85 | ; this.obj := obj 86 | ; this.order := obj.order 87 | ; } 88 | 89 | ; Next(ByRef k, ByRef v := ""){ 90 | ; if (this.order[1]){ 91 | ; k := this.order.RemoveAt(1) 92 | ; v := this.obj[k] 93 | ; return true 94 | ; } 95 | ; return false 96 | ; } 97 | ; } 98 | ; } 99 | -------------------------------------------------------------------------------- /lib/ref/Ping4.ahk: -------------------------------------------------------------------------------- 1 | ; Function: IPv4 ping with name resolution, based upon 'SimplePing' by Uberi -> 2 | ; ====================================================================================================================== 3 | ; http://www.autohotkey.com/board/topic/87742-simpleping-successor-of-ping/ 4 | ; Parameters: Addr - IPv4 address or host / domain name. 5 | ; ---------- Optional: 6 | ; Result - Object to receive the result in three keys: 7 | ; - InAddr - Original value passed in parameter Addr. 8 | ; - IPAddr - The replying IPv4 address. 9 | ; - RTTime - The round trip time, in milliseconds. 10 | ; Timeout - The time, in milliseconds, to wait for replies. 11 | ; Return values: On success: The round trip time, in milliseconds. 12 | ; On failure: "", ErrorLevel contains additional informations. 13 | ; Tested with: AHK 1.1.22.03 14 | ; Tested on: Win 8.1 x64 15 | ; Authors: Uberi / just me 16 | ; Change log: 1.0.01.00/2015-07-16/just me - fixed bug on Win 8 17 | ; 1.0.00.00/2013-11-06/just me - initial release 18 | ; MSDN: Winsock Functions -> http://msdn.microsoft.com/en-us/library/ms741394(v=vs.85).aspx 19 | ; IP Helper Functions -> hhttp://msdn.microsoft.com/en-us/library/aa366071(v=vs.85).aspx 20 | ; ====================================================================================================================== 21 | Ping4(Addr, ByRef Result := "", Timeout := 1024) { 22 | ; ICMP status codes -> http://msdn.microsoft.com/en-us/library/aa366053(v=vs.85).aspx 23 | ; WSA error codes -> http://msdn.microsoft.com/en-us/library/ms740668(v=vs.85).aspx 24 | Static WSADATAsize := (2 * 2) + 257 + 129 + (2 * 2) + (A_PtrSize - 2) + A_PtrSize 25 | OrgAddr := Addr 26 | Result := "" 27 | ; Initiate the use of the Winsock 2 DLL 28 | VarSetCapacity(WSADATA, WSADATAsize, 0) 29 | If (Err := DllCall("Ws2_32.dll\WSAStartup", "UShort", 0x0202, "Ptr", &WSADATA, "Int")) { 30 | ErrorLevel := "WSAStartup failed with error " . Err 31 | Return "" 32 | } 33 | If !RegExMatch(Addr, "^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$") { ; Addr contains a name 34 | If !(HOSTENT := DllCall("Ws2_32.dll\gethostbyname", "AStr", Addr, "UPtr")) { 35 | DllCall("Ws2_32.dll\WSACleanup") ; Terminate the use of the Winsock 2 DLL 36 | ErrorLevel := "gethostbyname failed with error " . DllCall("Ws2_32.dll\WSAGetLastError", "Int") 37 | Return "" 38 | } 39 | PAddrList := NumGet(HOSTENT + 0, (2 * A_PtrSize) + 4 + (A_PtrSize - 4), "UPtr") 40 | PIPAddr := NumGet(PAddrList + 0, 0, "UPtr") 41 | Addr := StrGet(DllCall("Ws2_32.dll\inet_ntoa", "UInt", NumGet(PIPAddr + 0, 0, "UInt"), "UPtr"), "CP0") 42 | } 43 | INADDR := DllCall("Ws2_32.dll\inet_addr", "AStr", Addr, "UInt") ; convert address to 32-bit UInt 44 | If (INADDR = 0xFFFFFFFF) { 45 | ErrorLevel := "inet_addr failed for address " . Addr 46 | Return "" 47 | } 48 | ; Terminate the use of the Winsock 2 DLL 49 | DllCall("Ws2_32.dll\WSACleanup") 50 | HMOD := DllCall("LoadLibrary", "Str", "Iphlpapi.dll", "UPtr") 51 | Err := "" 52 | If (HPORT := DllCall("Iphlpapi.dll\IcmpCreateFile", "UPtr")) { ; open a port 53 | REPLYsize := 32 + 8 54 | VarSetCapacity(REPLY, REPLYsize, 0) 55 | If DllCall("Iphlpapi.dll\IcmpSendEcho", "Ptr", HPORT, "UInt", INADDR, "Ptr", 0, "UShort", 0 56 | , "Ptr", 0, "Ptr", &REPLY, "UInt", REPLYsize, "UInt", Timeout, "UInt") { 57 | Result := {} 58 | Result.InAddr := OrgAddr 59 | Result.IPAddr := StrGet(DllCall("Ws2_32.dll\inet_ntoa", "UInt", NumGet(Reply, 0, "UInt"), "UPtr"), "CP0") 60 | Result.RTTime := NumGet(Reply, 8, "UInt") 61 | } 62 | Else 63 | Err := "IcmpSendEcho failed with error " . A_LastError 64 | DllCall("Iphlpapi.dll\IcmpCloseHandle", "Ptr", HPORT) 65 | } 66 | Else 67 | Err := "IcmpCreateFile failed to open a port!" 68 | DllCall("FreeLibrary", "Ptr", HMOD) 69 | If (Err) { 70 | ErrorLevel := Err 71 | Return "" 72 | } 73 | ErrorLevel := 0 74 | Return Result.RTTime 75 | } 76 | -------------------------------------------------------------------------------- /lib/routine/AutoLevelGems.ahk: -------------------------------------------------------------------------------- 1 | ; autoLevelGems - Check for gems that are ready to level up, and click them. 2 | ; ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 3 | autoLevelGems() 4 | { 5 | Static LastCheck:=0 6 | If (WR.perChar.Setting.autolevelgemsEnable && OnChar && (A_TickCount - LastCheck > 200)) 7 | { 8 | IfWinActive, ahk_group POEGameGroup 9 | { 10 | SetKeyDelay, %SetKeyDelayValue1%, %SetKeyDelayValue2%, Play 11 | SetMouseDelay, %SetMouseDelayValue% 12 | SetDefaultMouseSpeed, %SetDefaultMouseSpeedValue% 13 | If (WR.perChar.Setting.autolevelgemsWait && (GetKeyState("LButton","P") || GetKeyState("RButton","P"))) 14 | Return 15 | LastCheck := A_TickCount 16 | if (ok:=FindText(GameX + Round(GameW * .93) , GameY + Round(GameH * .17), GameX + GameW , GameY + Round(GameH * .8), 0, 0, SkillUpStr,0)) 17 | { 18 | X:=ok.1.1, Y:=ok.1.2, W:=ok.1.3, H:=ok.1.4, X+=W//2, Y+=H//2 19 | MouseGetPos, mX, mY 20 | LP := GetKeyState("LButton","P"), RP := GetKeyState("RButton","P") 21 | If (LP || RP) 22 | { 23 | If LP 24 | Click, up 25 | If RP 26 | Click, Right, up 27 | Sleep, 25 28 | } 29 | BlockInput, MouseMove 30 | MouseMove, X, Y, 0 31 | Sleep, 30*Latency 32 | Send {Click} 33 | Sleep, 45*Latency 34 | MouseMove, mX, mY, 0 35 | BlockInput, MouseMoveOff 36 | LP := GetKeyState("LButton","P"), RP := GetKeyState("RButton","P") 37 | If (LP || RP) 38 | { 39 | Sleep, 25 40 | If LP 41 | Click, down 42 | If RP 43 | Click, Right, down 44 | } 45 | ok:="" 46 | } 47 | } 48 | } 49 | Return 50 | } 51 | -------------------------------------------------------------------------------- /lib/routine/CheckDebuffs.ahk: -------------------------------------------------------------------------------- 1 | CheckDebuffs(){ 2 | ; Debuff area 3 | If !(searchList := determineDebuffTriggerActive()) 4 | Return 5 | x1:=GameX, y1:=GameY+Round(GameH/(1080/81)), x2:=GameX+GameW, y2:=GameY+Round(GameH/(1080/162)) 6 | For k, debuff in searchList 7 | { 8 | If (debuffFound := FindText(x1, y1, x2, y2, 0, 0, debuff%debuff%Str,0)) 9 | { 10 | For k, type in ["Flask","Utility"] 11 | Loop, % (type="Flask"?5:10) 12 | If (WR[type][A_Index][debuff] && WR.func.Toggle[type] && WR.cdExpires[type][A_Index] <= A_TickCount) 13 | Trigger(WR[type][A_Index],True) 14 | } 15 | } 16 | Return 17 | } 18 | determineDebuffTriggerActive(){ 19 | active:=[] 20 | For k, type in ["Flask","Utility"] 21 | Loop, % (type="Flask"?5:10) 22 | { 23 | slot := A_Index 24 | for k, debuff in ["Curse", "Shock", "Bleed", "Freeze", "Ignite", "Poison"] 25 | If (WR[type][slot][debuff] && !indexOf(debuff,active)) 26 | active.Push(debuff) 27 | } 28 | If active.Count() 29 | Return active 30 | Return False 31 | } 32 | -------------------------------------------------------------------------------- /lib/routine/Coord.ahk: -------------------------------------------------------------------------------- 1 | ; Coord - : Pixel information on Mouse Cursor, provides pixel location and RGB color hex 2 | ; ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 3 | Coord(){ 4 | Global Picker 5 | CoordCommand: 6 | Rect := LetUserSelectRect(1) 7 | If (Rect) 8 | { 9 | If (Rect.X1 > Rect.X2) { 10 | swap := Rect.X1 11 | Rect.X1 := Rect.X2 12 | Rect.X2 := swap 13 | } 14 | If (Rect.Y1 > Rect.Y2) { 15 | swap := Rect.Y1 16 | Rect.Y1 := Rect.Y2 17 | Rect.Y2 := swap 18 | } 19 | T1 := A_TickCount 20 | Ding(10000,-11,"Building an average of area colors`nThis may take some time, press escape to skip calculation.") 21 | AvgColor := AverageAreaColor(Rect) 22 | Ding(100,-11,"") 23 | Clipboard := "Average Color of Area: " AvgColor "`n`n" "X1:" Rect.X1 "`tY1:" Rect.Y1 "`tX2:" Rect.X2 "`tY2:" Rect.Y2 "`nWidth: " Rect.X2-Rect.X1+1 "`tHeight: " Rect.Y2-Rect.Y1+1 24 | Notify(Clipboard, "`nThis information has been placed in the clipboard`nCalculation Took " (T1 := A_TickCount - T1) " MS for " (T_Area := ((Rect.X2 - Rect.X1 + 1) * (Rect.Y2 - Rect.Y1 + 1))) " Pixels`n" Round(T1 / T_Area,3) " MS per pixel",5) 25 | Picker.SetColor(AvgColor) 26 | } 27 | Else 28 | Ding(3000,-11,Clipboard "`nColor and Location copied to Clipboard") 29 | Return 30 | } 31 | -------------------------------------------------------------------------------- /lib/routine/GemSwap.ahk: -------------------------------------------------------------------------------- 1 | ; GemSwap - Swap gems between two locations 2 | ; ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 3 | GemSwap(){ 4 | GemSwapCommand: 5 | SetKeyDelay, %SetKeyDelayValue1%, %SetKeyDelayValue2%, Play 6 | SetMouseDelay, %SetMouseDelayValue% 7 | SetDefaultMouseSpeed, %SetDefaultMouseSpeedValue% 8 | Critical 9 | Keywait, Alt 10 | BlockInput, MouseMove 11 | MouseGetPos xx, yy 12 | RandomSleep(45,45) 13 | 14 | If !GuiStatus("OnInventory") 15 | { 16 | SendHotkey(hotkeyInventory) 17 | RandomSleep(45,45) 18 | } 19 | ;First Gem or Item Swap 20 | If (WR.perChar.Setting.swap1Xa && WR.perChar.Setting.swap1Ya 21 | && WR.perChar.Setting.swap1Xb && WR.perChar.Setting.swap1Yb) 22 | { 23 | If (WR.perChar.Setting.swap1Item) 24 | { 25 | LeftClick(WR.perChar.Setting.swap1Xa, WR.perChar.Setting.swap1Ya) 26 | } 27 | Else 28 | { 29 | RightClick(WR.perChar.Setting.swap1Xa, WR.perChar.Setting.swap1Ya) 30 | } 31 | RandomSleep(45,45) 32 | If (WR.perChar.Setting.swap1AltWeapon) 33 | { 34 | SendHotkey(hotkeyWeaponSwapKey) 35 | RandomSleep(90,120) 36 | } 37 | LeftClick(WR.perChar.Setting.swap1Xb, WR.perChar.Setting.swap1Yb) 38 | RandomSleep(90,120) 39 | If (WR.perChar.Setting.swap1AltWeapon) 40 | { 41 | SendHotkey(hotkeyWeaponSwapKey) 42 | RandomSleep(90,120) 43 | } 44 | LeftClick(WR.perChar.Setting.swap1Xa, WR.perChar.Setting.swap1Ya) 45 | RandomSleep(90,120) 46 | } 47 | ;Second Gem of Item Swap 48 | If (WR.perChar.Setting.swap2Xa && WR.perChar.Setting.swap2Ya 49 | && WR.perChar.Setting.swap2Xb && WR.perChar.Setting.swap2Yb) 50 | { 51 | If (WR.perChar.Setting.swap2Item) 52 | { 53 | LeftClick(WR.perChar.Setting.swap2Xa, WR.perChar.Setting.swap2Ya) 54 | } 55 | Else 56 | { 57 | RightClick(WR.perChar.Setting.swap2Xa, WR.perChar.Setting.swap2Ya) 58 | } 59 | RandomSleep(45,45) 60 | If (WR.perChar.Setting.swap2AltWeapon) 61 | { 62 | SendHotkey(hotkeyWeaponSwapKey) 63 | RandomSleep(90,120) 64 | } 65 | LeftClick(WR.perChar.Setting.swap2Xb, WR.perChar.Setting.swap2Yb) 66 | RandomSleep(90,120) 67 | If (WR.perChar.Setting.swap2AltWeapon) 68 | { 69 | SendHotkey(hotkeyWeaponSwapKey) 70 | RandomSleep(90,120) 71 | } 72 | LeftClick(WR.perChar.Setting.swap2Xa, WR.perChar.Setting.swap2Ya) 73 | RandomSleep(90,120) 74 | } 75 | SendHotkey(hotkeyInventory) 76 | MouseMove, xx, yy, 0 77 | BlockInput, MouseMoveOff 78 | return 79 | } -------------------------------------------------------------------------------- /lib/routine/GrabCurrency.ahk: -------------------------------------------------------------------------------- 1 | ; GrabCurrency - Get currency fast to use on a white/blue/rare strongbox 2 | ; ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 3 | GrabCurrency(){ 4 | GrabCurrencyCommand: 5 | SetKeyDelay, %SetKeyDelayValue1%, %SetKeyDelayValue2%, Play 6 | SetMouseDelay, %SetMouseDelayValue% 7 | SetDefaultMouseSpeed, %SetDefaultMouseSpeedValue% 8 | Critical 9 | Keywait, Alt 10 | BlockInput, MouseMove 11 | MouseGetPos xx, yy 12 | RandomSleep(45,45) 13 | If (GrabCurrencyX && GrabCurrencyY) 14 | { 15 | If !GuiStatus("OnInventory") 16 | { 17 | SendHotkey(hotkeyInventory) 18 | RandomSleep(45,45) 19 | } 20 | RandomSleep(45,45) 21 | RightClick(GrabCurrencyX, GrabCurrencyY) 22 | RandomSleep(45,45) 23 | SendHotkey(hotkeyInventory) 24 | MouseMove, xx, yy, 0 25 | BlockInput, MouseMoveOff 26 | } 27 | return 28 | } 29 | -------------------------------------------------------------------------------- /lib/routine/Logout.ahk: -------------------------------------------------------------------------------- 1 | ; LogoutCommand - Logout Function 2 | ; ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 3 | LogoutCommand(){ 4 | LogoutCommand: 5 | SetKeyDelay, %SetKeyDelayValue1%, %SetKeyDelayValue2%, Play 6 | SetMouseDelay, %SetMouseDelayValue% 7 | SetDefaultMouseSpeed, %SetDefaultMouseSpeedValue% 8 | Critical 9 | Static LastLogout := 0 10 | if (WR.perChar.Setting.quitDC || (WR.perChar.Setting.quitPortal && (OnMines || OnTown || OnHideout))) { 11 | global POEGameArr 12 | dc := False 13 | succ := logout(Active_executable) 14 | if !(succ == 0) 15 | { 16 | dc := True 17 | } 18 | Else 19 | { 20 | tt= 21 | For k, executable in POEGameArr 22 | { 23 | tt.= (tt?",":"") executable 24 | succ := logout(executable) 25 | if !(succ == 0) 26 | { 27 | dc := True 28 | Break 29 | } 30 | } 31 | } 32 | If !dc 33 | Log("Error","Logout Failed","Could not find game EXE",tt) 34 | If WR.perChar.Setting.quitLogBackIn 35 | { 36 | RandomSleep(750,750) 37 | ControlSend,, {Enter}, %GameStr% 38 | RandomSleep(750,750) 39 | ControlSend,, {Enter}, %GameStr% 40 | } 41 | } 42 | Else If WR.perChar.Setting.quitPortal 43 | { 44 | If ((A_TickCount - LastLogout) > 10000) 45 | { 46 | If !GameActive 47 | WinActivate, %GameStr% 48 | QuickPortal() 49 | LastLogout := A_TickCount 50 | } 51 | } 52 | Else If WR.perChar.Setting.quitExit 53 | { 54 | Send, {Enter}/exit{Enter} 55 | If WR.perChar.Setting.quitLogBackIn 56 | { 57 | RandomSleep(900,900) 58 | ControlSend,, {Enter}, %GameStr% 59 | } 60 | } 61 | If (!WR.perChar.Setting.typeES) 62 | Log("Logout","Exit with " . Player.Percent.Life . "`% Life", CurrentLocation) 63 | Else 64 | Log("Logout","Exit with " . Player.Percent.ES . "`% ES", CurrentLocation) 65 | Thread, NoTimers, False ;End Critical 66 | return 67 | } 68 | -------------------------------------------------------------------------------- /lib/routine/LootScan.ahk: -------------------------------------------------------------------------------- 1 | ; LootScan - Finds matching colors under the cursor while key pressed 2 | LootScan(Reset:=0){ 3 | SetKeyDelay, %SetKeyDelayValue1%, %SetKeyDelayValue2%, Play 4 | SetMouseDelay, %SetMouseDelayValue% 5 | SetDefaultMouseSpeed, %SetDefaultMouseSpeedValue% 6 | Static LV_LastClick := 0 7 | Global LootVacuumActive 8 | If (!ComboHex || Reset) 9 | { 10 | ComboHex := Hex2FindText(LootColors,0,0,"",3,3) 11 | If Reset 12 | Return 13 | } 14 | If (A_TickCount - LV_LastClick <= LVdelay) 15 | Return 16 | If (LootVacuumActive&&LootVacuum) 17 | { 18 | If AreaScale 19 | { 20 | MouseGetPos mX, mY 21 | ClampGameScreen(x := mX - AreaScale, y := mY - AreaScale) 22 | ClampGameScreen(xx := mX + AreaScale, yy := mY + AreaScale) 23 | If (loot := FindText(x,y,xx,yy,0,0,ComboHex,0,0,,,,5)) 24 | { 25 | ScanPx := loot.1.x + 10, ScanPy := loot.1.y + 10 26 | , ScanId := loot.1.id 27 | If ( LootVacuumActive ) 28 | GoSub LootScan_Click 29 | LV_LastClick := A_TickCount 30 | Return 31 | } 32 | If OnMines && YesLootDelve 33 | { 34 | MouseGetPos mX, mY 35 | ClampGameScreen(x := mX - (AreaScale + 80), y := mY - (AreaScale + 80)) 36 | ClampGameScreen(xx := mX + (AreaScale + 80), yy := mY + (AreaScale + 80)) 37 | loot := FindText(x,y,xx,yy,0.1,0.1,DelveStr,0,0) 38 | } 39 | Else If YesLootChests 40 | { 41 | MouseGetPos mX, mY 42 | ClampGameScreen(x := mX - (AreaScale + 80), y := mY - (AreaScale + 80)) 43 | ClampGameScreen(xx := mX + (AreaScale + 80), yy := mY + (AreaScale + 80)) 44 | loot := FindText(x,y,xx,yy,0.1,0.1,ChestStr,0,0) 45 | } 46 | If (loot) 47 | { 48 | ScanPx := loot.1.1, ScanPy := loot.1.y 49 | , ScanPy += 30 50 | If (OnMines && !(loot.Id ~= "cache" || loot.Id ~= "vein")) 51 | ScanPx += loot.3 52 | GoSub LootScan_Click 53 | LV_LastClick := A_TickCount 54 | Return 55 | } 56 | 57 | } 58 | Else 59 | { 60 | MouseGetPos mX, mY 61 | PixelGetColor, scolor, mX, mY, RGB 62 | If (indexOf(scolor,LootColors) ) 63 | If ( LootVacuumActive ) 64 | { 65 | click %mX%, %mY% 66 | LV_LastClick := A_TickCount 67 | } 68 | } 69 | } 70 | Else 71 | LootVacuumActive := False 72 | Return 73 | 74 | LootScanCommand: 75 | If !LootVacuumActive 76 | { 77 | LootVacuumActive:=True 78 | } 79 | If (LootVacuum && LootVacuumTapZ && !LootVacuumTapZEnd && GuiCheck() && CheckTime("Seconds",LootVacuumTapZSec,"RestackLoot")) { 80 | Send {z} 81 | Sleep, 10 82 | Send {z} 83 | } 84 | Return 85 | LootScanCommandRelease: 86 | If LootVacuumActive 87 | { 88 | LootVacuumActive:=False 89 | } 90 | If (LootVacuum && LootVacuumTapZ && LootVacuumTapZEnd && GuiCheck() && CheckTime("Seconds",LootVacuumTapZSec,"RestackLoot")) { 91 | Send {z} 92 | Sleep, 10 93 | Send {z} 94 | } 95 | Return 96 | 97 | LootScan_Click: 98 | LP := GetKeyState("LButton","P"), RP := GetKeyState("RButton","P") 99 | If (LP || RP) 100 | { 101 | If LP 102 | Click, up 103 | If RP 104 | Click, Right, up 105 | Sleep, 30 106 | } 107 | ; MouseMove, ScanPx, ScanPy 108 | BlockInput, MouseMove 109 | Click %ScanPx%, %ScanPy% 110 | BlockInput, Mousemoveoff 111 | If (GetKeyState("RButton","P")) 112 | Click, Right, down 113 | Return 114 | } 115 | -------------------------------------------------------------------------------- /lib/routine/PopFlasks.ahk: -------------------------------------------------------------------------------- 1 | ; PopFlasks - Pop all flasks 2 | ; ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 3 | PopFlasks(){ 4 | PopFlasksCommand: 5 | SetKeyDelay, %SetKeyDelayValue1%, %SetKeyDelayValue2%, Play 6 | SetMouseDelay, %SetMouseDelayValue% 7 | SetDefaultMouseSpeed, %SetDefaultMouseSpeedValue% 8 | Critical 9 | WR.func.Toggle.PopAll := True 10 | If PopFlaskRespectCD 11 | { 12 | Loop 5 13 | If WR.Flask[A_Index].PopAll 14 | Trigger(WR.Flask[A_Index]) 15 | Loop 10 16 | If WR.Utility[A_Index].PopAll 17 | Trigger(WR.Utility[A_Index]) 18 | } 19 | Else 20 | { 21 | Loop 5 22 | If WR.Flask[A_Index].PopAll 23 | { 24 | SendHotkey(WR.Flask[A_Index].Key) 25 | WR.cdExpires.Flask[A_Index]:=A_TickCount + WR.Flask[A_Index].CD 26 | WR.cdExpires.Group[WR.Flask[A_Index].Group] := A_TickCount + WR.Flask[A_Index].GroupCD 27 | RandomSleep(-99,99) 28 | } 29 | Loop 10 30 | If WR.Utility[A_Index].PopAll 31 | { 32 | SendHotkey(WR.Utility[A_Index].Key) 33 | WR.cdExpires.Utility[A_Index]:=A_TickCount + WR.Utility[A_Index].CD 34 | WR.cdExpires.Group[WR.Utility[A_Index].Group] := A_TickCount + WR.Utility[A_Index].GroupCD 35 | RandomSleep(-99,99) 36 | } 37 | } 38 | Critical, Off 39 | WR.func.Toggle.PopAll := False 40 | return 41 | } 42 | 43 | -------------------------------------------------------------------------------- /lib/routine/QuickPortal.ahk: -------------------------------------------------------------------------------- 1 | ; QuickPortal - Open Town Portal 2 | ; ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 3 | QuickPortal(){ 4 | QuickPortalCommand: 5 | If (OnTown || OnHideout || OnMines) 6 | Return 7 | if (hotkeyOpenPortal == A_Space) { 8 | Notify("Hotkey Unset","Set the keybinding to match the in-game Open Portal key.",3) 9 | Return 10 | } 11 | 12 | Critical 13 | BlockInput MouseMove 14 | MouseGetPos xx, yy 15 | 16 | ; Release both the left and right mouse keys 17 | lState := GetKeyState("LButton","P") 18 | rState := GetKeyState("RButton","P") 19 | If (lState || rState) { 20 | if (lState) 21 | Click, up 22 | if (rState) 23 | Click, Right, up 24 | RandomSleep(75,90) 25 | } 26 | 27 | ; Close the inventory if we have it open, required to click in the center of screen. 28 | If (OnInventory && GuiStatus("OnInventory")) { 29 | SendHotkey(hotkeyInventory) 30 | RandomSleep(75,90) 31 | } 32 | 33 | centerX := GameX + Round(GameW/2) 34 | centerY := GameY + Round(GameH*0.48148148148148148148148148148148) 35 | 36 | ; First click at center of screen to stop movement 37 | LeftClick(centerX,centerY) 38 | ; Open the Portal using in-game key 39 | SendHotkey(hotkeyOpenPortal) 40 | RandomSleep(120,150) 41 | ; Click the center of screen to use the portal. 42 | LeftClick(centerX,centerY) 43 | 44 | BlockInput MouseMoveOff 45 | RandomSleep(300,600) 46 | return 47 | } 48 | -------------------------------------------------------------------------------- /lib/routine/StackRelease.ahk: -------------------------------------------------------------------------------- 1 | ; StackRelease 2 | StackRelease() 3 | { 4 | if (buff:=FindText(GameX, GameY, GameX + (GameW//(6/5)),GameY + (GameH//(1080/75)), 0, 0, WR.perChar.Setting.channelrepressIcon,0)) 5 | { 6 | If FindText(buff.1.1 + WR.perChar.Setting.channelrepressOffsetX1,buff.1.2 + buff.1.4 + WR.perChar.Setting.channelrepressOffsetY1,buff.1.1 + buff.1.3 + WR.perChar.Setting.channelrepressOffsetX2,buff.1.2 + buff.1.4 + WR.perChar.Setting.channelrepressOffsetY2, 0, 0, WR.perChar.Setting.channelrepressStack,0) 7 | { 8 | If GetKeyState(WR.perChar.Setting.channelrepressKey,"P") 9 | { 10 | SendHotkey(WR.perChar.Setting.channelrepressKey,"up") 11 | Sleep, 10 12 | SendHotkey(WR.perChar.Setting.channelrepressKey,"down") 13 | } 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lib/routine/ZoneChange.ahk: -------------------------------------------------------------------------------- 1 | ZoneChange(){ 2 | Static Changes := 0 3 | Static OldLoc := 0 4 | 5 | Strings := [] 6 | ; Zone change can be evaluated for number or in town/hideout or not 7 | Changes++ 8 | ThisLoc := OnTown || OnHideout 9 | Strings.Push("Zone changed to " currentlocation) 10 | ; Evaluate if we are now in town, and are not coming from a town or hideout 11 | Strings.Push("This zone is considered a " (OnTown?"Town":OnHideout?"Hideout":"Playable Area")) 12 | If (ThisLoc && OldLoc != ThisLoc) { 13 | Strings.Push("Refreshing Crafting Bases") 14 | RunRefresh := True 15 | } 16 | ; We store the OldLoc temporarily for custom routines to use 17 | TempOld := OldLoc 18 | ; Set OldLoc to the new one for next run 19 | OldLoc := ThisLoc 20 | Log("Zone Change ",Strings*) 21 | If (RunRefresh) { 22 | ;CraftingBasesRequest(YesCraftingBaseAutoUpdateOnZone) 23 | } 24 | #Include *i %A_ScriptDir%\save\MyCustomZoneChange.ahk 25 | } 26 | --------------------------------------------------------------------------------