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) Become a Patron -# 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 {