diff --git a/CHANGELOG.md b/CHANGELOG.md
index 12a2f9f0..19e44e3a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,565 +1,576 @@
# Changelog
+## 0.6.27 (2020-05-08)
+
+- updated rate limiting behavior (#678)
+ - accounts for external requests aswell (e.g. done through the website)
+ - checks current limit with a single request before sending
+ multiple requests if current limit is stale
+ - fails instantly if rate is limited
+ - fails after 10s if rate is still reached
+- fixed search triggered after changing filter if initial search is off (#682)
+- fixed corrupted weapons unable to parse (#684, #688)
+
## 0.6.26 (2020-04-29)
-- add enforce rate limit before calling the actual api
-- add initial search toggle - off by default (#672)
-- add custom user agent to identitfy requests against external apis
-- add normalize quality for attack and defense properties (#624)
-- add evaluate pricing (clipboard, tagging) - clipboard by default
-- update data to 3.10.1f
-- remove auto price tagging
-- remove local package version (#662)
-- fix poedb using wrong cn value for helmets (#663)
+- added enforce rate limit before calling the actual api
+- added initial search toggle - off by default (#672)
+- added custom user agent to identitfy requests against external apis
+- added normalize quality for attack and defense properties (#624)
+- added evaluate pricing (clipboard, tagging) - clipboard by default
+- updated data to 3.10.1f
+- removed auto price tagging
+- removed local package version (#662)
+- fixed poedb using wrong cn value for helmets (#663)
## 0.6.25 (2020-04-24)
-- add delay after closing the dialog via fast tagging (#629)
-- add properties query restriction based on item category (#658)
-- fix optimize analyze function (#652)
-- fix stack size over 1000 wrong value used (#656)
-- fix handle leak (#654)
+- added delay after closing the dialog via fast tagging (#629)
+- added properties query restriction based on item category (#658)
+- fixed optimize analyze function (#652)
+- fixed stack size over 1000 wrong value used (#656)
+- fixed handle leak (#654)
## 0.6.24 (2020-04-22)
-- add separate save button to settings menu (#645)
-- update data to 3.10.1e
-- fix poe.ninja showing the relic price variant (#639)
-- fix mouse clicks not registering for price tagging (#629)
+- added separate save button to settings menu (#645)
+- updated data to 3.10.1e
+- fixed poe.ninja showing the relic price variant (#639)
+- fixed mouse clicks not registering for price tagging (#629)
## 0.6.23 (2020-04-18)
-- add feedback for poeprices.info price prediction (slug@poeprices)
-- add alternative poe titles support (#539)
-- add focusable (keyboard support) as general setting (#620)
-- update value range component (#595)
+- added feedback for poeprices.info price prediction (slug@poeprices)
+- added alternative poe titles support (#539)
+- added focusable (keyboard support) as general setting (#620)
+- updated value range component (#595)
- is now showing both values on hover/ focus even if those are the same
- is now fully operable via scrolling (# -> default -> #)
- change scrolling directions to feel more natural
-- update data to 3.10.1d
-- fix font not loading by adding a local fallback (#635)
-- fix shortcut still active even though poe overlay has no more focus (#627)
-- fix values over 1000 resetting to # (#632)
-- fix mouse position incorrect applied after changing window display settings (#629)
+- updated data to 3.10.1d
+- fixed font not loading by addeding a local fallback (#635)
+- fixed shortcut still active even though poe overlay has no more focus (#627)
+- fixed values over 1000 resetting to # (#632)
+- fixed mouse position incorrect applied after changing window display settings (#629)
## 0.6.22 (2020-04-13)
-- add poeprices.info price prediction (#544)
-- fix multi dialogs not working
-- fix default range values applied on properties (#615)
-- fix apply range only on attack/ defense properties (#617)
-- fix poe overlay does not skip the task bar (#618)
+- added poeprices.info price prediction (#544)
+- fixed multi dialogs not working
+- fixed default range values applied on properties (#615)
+- fixed apply range only on attack/ defense properties (#617)
+- fixed poe overlay does not skip the task bar (#618)
## 0.6.21 (2020-04-12)
-- add focus game after closing all dialogs (#606)
-- add item frame opacity setting (#607)
-- add standard league as fallback if poe ninja returns no results for selected league
-- add own min max range settings for properties
-- add preselect attack and defense as setting
-- update keyboard support to be always enabled
-- remove quality min/ max restriction (#611)
-- fix move poe overlay to top after focusing poe (#608)
+- added focus game after closing all dialogs (#606)
+- added item frame opacity setting (#607)
+- added standard league as fallback if poe ninja returns no results for selected league
+- added own min max range settings for properties
+- added preselect attack and defense as setting
+- updated keyboard support to be always enabled
+- removed quality min/ max restriction (#611)
+- fixed move poe overlay to top after focusing poe (#608)
## 0.6.20 (2020-04-10)
-- fix poe overlay losses focus after clicking on it (#602)
+- fixed poe overlay losses focus after clicking on it (#602)
## 0.6.19 (2020-04-10)
-- update `evaluate-translate` default shortcut to `Alt + T` (#590)
-- fix poe overlay not visible after focus change (#587)
+- updated `evaluate-translate` default shortcut to `Alt + T` (#590)
+- fixed poe overlay not visible after focus change (#587)
## 0.6.18 (2020-04-08)
-- add file cache for all requests to further reduce total request count
-- add temporary cache for listings to reduce detail requests
-- update settings dialog
+- added file cache for all requests to further reduce total request count
+- added temporary cache for listings to reduce detail requests
+- updated settings dialog
- is now an actual window which can be resized
- has now a responsive design to support smaller viewports
- ui language is now directly affected
- zoom is now applied directly
- updata data to 3.10.1c (#555)
-- update run iohook only if required (stash navigation)
-- fix quality higher than 20% showing a lower value as max (#584)
-- fix `Oni-Goroshi Charan's Sword` unable to parse (#575)
+- updated run iohook only if required (stash navigation)
+- fixed quality higher than 20% showing a lower value as max (#584)
+- fixed `Oni-Goroshi Charan's Sword` unable to parse (#575)
## 0.6.17 (2020-04-02)
-- add file cache as last resort to ensure a robust api in cost of fresh data
-- add unidentifed items support
-- add armour/ evasion/ energy shield/ dps with 20% quality (#136)
-- update use same height for each mod whether selected or not (#540)
-- update evaluate search error display to include the actual reason (#537)
-- fix `Titan's Arcade Map of Temporal Chains` mismatched with `Temporal Chains` (my patrons)
+- added file cache as last resort to ensure a robust api in cost of fresh data
+- added unidentifed items support
+- added armour/ evasion/ energy shield/ dps with 20% quality (#136)
+- updated use same height for each mod whether selected or not (#540)
+- updated evaluate search error display to include the actual reason (#537)
+- fixed `Titan's Arcade Map of Temporal Chains` mismatched with `Temporal Chains` (my patrons)
## 0.6.16 (2020-03-31)
-- add disabled debounce time on max value (#522)
-- add configurable fetch count to ensure the request rate is met (#520)
-- add clear session on application start and unknown http error (#520)
-- update untoggled modifier do now not cancel the search (#512)
-- fix rare armour searched with type and name instead of term (#506)
+- added disabled debounce time on max value (#522)
+- added configurable fetch count to ensure the request rate is met (#520)
+- added clear session on application start and unknown http error (#520)
+- updated untoggled modifier do now not cancel the search (#512)
+- fixed rare armour searched with type and name instead of term (#506)
## 0.6.15 (2020-03-27)
-- fix an error occured while fetching poe.ninja (#468)
-- fix poe overlay does not recognize if poe is no longer active (#485, #486)
+- fixed an error occured while fetching poe.ninja (#468)
+- fixed poe overlay does not recognize if poe is no longer active (#485, #486)
## 0.6.14 (2020-03-26)
-- add nonunique rarity support (#477)
-- add changelog as tray entry and show after update (#471)
-- add display trade page error message (#468)
-- add renderer logging support log to file (#468)
-- update data to 3.10.1
-- fix auto update by calling quit and install even after normal quit (#474)
-- fix invisible values at map info (#472)
+- added nonunique rarity support (#477)
+- added changelog as tray entry and show after updated (#471)
+- added display trade page error message (#468)
+- added renderer logging support log to file (#468)
+- updated data to 3.10.1
+- fixed auto updated by calling quit and install even after normal quit (#474)
+- fixed invisible values at map info (#472)
## 0.6.13 (2020-03-25)
-- add loading animations
-- add keyboard support toggle as tray menu entry (#460)
-- add `CmdOrCtrl + F` as supported accelerator (#293, #454)
-- add display default values while holding right click (#335)
-- update disable keyboard support by defaut (#460)
-- update data to 3.10.0f
-- fix spacebar closes built in browser by disabling keyboard support (#461)
-- fix tooltips not visible by disabling keyboard support (#464)
+- added loading animations
+- added keyboard support toggle as tray menu entry (#460)
+- added `CmdOrCtrl + F` as supported accelerator (#293, #454)
+- added display default values while holding right click (#335)
+- updated disable keyboard support by defaut (#460)
+- updated data to 3.10.0f
+- fixed spacebar closes built in browser by disabling keyboard support (#461)
+- fixed tooltips not visible by disabling keyboard support (#464)
## 0.6.12 (2020-03-24)
-- fix not covering the game correctly (#453, #456)
-- fix poe losing focus after alt + tabbing (#455)
+- fixed not covering the game correctly (#453, #456)
+- fixed poe losing focus after alt + tabbing (#455)
## 0.6.11 (2020-03-24)
-- add league as fast toggle option (#273)
-- add keyboard support for stat ranges (#152)
-- update default debounce time to 1s (#426)
-- update keyboard empty error to include you may need to start with privileged rights (#361)
-- remove requestedExecutionLevel from manifest (#361)
-- fix force poe to be active prior copying item data
-- fix scroll wheel not working on win7 (#319)
-- fix remove typeId only on weapon, armour and accessory (#437, #441)
+- added league as fast toggle option (#273)
+- added keyboard support for stat ranges (#152)
+- updated default debounce time to 1s (#426)
+- updated keyboard empty error to include you may need to start with privileged rights (#361)
+- removed requestedExecutionLevel from manifest (#361)
+- fixed force poe to be active prior copying item data
+- fixed scroll wheel not working on win7 (#319)
+- fixed removed typeId only on weapon, armour and accessory (#437, #441)
## 0.6.10 (2020-03-22)
-- add missing translations (#413)
-- add trade search configurable debounce time with instant support (#426)
-- add trade search cancelable (my patrons)
-- update always use the item type of maps and flasks as query param (#433)
-- update use ico instead of png as tray icon (#403)
-- update disable arrow if no mod selected (#425)
-- fix run on boot not working (#419)
-- fix uncaught exceptions thrown after app relaunch (#411)
+- added missing translations (#413)
+- added trade search configurable debounce time with instant support (#426)
+- added trade search cancelable (my patrons)
+- updated always use the item type of maps and flasks as query param (#433)
+- updated use ico instead of png as tray icon (#403)
+- updated disable arrow if no mod selected (#425)
+- fixed run on boot not working (#419)
+- fixed uncaught exceptions thrown after app relaunch (#411)
## 0.6.9 (2020-03-19)
-- fix cloudflare access error
-- fix false trojan warning
+- fixed cloudflare access error
+- fixed false trojan warning
## 0.6.8 (2020-03-19)
-- add bookmark external flag (#373)
-- add evaluate original currency (#308)
-- update exchange rate to not show inverse rate if item has stack size > 1 (#377)
-- update data to 3.10.0d
-- update chinese translations (thanks to Eyster87)
-- remove simplified chinese (maintenance for 3.10)
-- fix missing mod `Trigger a Socketed Spell when you Use a Skill` (#368)
-- fix missing map tier filter (#372)
-- fix temporary damage_resistance mismatched with damage_resistance_is (#359)
+- added bookmark external flag (#373)
+- added evaluate original currency (#308)
+- updated exchange rate to not show inverse rate if item has stack size > 1 (#377)
+- updated data to 3.10.0d
+- updated chinese translations (thanks to Eyster87)
+- removed simplified chinese (maintenance for 3.10)
+- fixed missing mod `Trigger a Socketed Spell when you Use a Skill` (#368)
+- fixed missing map tier filter (#372)
+- fixed temporary damage_resistance mismatched with damage_resistance_is (#359)
## 0.6.7 (2020-03-18)
-- add traditional chinese support (Garena)
-- add simplified chinese support (Tencent)
-- add seperate ui language
+- added traditional chinese support (Garena)
+- added simplified chinese support (Tencent)
+- added seperate ui language
- polish
-- add search placeholder above stat list
-- add stash highlight keybinding (#350)
-- add stash navigation mode (disabled, normal, inverse)
-- add alt modifier to bookmark hotkeys (#362)
-- add unique select all (#360)
-- update data to 3.10.0c
-- fix uncaught exception on alert
+- added search placeholder above stat list
+- added stash highlight keybinding (#350)
+- added stash navigation mode (disabled, normal, inverse)
+- added alt modifier to bookmark hotkeys (#362)
+- added unique select all (#360)
+- updated data to 3.10.0c
+- fixed uncaught exception on alert
## 0.6.6 (2020-03-17)
-- add dps mod range (#294)
-- add weapon, shield and armour props as mod range (#335)
-- fix regex not working with unicode (#338, #340)
+- added dps mod range (#294)
+- added weapon, shield and armour props as mod range (#335)
+- fixed regex not working with unicode (#338, #340)
## 0.6.5 (2020-03-16)
-- add requestExecutionLevel highest (#333)
-- add hardware acceleration toggle as tray option (#329, #327)
-- add aero is enabled check
-- add iohook vc redist error handling (#325)
-- update readme (esc/ space) (#330)
-- fix multiline `Added Small Passive Skills grant` stat (#324)
-- fix singular/ plural stats (#320)
+- added requestExecutionLevel highest (#333)
+- added hardware acceleration toggle as tray option (#329, #327)
+- added aero is enabled check
+- added iohook vc redist error handling (#325)
+- updated readme (esc/ space) (#330)
+- fixed multiline `addeded Small Passive Skills grant` stat (#324)
+- fixed singular/ plural stats (#320)
## 0.6.4 (2020-03-15)
-- add support for canonical stats variation (#313)
-- add support for `Added Small Passive Skills grant` stat (#313)
-- fix enchant stats not working (#320)
-- fix unique framgents category mismatched as unique map fragmente (#309)
+- added support for canonical stats variation (#313)
+- added support for `addeded Small Passive Skills grant` stat (#313)
+- fixed enchant stats not working (#320)
+- fixed unique framgents category mismatched as unique map fragmente (#309)
## 0.6.3 (2020-03-15)
-- add 3.10 stats (#311)
-- add support for windowed mode by moving the overlay on top of poe (#233)
-- update default dialog spawns to center (#315)
-- fix breaking on tab by settings window on top after tabbing back (#295)
-- fix dialog spawns not centered if zoomed (#315)
+- added 3.10 stats (#311)
+- added support for windowed mode by moving the overlay on top of poe (#233)
+- updated default dialog spawns to center (#315)
+- fixed breaking on tab by settings window on top after tabbing back (#295)
+- fixed dialog spawns not centered if zoomed (#315)
## 0.6.2 (2020-03-13)
-- add periodic version check
-- remove version popup
-- fix auto update not working
+- added periodic version check
+- removed version popup
+- fixed auto updated not working
## 0.6.1 (2020-03-13)
-- add allow user to change install path (#296, #300)
-- add toggle for auto download (#297)
-- update data to 3.10
+- added allow user to change install path (#296, #300)
+- added toggle for auto download (#297)
+- updated data to 3.10
## 0.6.0 (2020-03-12)
-- add auto update (#40)
-- add auto launch on boot/ login (#81)
-- add relaunch app via tray and menu (#275)
-- add localized poe db (#282)
-- fix `Clipboard was empty` while using a non US/DEU keyboard layout (#177)
-- update data to 3.9.3b
-- update accelerators to support `|< (#269)
-- update korean translations (thanks to moveoh)
+- added auto updated (#40)
+- added auto launch on boot/ login (#81)
+- added relaunch app via tray and menu (#275)
+- added localized poe db (#282)
+- fixed `Clipboard was empty` while using a non US/DEU keyboard layout (#177)
+- updated data to 3.9.3b
+- updated accelerators to support `|< (#269)
+- updated korean translations (thanks to moveoh)
## 0.5.22 (2020-03-08)
-- add dialog spawn position as general setting (Cursor, Center) (#210)
-- update data to 3.9.3
-- remove hotkeys dependency (#261)
-- fix timeless jewels missing keystone (#274)
-- fix `waterways map of vulnerablity` mismatched with `vulnerablitity skill gem` (#268)
+- added dialog spawn position as general setting (Cursor, Center) (#210)
+- updated data to 3.9.3
+- removed hotkeys dependency (#261)
+- fixed timeless jewels missing keystone (#274)
+- fixed `waterways map of vulnerablity` mismatched with `vulnerablitity skill gem` (#268)
## 0.5.21 (2020-02-23)
- - fix fast tag not working on multiple monitor set-up (#266)
+ - fixed fast tag not working on multiple monitor set-up (#266)
## 0.5.20 (2020-02-23)
-- add bulk price support for fast tagging (#253)
-- update browser width to consider aspect ratio
-- update query to use rarity only for uniques (#231)
-- update stats data
- - fix non negatable mods using it's matched predicate only (#237)
- - fix some unavailable translations because of mismatched predicates
-- remove `alt f4` as possible hotkey (#259)
-- fix evaluate dialog out of overlay bounds (#258)
-- fix stash navigation not working with custom ui scale (#257)
-- fix clipboard empty using `alt` as modifier by releasing it prior sending the copy command
-- fix query using integers only (#237)
+- added bulk price support for fast tagging (#253)
+- updated browser width to consider aspect ratio
+- updated query to use rarity only for uniques (#231)
+- updated stats data
+ - fixed non negatable mods using it's matched predicate only (#237)
+ - fixed some unavailable translations because of mismatched predicates
+- removed `alt f4` as possible hotkey (#259)
+- fixed evaluate dialog out of overlay bounds (#258)
+- fixed stash navigation not working with custom ui scale (#257)
+- fixed clipboard empty using `alt` as modifier by releasing it prior sending the copy command
+- fixed query using integers only (#237)
## 0.5.19 (2020-02-20)
-- add browser use 70% of primary monitor size (#214)
-- add negotiable pricing on double click (#191)
-- add min/ max modifier range (#249)
-- add preselect links (always, 5-6, 6, never) (#218)
-- add ceiling/ flooring for mod ranges if possible (#255)
-- update russian translations (thanks to S1ROZHA)
-- update pseudo elemental order (fire > cold > lightning) (#255)
-- remove some pseudo redundancies (#255)
-- remove preselect sockets
+- added browser use 70% of primary monitor size (#214)
+- added negotiable pricing on double click (#191)
+- added min/ max modifier range (#249)
+- added preselect links (always, 5-6, 6, never) (#218)
+- added ceiling/ flooring for mod ranges if possible (#255)
+- updated russian translations (thanks to S1ROZHA)
+- updated pseudo elemental order (fire > cold > lightning) (#255)
+- removed some pseudo redundancies (#255)
+- removed preselect sockets
## 0.5.18 (2020-02-19)
-- add double click tray to open settings (#247)
-- add browser use same scale as app (#214)
-- add stack size amount to exchange rate (#227)
-- update pseudo config (#230)
-- update data to 3.9.2f
-- fix blurry text after drag-drop (#214)
+- added double click tray to open settings (#247)
+- added browser use same scale as app (#214)
+- added stack size amount to exchange rate (#227)
+- updated pseudo config (#230)
+- updated data to 3.9.2f
+- fixed blurry text after drag-drop (#214)
## 0.5.17 (2020-02-16)
-- add `escape` to close browser (#222)
-- add ui scaling (#214)
-- update modifier range clamp function to reset to 0 (#237)
-- update highlight hotkey `CTRL + F` to `ALT + F`
-- update hotkeys to be non-passive
-- update elemental colors (#241)
-- update french translations (thanks to vindoq)
-- fix non negated negative mods flipped (#239)
-- remove modal flag after minimizing browser (#219, #236)
+- added `escape` to close browser (#222)
+- added ui scaling (#214)
+- updated modifier range clamp function to reset to 0 (#237)
+- updated highlight hotkey `CTRL + F` to `ALT + F`
+- updated hotkeys to be non-passive
+- updated elemental colors (#241)
+- updated french translations (thanks to vindoq)
+- fixed non negated negative mods flipped (#239)
+- removed modal flag after minimizing browser (#219, #236)
## 0.5.16 (2020-02-13)
-- add fast-tag support to exchange rate (#228)
-- add count to evaluation results (#220)
-- add missing pseudo mods (#230)
-- add elemental color to mods
-- add bookmark module (#206)
+- added fast-tag support to exchange rate (#228)
+- added count to evaluation results (#220)
+- added missing pseudo mods (#230)
+- added elemental color to mods
+- added bookmark module (#206)
- `https://www.poelab.com/` on `num1`
- `https://wraeclast.com/` on `num2`
-- update ux design (#211)
+- updated ux design (#211)
- new accent color
- menu keeps height after tab change
- custom scrollbar
-- fix nearby enemies counted as chaos resistance (#213)
+- fixed nearby enemies counted as chaos resistance (#213)
## 0.5.15 (2020-02-10)
-- add version toggle (#205)
-- add result view select (Graph, List) (#204)
-- add poe db (ALT + G) (#199)
-- add poe ninja by clicking the exchange rate (#206)
-- update angular to 9.0.0
-- update electron to 8.0.0
-- fix local mod used as pseudo (#201)
-- fix xml tags in copied item info
+- added version toggle (#205)
+- added result view select (Graph, List) (#204)
+- added poe db (ALT + G) (#199)
+- added poe ninja by clicking the exchange rate (#206)
+- updated angular to 9.0.0
+- updated electron to 8.0.0
+- fixed local mod used as pseudo (#201)
+- fixed xml tags in copied item info
## 0.5.14 (2020-02-08)
-- add account listing count threshold (#196)
-- add listing age mean to tooltip (#196)
-- add `price fixing rating` (**\* > 75%, ** > 50%, \* > 25%)
-- add alternate evaluate list view (#196)
-- add oil exchange rate support (#192)
-- update data to 3.9.2e
-- remove pseudo count filter (#197)
-- fix exchange rate using wrong link count (#187)
-- fix using wrong mouse position with scaled os (#195)
+- added account listing count threshold (#196)
+- added listing age mean to tooltip (#196)
+- added `price fixing rating` (**\* > 75%, ** > 50%, \* > 25%)
+- added alternate evaluate list view (#196)
+- added oil exchange rate support (#192)
+- updated data to 3.9.2e
+- removed pseudo count filter (#197)
+- fixed exchange rate using wrong link count (#187)
+- fixed using wrong mouse position with scaled os (#195)
## 0.5.13 (2020-02-04)
-- add divination card header
-- add delay before registering hotkeys after showing window (#177)
-- update pseudo mod behaviour
+- added divination card header
+- added delay before registering hotkeys after showing window (#177)
+- updated pseudo mod behaviour
- use pseudo value instead of single value (#182)
- - remove stat from list if used as pseudo stat (#175)
+ - removed stat from list if used as pseudo stat (#175)
- increase command throttle time (#188)
-- fix authenticated request hitting rate limit (#185)
-- fix exchange rate using 6L if no links are present (#187)
+- fixed authenticated request hitting rate limit (#185)
+- fixed exchange rate using 6L if no links are present (#187)
## 0.5.12 (2020-02-03)
-- add kakao client support (#181)
-- add essence support (#180)
-- add [project wiki](https://github.com/Kyusung4698/PoE-Overlay/wiki) to faq
+- added kakao client support (#181)
+- added essence support (#180)
+- added [project wiki](https://github.com/Kyusung4698/PoE-Overlay/wiki) to faq
- increase keyboard delay (#177)
-- remove `restore focus` (#177)
-- fix `herald of thunder` wrong item category (#176)
-- fix atps instead of crit (#183)
+- removed `restore focus` (#177)
+- fixed `herald of thunder` wrong item category (#176)
+- fixed atps instead of crit (#183)
## 0.5.11 (2020-01-30)
-- add option based stat support (#110)
+- added option based stat support (#110)
- influenced by #
- occupied by #
-- add currency selector for evaluate (#145)
-- update translations
-- fix resonators not recognized as currency (#166)
-- fix attributes not recognized in pseudo parser (#163)
-- fix space closing window outside of the game (#162)
+- added currency selector for evaluate (#145)
+- updated translations
+- fixed resonators not recognized as currency (#166)
+- fixed attributes not recognized in pseudo parser (#163)
+- fixed space closing window outside of the game (#162)
## 0.5.10 (2020-01-29)
-- add space as hotkey to close all dialogs (#160)
-- add translations files (#158)
-- update graph value to be grouped by chaos equivalent (#145)
-- update stash width calculation (#159)
-- fix `fingerless silk gloves` recognized as `silk gloves` (#157)
+- added space as hotkey to close all dialogs (#160)
+- added translations files (#158)
+- updated graph value to be grouped by chaos equivalent (#145)
+- updated stash width calculation (#159)
+- fixed `fingerless silk gloves` recognized as `silk gloves` (#157)
## 0.5.9 (2020-01-27)
-- add fast price tagging by clicking the desired bar (#147)
+- added fast price tagging by clicking the desired bar (#147)
- only works if the item has no note
- only works if the item is inside a premium stash tab
-- fix default values are not added as query parameter (#151)
-- fix minion stat is recognized as local stat (#149)
+- fixed default values are not addeded as query parameter (#151)
+- fixed minion stat is recognized as local stat (#149)
## 0.5.8 (2020-01-26)
-- add item base values with 7 day history (#84)
-- add online/offline toggle (#104)
-- add clear selected button (#105)
-- fix undefined id check (#144)
-- fix local mod is used instead of global if local is infront of the global (#143)
+- added item base values with 7 day history (#84)
+- added online/offline toggle (#104)
+- added clear selected button (#105)
+- fixed undefined id check (#144)
+- fixed local mod is used instead of global if local is infront of the global (#143)
## 0.5.7 (2020-01-25)
-- update map mods to use negated text version if default (#138)
-- fix overlay not showing on non steam version (#139)
+- updated map mods to use negated text version if default (#138)
+- fixed overlay not showing on non steam version (#139)
## 0.5.6 (2020-01-25)
-- add vaal support (#134)
-- add value range support for quality and gem level (#129)
-- add pseudo total energy shield and increased energy shield (#135)
-- update evaluate dialog position calculation to be based on actual item values (#131)
-- update active check to use executable name instead of window name (#132)
-- update poe assets to patch `3.9.2c`
-- update default indexed range to 3 days
-- fix `clipboard empty...` even though the game is focused (#133)
+- added vaal support (#134)
+- added value range support for quality and gem level (#129)
+- added pseudo total energy shield and increased energy shield (#135)
+- updated evaluate dialog position calculation to be based on actual item values (#131)
+- updated active check to use executable name instead of window name (#132)
+- updated poe assets to patch `3.9.2c`
+- updated default indexed range to 3 days
+- fixed `clipboard empty...` even though the game is focused (#133)
## 0.5.5 (2020-01-23)
-- add autohide overlay if poe is not active (#60, #61, #122)
-- update item clipboard handling
+- added autohide overlay if poe is not active (#60, #61, #122)
+- updated item clipboard handling
- to be more responsive
- to retry automatically
-- update item level to be unmodified by the modifer settings and uncapped by default (#118)
-- fix `Corrupted Blood cannot be inflicted on you (implicit)` mismatched with `Corrupted` (#124)
+- updated item level to be unmodified by the modifer settings and uncapped by default (#118)
+- fixed `Corrupted Blood cannot be inflicted on you (implicit)` mismatched with `Corrupted` (#124)
## 0.5.4 (2020-01-22)
-- add map mod warnings (#120, #18)
-- update pseudo mods for quality type to be toggleable pseudo mods (#98)
-- remove `CTRL + C` and `CTRL + V` as possible keybindings (#117)
-- fix `CTRL + W` closes the application (#116)
-- fix item type not set as filter if default item type toggle is off (#113)
+- added map mod warnings (#120, #18)
+- updated pseudo mods for quality type to be toggleable pseudo mods (#98)
+- removed `CTRL + C` and `CTRL + V` as possible keybindings (#117)
+- fixed `CTRL + W` closes the application (#116)
+- fixed item type not set as filter if default item type toggle is off (#113)
## 0.5.3 (2020-01-21)
-- add map info support (#18)
-- add beast support (#86)
-- add alternate quality support (#98)
-- add stash highlight (CTRL + F) (#106)
-- add open item in wiki (ALT + W; CTRL + ALT + W) (#72)
-- add support for multi-modifier key bindings
-- update tools to misc
+- added map info support (#18)
+- added beast support (#86)
+- added alternate quality support (#98)
+- added stash highlight (CTRL + F) (#106)
+- added open item in wiki (ALT + W; CTRL + ALT + W) (#72)
+- added support for multi-modifier key bindings
+- updated tools to misc
## 0.5.2 (2020-01-20)
-- add faq to menu
-- add title to currency click
-- add settings to disable item level, item type and item socket as default (#101)
-- add config to pre-select stats
-- update item level to use ranged value instead of fixed value
-- fix local mod selector not working (#32)
-- fix link count (#100)
-- fix negated values use wrong range filter (#88)
+- added faq to menu
+- added title to currency click
+- added settings to disable item level, item type and item socket as default (#101)
+- added config to pre-select stats
+- updated item level to use ranged value instead of fixed value
+- fixed local mod selector not working (#32)
+- fixed link count (#100)
+- fixed negated values use wrong range filter (#88)
## 0.5.1 (2020-01-18)
-- add alternative text versions of stats to support negate or plural cases (#55, #68, #88, #96, #97)
-- add local stat support (#32)
-- add common pseudo filters (#7, #29)
-- add multiline stat support (#97)
-- add `Disable Max Range` as settings (#83)
-- add regex caching for better parser performance
-- fix evaluate item frame changing size during loading (#83)
-- fix commands use wrong text (#95)
-- fix blighted map searched as gem (#92)
+- added alternative text versions of stats to support negate or plural cases (#55, #68, #88, #96, #97)
+- added local stat support (#32)
+- added common pseudo filters (#7, #29)
+- added multiline stat support (#97)
+- added `Disable Max Range` as settings (#83)
+- added regex caching for better parser performance
+- fixed evaluate item frame changing size during loading (#83)
+- fixed commands use wrong text (#95)
+- fixed blighted map searched as gem (#92)
## 0.5.0 (2020-01-15)
-- add veiled mod support (#38)
-- add smart multi-currency support (#82)
-- add on uses remaining (#44)
-- add base type as filter (#74)
-- add mod ranges with ±10% (#54, #83)
+- added veiled mod support (#38)
+- added smart multi-currency support (#82)
+- added on uses remaining (#44)
+- added base type as filter (#74)
+- added mod ranges with ±10% (#54, #83)
- de/increase value by `0.1` via `Alt + Wheel`
- de/increase value by `1` via `Wheel`
- de/increase value by `5` via `Shift + Wheel`
- de/enable via `Right Click`
- reset via `Wheel Click`
-- add select all sockets / links via `Shift + Click` (#57)
-- fix `Ctrl + Scroll` moving two tabs by checkin stash window (#77)
-- fix commands overwrite clipboard (#89)
+- added select all sockets / links via `Shift + Click` (#57)
+- fixed `Ctrl + Scroll` moving two tabs by checkin stash window (#77)
+- fixed commands overwrite clipboard (#89)
## 0.5.0-alpha.0 (2020-01-12)
-- add stats type support for (explicit, implicit, crafted, fractured and enchant) (#27, #36, #59, #65)
-- add total count to chart (#9)
-- fix keybindings not working after tabbing (#76)
-- update query to use 1 week listed, only with prices and on/offline.
+- added stats type support for (explicit, implicit, crafted, fractured and enchant) (#27, #36, #59, #65)
+- added total count to chart (#9)
+- fixed keybindings not working after tabbing (#76)
+- updated query to use 1 week listed, only with prices and on/offline.
## 0.4.4 (2020-01-12)
-- add splash icon (#51)
-- fix currency convert check (#66)
-- fix alt key not working as keybinding (#58)
-- fix decimal values not being parsed (#62)
+- added splash icon (#51)
+- fixed currency convert check (#66)
+- fixed alt key not working as keybinding (#58)
+- fixed decimal values not being parsed (#62)
## 0.4.3 (2020-01-11)
-- add throttling to stash tab scrolling (#50)
-- fix item type used as term (#48)
+- added throttling to stash tab scrolling (#50)
+- fixed item type used as term (#48)
## 0.4.2 (2020-01-11)
-- add item category as filter (#11, #39)
-- add prophecies item type base (#37)
-- add ctrl + scroll as stash tab change (#31)
-- add esc to close dialogs (#30)
-- add defaults to query toggle (#45)
-- add active window check (#10)
-- update global hotkeys to be passive (#10) thanks to @Calyx-
-- fix mods without values (#39)
+- added item category as filter (#11, #39)
+- added prophecies item type base (#37)
+- added ctrl + scroll as stash tab change (#31)
+- added esc to close dialogs (#30)
+- added defaults to query toggle (#45)
+- added active window check (#10)
+- updated global hotkeys to be passive (#10) thanks to @Calyx-
+- fixed mods without values (#39)
## 0.4.1 (2020-01-09)
-- add weapon dps, pdps and edps as filter
-- add map tier, item quantity, item rarity and monster pack size as filter (#26)
-- add influenced shaper, crusader, hunter, elder, redeemer and warlord as filter (#28)
-- add auto-select for: corrupted, item level > 80, gem level, map tier, quality if gem, influenced and sockets (#33)
-- add clipboard clear after item copying
-- update gem level parser (#34)
-- update base-item-types (#23, #25)
+- added weapon dps, pdps and edps as filter
+- added map tier, item quantity, item rarity and monster pack size as filter (#26)
+- added influenced shaper, crusader, hunter, elder, redeemer and warlord as filter (#28)
+- added auto-select for: corrupted, item level > 80, gem level, map tier, quality if gem, influenced and sockets (#33)
+- added clipboard clear after item copying
+- updated gem level parser (#34)
+- updated base-item-types (#23, #25)
## 0.4.0 (2020-01-08)
-- add offical poe trade api
-- add min, max, mode, mean and median to evaluate dialog (#9)
-- add item level to query (#12)
-- add gem level, gem experience to query (#8, #15)
-- add item quality to query (#8, #15)
-- add item corrupted to query (#8)
-- add already running check
-- add tray icon (exit, open settings) (#10)
-- add open settings keybinding and exit keybinding as user settings (#10)
-- add open search in external browser on CTRL + Click
-- add stats-id service maps text to id.
-- update base-item-types (#5)
-- update validation check for jewels and maps (#16)
-- remove poe.trade
+- added offical poe trade api
+- added min, max, mode, mean and median to evaluate dialog (#9)
+- added item level to query (#12)
+- added gem level, gem experience to query (#8, #15)
+- added item quality to query (#8, #15)
+- added item corrupted to query (#8)
+- added already running check
+- added tray icon (exit, open settings) (#10)
+- added open settings keybinding and exit keybinding as user settings (#10)
+- added open search in external browser on CTRL + Click
+- added stats-id service maps text to id.
+- updated base-item-types (#5)
+- updated validation check for jewels and maps (#16)
+- removed poe.trade
## 0.3.0 (2020-01-06)
-- add basic filters
-- add advanced search
-- add evaluate chart
-- add sockets to item frame
-- add custom shortcuts
-- add command module with /hideout /dnd
-- add feature settings to layout
-- add version check against latest github release
-- add user settings window cache for faster display times
-- update user settings as own window to mask focusable
-- update evaluate dialog to be draggable
+- added basic filters
+- added advanced search
+- added evaluate chart
+- added sockets to item frame
+- added custom shortcuts
+- added command module with /hideout /dnd
+- added feature settings to layout
+- added version check against latest github release
+- added user settings window cache for faster display times
+- updated user settings as own window to mask focusable
+- updated evaluate dialog to be draggable
## 0.2.0 (2020-01-03)
-- add favicon
-- add country specific trade api
-- add user settings dialog with league and language
-- add localforage to store user settings
-- add "client string", "words" and "base item type" from content.ggpk as service
-- add "stats-descriptions" to translate item mods
-- add "map" and "divination cards" translation support
-- add languages English, Portuguese, Russian, Thai, German, French, Spanish and Korean
-- update use translated item names for poe.trade
-- update theme based on poe color palette
+- added favicon
+- added country specific trade api
+- added user settings dialog with league and language
+- added localforage to store user settings
+- added "client string", "words" and "base item type" from content.ggpk as service
+- added "stats-descriptions" to translate item mods
+- added "map" and "divination cards" translation support
+- added languages English, Portuguese, Russian, Thai, German, French, Spanish and Korean
+- updated use translated item names for poe.trade
+- updated theme based on poe color palette
## 0.1.0 (2019-12-28)
-- add item evaluation
-- add currency conversion
-- add ingame search
+- added item evaluation
+- added currency conversion
+- added ingame search
diff --git a/README.md b/README.md
index 3f06fdd6..d96e7ce6 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,7 @@
![GitHub Release Date](https://img.shields.io/github/release-date/Kyusung4698/PoE-Overlay)
-# PoE Overlay 0.6.26
+# PoE Overlay 0.6.27
An Overlay for Path of Exile. The ***core aspect*** is to blend in with the game. Built with Electron and Angular.
@@ -74,11 +74,11 @@ These instructions will set you up to run and enjoy the overlay.
#### Installing
1. Head over to [Releases](https://github.com/Kyusung4698/PoE-Overlay/releases) and download one of the following files
- 1. `poe-overlay-Setup-0.6.26.exe` to install locally. This supports auto update/ auto launch.
- 2. `poe-overlay-0.6.26.exe` portable version. This does not support auto update/ auto launch.
+ 1. `poe-overlay-Setup-0.6.27.exe` to install locally. This supports auto update/ auto launch.
+ 2. `poe-overlay-0.6.27.exe` portable version. This does not support auto update/ auto launch.
2. Run either of your downloaded file
3. Start Path of Exile
-4. Wait until you can see `PoE Overlay 0.6.26` in the bottom left corner
+4. Wait until you can see `PoE Overlay 0.6.27` in the bottom left corner
5. Hit `f7` and set `Language` and `League` to meet your game settings
#### Shortcuts
diff --git a/package.json b/package.json
index f9f0febe..5bfb9623 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "poe-overlay",
- "version": "0.6.26",
+ "version": "0.6.27",
"private": true,
"description": "A Overlay for Path of Exile. Built with Electron and Angular.",
"main": "main.js",
diff --git a/src/app/data/poe/service/trade-http.service.ts b/src/app/data/poe/service/trade-http.service.ts
index 9c384b37..50de653a 100644
--- a/src/app/data/poe/service/trade-http.service.ts
+++ b/src/app/data/poe/service/trade-http.service.ts
@@ -153,6 +153,8 @@ export class TradeHttpService {
return throwError(response);
}
return this.browser.retrieve(url).pipe(delay(RETRY_DELAY));
+ case 429:
+ return throwError(response);
default:
return of(response).pipe(delay(RETRY_DELAY));
}
diff --git a/src/app/data/poe/service/trade-rate-limit.service.ts b/src/app/data/poe/service/trade-rate-limit.service.ts
index 2cbaf934..6f94e363 100644
--- a/src/app/data/poe/service/trade-rate-limit.service.ts
+++ b/src/app/data/poe/service/trade-rate-limit.service.ts
@@ -38,7 +38,11 @@ const HEADER_RULE_SEPARATOR = `,`
const HEADER_RULE_VALUE_SEPARATOR = `:`
const HEADER_RULE_STATE = `state`
const HEADER_RULES = `x-rate-limit-rules`;
-const THROTTLE_RETRY_DELAY = 1000;
+
+const RULE_FRESH_DURATION = 1000 * 10;
+
+const WAITING_RETRY_DELAY = 1000;
+const WAITING_RETRY_COUNT = 10;
interface TradeRateLimitRule {
count: number;
@@ -53,6 +57,14 @@ interface TradeRateLimitRequest {
interface TradeRateLimit {
requests: TradeRateLimitRequest[];
rules: TradeRateLimitRule[];
+ update: number;
+}
+
+enum TradeRateThrottle {
+ None = 1,
+ Stale = 2,
+ Reached = 3,
+ Limited = 4
}
@Injectable({
@@ -66,31 +78,46 @@ export class TradeRateLimitService {
public throttle(resource: string, getRequest: () => Observable>): Observable {
return of(null).pipe(
flatMap(() => {
- if (this.shouldThrottle(resource)) {
- return throwError('throttle');
+ const reason = this.shouldThrottle(resource);
+ switch (reason) {
+ case TradeRateThrottle.Limited:
+ return throwError('limited');
+ case TradeRateThrottle.Reached:
+ case TradeRateThrottle.Stale:
+ return throwError('waiting');
+ default:
+ const request = this.createRequest(resource);
+ return getRequest().pipe(
+ map(response => {
+ request.finished = Date.now();
+ this.updateRules(resource, response);
+ this.filterRequests(resource);
+ return response.body
+ }),
+ catchError(response => {
+ request.finished = Date.now();
+ if (response.status === 429) {
+ this.updateRules(resource, response);
+ }
+ this.filterRequests(resource);
+ return throwError(response);
+ })
+ );
}
- const request = this.createRequest(resource);
- return getRequest().pipe(
- map(response => {
- request.finished = Date.now();
- this.updateRules(resource, response);
- this.updateRequests(resource);
- return response.body
- }),
- catchError(response => {
- request.finished = Date.now();
- if (response.status === 429) {
- this.updateRules(resource, response);
- }
- this.updateRequests(resource);
- return throwError(response);
- })
- );
}),
retryWhen(errors => errors.pipe(
- flatMap(error => {
- if (error === 'throttle') {
- return of(error).pipe(delay(THROTTLE_RETRY_DELAY));
+ flatMap((error, count) => {
+ if (error === 'limited') {
+ return throwError({
+ status: 429
+ });
+ } else if (error === 'waiting') {
+ if (count >= WAITING_RETRY_COUNT) {
+ return throwError({
+ status: 429
+ });
+ }
+ return of(error).pipe(delay(WAITING_RETRY_DELAY));
}
return throwError(error);
})
@@ -98,20 +125,29 @@ export class TradeRateLimitService {
);
}
- private shouldThrottle(resource: string): boolean {
- const { rules, requests } = this.getLimit(resource);
- if (!rules) {
- // only allow 1 request until rules are filled
- return requests.some(request => !request.finished);
+ private shouldThrottle(resource: string): TradeRateThrottle {
+ const { rules, requests, update } = this.getLimit(resource);
+
+ const inflight = requests.some(request => !request.finished);
+ if (!inflight) {
+ return TradeRateThrottle.None;
}
+ // only allow 1 request until
+ // > rules are filled
+ // > rules are fresh again
const now = Date.now();
- return rules.some(rule => {
- // throttle while limited is greater than now
- if (rule.limited && rule.limited > now) {
- return true;
- }
+ if (!rules || (now - update) > RULE_FRESH_DURATION) {
+ return TradeRateThrottle.Stale;
+ }
+ // only allow a new request if no rule is limited
+ const limited = rules.some(rule => rule.limited && rule.limited > now);
+ if (limited) {
+ return TradeRateThrottle.Limited;
+ }
+
+ const reached = rules.some(rule => {
// all requests which were made in the period count
const limit = now - rule.period * 1000;
const limiting = requests.filter(request => {
@@ -122,6 +158,10 @@ export class TradeRateLimitService {
});
return limiting.length >= rule.count;
});
+ if (reached) {
+ return TradeRateThrottle.Reached;
+ }
+ return TradeRateThrottle.None;
}
private createRequest(resource: string): TradeRateLimitRequest {
@@ -131,7 +171,7 @@ export class TradeRateLimitService {
return request;
}
- private updateRequests(resource: string): void {
+ private filterRequests(resource: string): void {
const limit = this.getLimit(resource);
const now = Date.now();
limit.requests = limit.requests.filter(request => {
@@ -146,47 +186,73 @@ export class TradeRateLimitService {
}
private updateRules(resource: string, response: HttpResponse): void {
- const limit = this.getLimit(resource);
+ const current = this.getLimit(resource);
+
const rules = response?.headers?.get(HEADER_RULES);
- if (rules) {
- limit.rules = rules.toLowerCase()
- .split(HEADER_RULE_SEPARATOR)
- .map(name => name.trim())
- .map(name => {
- const limits = response.headers.get(`${HEADER_RULE}-${name}`).split(HEADER_RULE_SEPARATOR);
- const states = response.headers.get(`${HEADER_RULE}-${name}-${HEADER_RULE_STATE}`).split(HEADER_RULE_SEPARATOR);
- if (limits.length === states.length) {
- return limits.map((_, index) => {
- const [count, period, timeoff] = limits[index].split(HEADER_RULE_VALUE_SEPARATOR).map(x => +x);
- const [currentCount, , currentTimeoff] = states[index].split(HEADER_RULE_VALUE_SEPARATOR).map(x => +x);
- let limited = currentTimeoff;
- if (limited <= 0 && currentCount > count) {
- limited = timeoff;
+ if (!rules) {
+ current.rules = undefined;
+ return;
+ }
+
+ const now = Date.now();
+
+ current.update = now;
+ current.rules = rules.toLowerCase()
+ .split(HEADER_RULE_SEPARATOR)
+ .map(name => name.trim())
+ .map(name => {
+ const limits = response.headers.get(`${HEADER_RULE}-${name}`).split(HEADER_RULE_SEPARATOR);
+ const states = response.headers.get(`${HEADER_RULE}-${name}-${HEADER_RULE_STATE}`).split(HEADER_RULE_SEPARATOR);
+ if (limits.length !== states.length) {
+ return undefined;
+ }
+
+ return limits.map((_, index) => {
+ const [count, period, timeoff] = limits[index].split(HEADER_RULE_VALUE_SEPARATOR).map(x => +x);
+ const [currentCount, , currentTimeoff] = states[index].split(HEADER_RULE_VALUE_SEPARATOR).map(x => +x);
+
+ let limited = currentTimeoff;
+ if (limited <= 0 && currentCount > count) {
+ limited = timeoff;
+ }
+
+ const rule: TradeRateLimitRule = {
+ count, period,
+ limited: limited > 0
+ ? now + limited * 1000
+ : undefined
+ };
+
+ if (!rule.limited) {
+ const limit = now - rule.period * 1000;
+ const limiting = current.requests.filter(request => {
+ if (!request.finished) {
+ return true;
}
- const rule: TradeRateLimitRule = {
- count, period,
- limited: limited > 0
- ? Date.now() + limited * 1000
- : undefined
- };
- return rule;
+ return request.finished >= limit;
});
- } else {
- return undefined;
+
+ let missing = currentCount - limiting.length;
+ while (missing > 0) {
+ current.requests.push({
+ finished: now,
+ });
+ --missing;
+ }
}
- })
- .reduce((a, b) => a.concat(b), [])
- .filter(rule => rule !== undefined);
- } else {
- limit.rules = undefined;
- }
+ return rule;
+ });
+ })
+ .reduce((a, b) => a.concat(b), [])
+ .filter(rule => rule !== undefined);
}
private getLimit(resource: string): TradeRateLimit {
if (!this.limits[resource]) {
this.limits[resource] = {
requests: [],
- rules: undefined
+ rules: undefined,
+ update: undefined
};
}
return this.limits[resource];
diff --git a/src/app/modules/evaluate/component/evaluate-search/evaluate-search.component.ts b/src/app/modules/evaluate/component/evaluate-search/evaluate-search.component.ts
index b5e81269..001dd3b4 100644
--- a/src/app/modules/evaluate/component/evaluate-search/evaluate-search.component.ts
+++ b/src/app/modules/evaluate/component/evaluate-search/evaluate-search.component.ts
@@ -56,13 +56,12 @@ export class EvaluateSearchComponent implements OnInit {
public ngOnInit(): void {
this.graph = this.settings.evaluateResultView === EvaluateResultView.Graph;
if (this.settings.evaluateQueryInitialSearch) {
- this.search(this.queryItem);
+ this.initSearch();
}
- this.registerSearchOnChange();
}
public onSearchClick(): void {
- this.search(this.queryItem);
+ this.initSearch();
}
public onCurrencyClick(event: MouseEvent): void {
@@ -105,6 +104,11 @@ export class EvaluateSearchComponent implements OnInit {
this.evaluateResult.next({ amount, currency });
}
+ private initSearch(): void {
+ this.search(this.queryItem);
+ this.registerSearchOnChange();
+ }
+
private registerSearchOnChange(): void {
let subscription: Subscription;
this.queryItemChange.pipe(
diff --git a/src/app/shared/module/poe/service/item/processor/item-damage-processor.service.ts b/src/app/shared/module/poe/service/item/processor/item-damage-processor.service.ts
index 074c52bf..5f23d45b 100644
--- a/src/app/shared/module/poe/service/item/processor/item-damage-processor.service.ts
+++ b/src/app/shared/module/poe/service/item/processor/item-damage-processor.service.ts
@@ -21,28 +21,33 @@ export class ItemDamageProcessorService {
}
const dps: ItemValue = {
- text: '',
- tier: {
- min: 0,
- max: 0
- }
+ text: '0',
+ value: 0
};
+ if (pdps?.tier) {
+ dps.tier = { min: 0, max: 0 }
+ }
+
+ [pdps, edps, cdps].forEach(range => {
+ if (!range) {
+ return;
+ }
- [pdps, edps, cdps].forEach(value => {
- if (value) {
- if (value.value) {
- dps.value = (dps.value || 0) + value.value;
- }
- dps.text = `${+dps.text + +value.text}`;
- if (value.tier) {
- dps.tier.min += value.tier.min;
- dps.tier.max += value.tier.max;
- } else {
- dps.tier.min += +value.text;
- dps.tier.max += +value.text;
- }
+ dps.text = `${+dps.text + +range.text}`;
+ dps.value += range.value;
+ if (!dps.tier) {
+ return;
+ }
+
+ if (range.tier) {
+ dps.tier.min += range.tier.min;
+ dps.tier.max += range.tier.max;
+ } else {
+ dps.tier.min += range.value;
+ dps.tier.max += range.value;
}
});
+ dps.text = `${Math.round(+dps.text * 10) / 10}`;
item.damage = { edps, pdps, dps };
}
@@ -53,20 +58,24 @@ export class ItemDamageProcessorService {
return undefined;
}
- const valueDamage = weaponPhysicalDamage.value.value || 0;
- const valueDps = this.addAps(weaponAttacksPerSecond, valueDamage);
- const textDamage = this.sum(weaponPhysicalDamage);
- const textDps = this.addAps(weaponAttacksPerSecond, textDamage);
+ const damage = this.sum(weaponPhysicalDamage);
+ const dps = this.addAps(weaponAttacksPerSecond, damage);
+
+ const range: ItemValue = {
+ text: `${dps}`, value: dps
+ };
- const value: ItemValue = {
- value: valueDps > 0 ? Math.round(valueDps * 10) / 10 : undefined,
- text: `${Math.round(textDps * 10) / 10}`,
- tier: {
- min: this.addAps(weaponAttacksPerSecond, weaponPhysicalDamage.value.tier.min),
- max: this.addAps(weaponAttacksPerSecond, weaponPhysicalDamage.value.tier.max),
+ const { value, tier } = weaponPhysicalDamage.value;
+ if (value) {
+ range.value = this.addAps(weaponAttacksPerSecond, value);
+ }
+ if (tier) {
+ range.tier = {
+ min: this.addAps(weaponAttacksPerSecond, tier.min),
+ max: this.addAps(weaponAttacksPerSecond, tier.max)
}
- };
- return value;
+ }
+ return range;
}
private calculateElementalDps(properties: ItemProperties): ItemValue {
@@ -79,7 +88,7 @@ export class ItemDamageProcessorService {
const dps = this.addAps(weaponAttacksPerSecond, totalDamage);
const value: ItemValue = {
- text: `${Math.round(dps * 10) / 10}`,
+ text: `${dps}`, value: dps
};
return value;
}
@@ -94,14 +103,15 @@ export class ItemDamageProcessorService {
const dps = this.addAps(weaponAttacksPerSecond, damage);
const value: ItemValue = {
- text: `${Math.round(dps * 10) / 10}`,
+ text: `${dps}`, value: dps
};
return value;
}
private addAps(prop: ItemValueProperty, damage: number): number {
const aps = prop ? +prop.value.text : 1;
- return damage * 0.5 * aps;
+ const dps = damage * 0.5 * aps;
+ return Math.round(dps * 10) / 10;
}
private sum(prop: ItemValueProperty, sum: number = 0): number {
diff --git a/src/app/shared/module/poe/service/item/processor/item-quality-processor.service.ts b/src/app/shared/module/poe/service/item/processor/item-quality-processor.service.ts
index 06b6a850..2b41c563 100644
--- a/src/app/shared/module/poe/service/item/processor/item-quality-processor.service.ts
+++ b/src/app/shared/module/poe/service/item/processor/item-quality-processor.service.ts
@@ -27,7 +27,7 @@ export class ItemQualityProcessorService {
'local_armour_and_energy_shield_+%',
'local_armour_and_evasion_+%',
'local_armour_and_evasion_and_energy_shield_+%');
- this.calculateTier(armourArmour, quality, increasedQuality, increasedArmour, normalizeQuality);
+ this.calculateQualityTier(armourArmour, quality, increasedQuality, increasedArmour, normalizeQuality);
}
const { armourEnergyShield } = properties;
@@ -36,7 +36,7 @@ export class ItemQualityProcessorService {
'local_energy_shield_+%',
'local_armour_and_energy_shield_+%',
'local_armour_and_evasion_and_energy_shield_+%');
- this.calculateTier(armourEnergyShield, quality, increasedQuality, increasedEnergyShield, normalizeQuality);
+ this.calculateQualityTier(armourEnergyShield, quality, increasedQuality, increasedEnergyShield, normalizeQuality);
}
const { armourEvasionRating } = properties;
@@ -45,14 +45,14 @@ export class ItemQualityProcessorService {
'local_evasion_rating_+%',
'local_armour_and_evasion_+%',
'local_armour_and_evasion_and_energy_shield_+%');
- this.calculateTier(armourEvasionRating, quality, increasedQuality, increasedEvasionRating, normalizeQuality);
+ this.calculateQualityTier(armourEvasionRating, quality, increasedQuality, increasedEvasionRating, normalizeQuality);
}
const { weaponPhysicalDamage } = properties;
if (weaponPhysicalDamage) {
const increasedPhysicalDamage = this.calculateModifier(stats,
'local_physical_damage_+% local_weapon_no_physical_damage');
- this.calculateTier(weaponPhysicalDamage, quality, increasedQuality, increasedPhysicalDamage, normalizeQuality)
+ this.calculateQualityTier(weaponPhysicalDamage, quality, increasedQuality, increasedPhysicalDamage, normalizeQuality)
}
}
@@ -64,24 +64,22 @@ export class ItemQualityProcessorService {
.reduce((a, b) => a + b, 0);
}
- private calculateTier(
+ private calculateQualityTier(
property: ItemValueProperty, quality: number,
increasedQuality: number, modifier: number,
normalizeQuality: boolean): void {
const value = this.parseValue(property.value.text);
- const min = value / (1 + ((quality + modifier) / 100));
- const max = min * (1 + ((Math.max(quality, QUALITY_MAX + increasedQuality) + modifier) / 100));
+ const base = value / (1 + ((quality + modifier) / 100));
+ const min = base * (1 + (modifier / 100));
+ const max = base * (1 + ((Math.max(quality, QUALITY_MAX + increasedQuality) + modifier) / 100));
if (normalizeQuality) {
- const normalized = min * (1 + ((QUALITY_MAX + modifier) / 100));
- property.value.value = Math.round(normalized * 100) / 100;
+ const normalized = base * (1 + ((QUALITY_MAX + modifier) / 100));
+ property.value.value = normalized;
}
- property.value.tier = {
- min: Math.round(min),
- max: Math.round(max)
- };
+ property.value.tier = { min, max };
}
private parseValue(text: string): number {