GithubHelp home page GithubHelp logo

goldenchrysus / ffxiv-ember-overlay Goto Github PK

View Code? Open in Web Editor NEW
142.0 5.0 31.0 114.21 MB

Powerful, data-focused DPS overlay and spell timers for Final Fantasy XIV (FFXIV). Can be used with the OverlayPlugin and ACTWebSocket plugins for Advanced Combat Tracker (ACT). Updated for Dawntrail.

License: GNU General Public License v3.0

HTML 0.48% CSS 0.14% JavaScript 73.78% Less 20.65% Python 4.92% Shell 0.04%
ffxiv-overlays ffxiv-act ffxiv overlayplugin overlayplugin-skin actwebsocket act spell-timers endwalker ember

ffxiv-ember-overlay's Introduction

ffxiv-ember-overlay's People

Contributors

epitts11 avatar goldenchrysus avatar justscribe avatar okuraku avatar shadywhite avatar x04ty29er avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

ffxiv-ember-overlay's Issues

Spell timers 'latest changes' overlay while on different unconfigured jobs

Describe the bug
Spell timer is setup for GBN only and anytime I'm on another job I get this overlay that is 100% in the way and unable to be dismissed with out first swapping to GBN then back to another job. This only happens if I start ACT while not on GBN.

Reproduction steps

  1. Set up Spell Timers for GBN and have the overlay in a lower section of your display
  2. Don't setup Spell Timers for any other job
  3. Get 'latest changes' covering the area where you previously had put your Spell Timer window when starting ACT while not on GBN.

Expected behavior
No overlay or anything when on a different job that has not been configured with Spell Timers. If I need to see latest changes then come here or go to the 'About' section in the settings panel.

Screenshots
image

Settings data

"{"intrinsic":{"table_type":"dps","collapsed":false,"current_version":"1.0.0","last_version":"0.0.0","player_blur":false},"interface":{"player_name":"YOU","opacity":100,"zoom":100,"text_scale":100,"top_right_rank":false,"blur_job_icons":false,"collapse_down":false,"theme":"ffxiv-dark","minimal_theme":false,"horizontal":false,"horizontal_shrink":false,"horizontal_alignment":"left","footer_when_collapsed":false,"footer_dps":false,"hide_top_bar":true,"decimal_accuracy":2,"shorten_thousands":false,"language":"en","auto_hide":false,"auto_hide_delay":0,"display_job_names":false},"custom":{"css":"","metric_names":{}},"tts":{"language":"en","rules":{"critical_hp":{"tank":0,"heal":0,"dps":0,"all":0},"critical_mp":{"tank":0,"heal":0,"dps":0,"all":0},"top":{"dps":false,"hps":false,"tps":false},"aggro":false,"encounter":{"start":false,"end":false}}},"table_settings":{"general":{"table":{"short_names":"no_short","footer_at_top":false,"percent_bars":true,"prioritize_party":false},"raid":{"short_names":"no_short","percent_bars":true,"prioritize_party":false}},"dps":{"show_footer":true},"heal":{"show_footer":true},"tank":{"show_footer":true}},"table_columns":{"dps":["damage%","encdps","crithit%","DirectHitPct","CritDirectHitPct"],"heal":["healed%","effective_heal_pct","enchps","effective_hps","OverHealPct","critheal%"],"tank":["damage_taken_pct","enctps","damagetaken","healstaken","BlockPct","ParryPct","deaths"],"raid":{"dps":["encdps","enchps"],"heal":["enchps","encdps"],"tank":["encdps","enchps"]}},"sort_columns":{"dps":"damage","heal":"healed","tank":"damagetaken","raid":"damage"},"detail_data":{"dps":["damage%","encdps","damage","crithit%","DirectHitPct","CritDirectHitPct","max_hit_format"],"heal":["healed%","effective_heal_pct","enchps","effective_hps","healed","OverHealPct","critheal%","max_heal_format"],"tank":["damage_taken_pct","damagetaken","enctps","healstaken","BlockPct","deaths"]},"discord":{"url":""},"spells_mode":{"spells":["16138","16146","16165","16164"],"effects":["1831"],"dots":["1837","1838"],"debuffs":[],"party_spells":[],"party_effects":[],"party_dots":[],"party_debuffs":[],"reverse_skill":false,"reverse_effect":false,"reverse_dot":false,"reverse_debuff":false,"party_reverse_skill":false,"party_reverse_effect":false,"party_reverse_dot":false,"party_reverse_debuff":false,"always_skill":true,"always_effect":true,"always_dot":false,"always_debuff":false,"warning_threshold":2,"spells_per_row":4,"show_icon":true,"use_tts":false,"party_use_tts":false,"tts_on_effect":false,"party_tts_on_skill":false,"party_tts_on_effect":false,"party_zones":[],"tts_trigger":"zero","minimal_layout":false,"invert_vertical":false,"invert_horizontal":false,"designer":{"skill":{"warning":true,"indicator":"ticking","cooldown_bottom_left":false},"effect":{"border":false,"warning":true,"indicator":"ticking","cooldown_bottom_left":false},"dot":{"border":false,"warning":true,"indicator":"ticking","cooldown_bottom_left":false},"debuff":{"border":false,"warning":true,"indicator":"ticking","cooldown_bottom_left":false},"general":{"show_hover_names":false}},"ui":{"use":false,"sections":{}},"layout":"icon","always_skill_static":true,"always_effect_static":true}}"

Performance and organizational refactor

  • Abstract PluginService.js and SocketService.js s.t. PluginService is the master class which calls SocketService, OverlayPluginService, and OverlayProcService as needed.

    • Also should prevent SocketService and PluginService (JS event handlers) running simultaneously on a Web socket connection -- the overlay should rely on the socket connection to succeed or fail to receive data.
    • Should have an unsubscribe method that removes any existing subscriptions to now-unused events if the user changes their settings
  • Add class UsageService.js which performs checks on whether the user is using certain features

    • This should always have the current state passed to it rather than looking up the current state on its own
  • Don't subscribe to EnmityTargetData if user is not using enmity metrics

  • Don't calculate max DPS if user is not using max DPS metrics

  • Upon saving settings, reprocess the necessary event subscriptions and unsubscribe from anything no longer in use

Let Auto-Hide collapse to corner instead of making the overlay invisible

Describe the feature you'd like
Right now, using Auto-Hide will hide the overlay completely, making it difficult to restore the overlay manually. Offering an option to let Auto-Hide collapse to one of the 4 corners instead, will improve the feature by allowing another use case.

Is your feature request related to a problem? Please describe.
I would like to use the Auto-Hide feature without losing the ability to make the overlay visible before entering combat.

Describe alternatives you've considered
Manually collapse/expand the overlay whenever I want to see it.

Add text-to-speech (TTS) alerts

  • Can execute TTS action in OverlayPlugin by calling handler with call property set to "say" and text property set to TTS text or an array of text items

  • Probably need to limit to certain TTS invocations within a certain number of seconds, to avoid scenarios like eight TTS invocations occurring simultaneously in Seat of Sacrifice after first raid-wide

  • Available conditions:

    • Tank is below % HP
    • DPS is below % HP
    • Healer is below % HP
    • Any combatant is below % HP
    • Current player obtains aggro
    • Current player obtains top DPS
    • Encounter ends
    • Encounter begins

Should Block % instead be Parry %?

I just assumed block % was meant to be parry %, but I've been using this overlay for several months and block % has never changed from 0%. I don't see a parry % option in the settings, is there any way you could add that stat to the overlay?

Add "Import from OverlayPlugin" button and improve import feedback

  • Add migration that saves current settings export key in OverlayPlugin data storage
    • This should only run for overlays inside of OverlayPlugin, not Web socket overlays (can run for Web socket overlays running inside of OverlayPlugin)
  • On Import screen, display button with text "Import from OverlayPlugin" if following conditions are met:
    • Detected OverlayPlugin author is ngld
    • Overlay is running on Web socket
  • Settings save should always write export key to OverlayPlugin data storage
    • Same conditions as migration
  • OverlayPlugin data key should always include the current environment (development, staging, production) in the key
  • "Import from OverlayPlugin" action should only pull from the data key related to its environment
    • Prevents settings structures incompatible with an overlay's current version being imported in mismatching environments
  • Upon overlay load, after migrations but before render, check if the current settings were empty (or reverted to default) and if OverlayPlugin has a backup of the settings under the relevant key
    • Settings.js data class should resolve information in loadSettings() that indicates if settings had to be reverted to default
    • For scenarios where a user is instructed to delete their plugin cache folder for debugging reasons
    • Should silently restore the backed up settings and re-save them in the cache

  • Data can be saved to OverlayPlugin storage with call property set to saveData, key property set to chosen data key, and data set to the data to save (export key)
  • Data can be retrieved from OverlayPlugin storage with call property set to loadData and key property set to chosen data key

  • Both the new "Import from OverlayPlugin" and existing "Import" button should have the following feedback states:
    • Default: both buttons are clickable
    • In progress: a button has been clicked; both buttons are disabled; clicked button displays text "Importing..."
    • Failure: an import has failed; both buttons are disabled; clicked button displays "Import has failed..." for four seconds before both buttons reset to default state
    • Success: an import has succeeded; both buttons are disabled; clicked button displays "Imported!" for four seconds before both buttons reset to default state

Spell timer for tincture

Describe the feature you'd like
Simply put, a spell timer for tinctures. If this is already a feature, I'm not seeing it. I've tried googling for assistance, no results coming up.

Thank you for your time.

Configure settings from URL parameter

Thank you for taking a look at PR #19 earlier today. I followed the documented contributing process and I wasn't aware there I had to consult beforehand, so I apologize for that. I don't mind if this turns out to be wasted work: it was very little work for me in the first place.

I do want to address some of your comments to see if I could clarify the story around this particular FR.

tl;dr: This would be nice to have, but there's a reasonable workaround with persistent storage in the OBS BrowserSource plugin.

there is no way to provide a user with a valid URL as there is no way to know what host/port they are using

The socket service in ember works already with ACT with the HOST_PORT parameter. This parameter is obtained from the ACT-websocket plugin address, and so is expected to be user-provided.

and instructing users to add a &settings querystring parameter while maintaining the WSServer-generated URL and not breaking the hash routing

For example, running this with the local development environment (with the ACT websocket port open on 10501) gives a URL of

http://localhost:3000/?HOST_PORT=ws://127.0.0.1:10501/&settings=<the_settings>

which works correctly with the hash routing. This gives a hash URL of

http://localhost:3000/&HOST_PORT=ws://127.0.0.1:10501&settings=<the_settings>#/

No special handling is needed, and when I clicked around, everything seemed to work correctly. (Of course I could have missed something.)

would be far more trouble for 99% of users than just copying and pasting the settings key.

Apart from everything else said above, I do agree with you on this particular topic: This "power user" feature has the possibility to be confusing and complex.

I was wrong about OBS BrowserSource plugin not having persistent storage because it in fact does have persistent local storage. (There was a configuration error on my part that obscured this feature.) However, the interaction feature in OBS is quite limited and hard to use, and the settings panel doesn't work, so a user needs to configure ember first with the vanilla overlay plugin, and then transfer the settings key over.

Other downsides:

  1. The URL becomes confusingly long.

  2. The behavior of modifying settings with is not obvious: modifying the settings will persist them, but reloading the URL with the settings parameter will revert to the provided settings.

(1) is a cosmetic issue, but potentially not a big deal since the URL is not exposed, unless you are also giving out the ACT-websocket address to others. This can be addressed by rewriting the URL to omit the session parameter.

(2) can potentially also be addressed in the same way by rewriting the URL.

Thank you again for considering this change!

Minimize to icon after combat

Hi,

Thanks for creating such an amazing overlay!

I really like the feature of minimizing to a small icon, but I noticed that I need to manually minimize it after the fight.

Could you add a feature that the overlay can minimize to icon after combat? It would be even better if we can select which corner to automatically minimize to.

Thanks!

Log error message

Today I noticed in ACT logs that ember overlay is giving me some error messages. However, everything seems to work normally. I tried to look for a solution on a webpage mentioned in the logs, but it didn't give me any specific answer. Everything is updated in my ACT. OverlayPlugin loads right after main FFXIV ACT plugin.
The error message I get in my logs is as stated below:

Info: Ember: BrowserConsole: Uncaught Error: Minified Redux error #3; visit https://redux.js.org/Errors?code=3 for the full message or use the non-minified dev environment for full errors. (Source: https://goldenchrysus.github.io/ffxiv/ember-overlay/static/js/2.6ab47099.chunk.js, Line: 1)

Adding a screenshot as well. Thank you
image

Feature request: Automatic Resizing

Describe the feature you'd like
I'd love if the overlay would automatically resize its height (up to a maximum)

Is your feature request related to a problem? Please describe.
No

Describe alternatives you've considered
Custom CSS:

#root {
  height: auto;
}
#container #inner #content {
  font-size: 20px;
  max-height: calc(12em + 0.9em);
}

This sets a max height that shows 12 display rows plus the shorter header before the inner container becomes scrollable. Of course, this is not for the timers feature & probably won't work properly there :)

Add encounter history

Up to five past encounters will be stored in localForage so they can be reviewed later within the overlay. User can access past encounters through an icon in the bottom right of the overlay that shows previous encounters. Previous encounter selector should be probably be a modal or some sort of slide-out menu -- avoid opening a new window to select encounters. Once clicking an encounter, the data in the overlay will be replaced by that encounter.

To avoid intense processor usage, encounter history should be keyed per encounter in localForage. i.e. rather than storing the full encounter history under one localForage key (e.g. encounter_history), each encounter will be stored independently (e.g. encounter_history_entry_0). There will also be a separate entry (e.g. encounter_history_metadata) that stores encounter info (duration, zone, name, localForage key, etc.) so that each encounter doesn't need to be loaded just to get basic info about it.

An encounter going inactive should prep the system for adding the next encounter. When the overlay starts, when an encounter is detected as ended, or when the user splits the encounter, a flag should be set indicating that a new encounter history entry needs to be made. This pushes the encounter into the encounter_history_entry_0 key and moves any existing entries down by one key (e.g. the previous encounter_history_entry_0 becomes encounter_history_entry_1) and updates the metadata record. If there are already five encounters in localForage, the fifth (oldest) encounter is deleted.

An encounter record needs to store the ending general encounter data (the dump received from ACT) as well as the Ember-built encounter history so that the graphs are usable when viewing the history.

If the system receives a new or updated encounter while a user is viewing an old encounter, overlay should immediately switch back to live mode and display the live encounter.

Add settings system

Will be located via HashRouter at /#/settings.

File structure will probably be:

  • /src/controllers/SettingsController.js
    • This will handle user inputs from the settings interface
  • /src/data/Settings.js
    • Processes JSON data from existing settings cache
    • Sets/fetches settings
    • Exports settings to JSON when needed for caching
  • /src/components/Settings.js
    • Base interface component for settings; will obviously need several subcomponents
      • Subcomponents will be at /src/components/Settings/*
  • /src/constants/SettingsSchema.js or in /src/constants/index.js
    • Will store the exact interface schema for settings so it can be generated dynamically rather than hard-coding every UI element
      • e.g. Main sections (Interface, Player Table, Player Detail, CSS)
        • Title
        • Subsections (don't know yet)
          • Title
          • Settings
            • Setting key
            • Name
            • UI element type
            • Possible values (this can be a function that returns values)
            • Help info
    • Ideal but not required

Settings should be stored in localForage.

Will need a booter class to handle initialization of the app, otherwise components will mount before the localForage promise resolves, creating state conflicts and setting loss.

Need to reorganize various internal store items such as detail_player, game, character_name, overlayplugin etc. These will not persist across sessions, so should be reorganized under something like internal. These items may change between sessions, as the encounter won't be the same, the character may be different, and the user may be using a different overlay plugin.

Store items that will persist across sessions but are not explicit settings, such as viewing, table_type, collapsed, etc. should be included in the settings data set, as they are implicit settings not directly controlled through the main settings interface but are still otherwise decided by the user. This will ensure the overlay opens in the same state it was closed in. The minimized state, however, should be persist being sessions.

The following need to be installed:

  • Semantic UI
    • Will handle most interface elements of the settings UI
    • Will not handle interface elements in the existing overlay
      • For this reason, Semantic CSS may need to be kept separate from the main overlay CSS and ensure it only loads on the correct components
      • However, we can utilize the LESS system in the existing CSS to theme interface elements consistently across multiple UI's
  • localForage
    • To store settings data without worrying about constraints of localstorage.
  • jQuery UI
    • Need only the slider element for transparency selection in settings
      • Wrap this in a React component and utilize mounting events for instantiation and state management

Add metric renaming

Add ability to manually change the long name and short name of metrics. This would affect how the metrics appear across the entire system (both the settings and overlay).

Probably a new tab within the settings menu. Should be a table with no entries by default and a button to add new entries. This allows only renaming specific metrics so that we are not forced to save the name for every metric even if the user did not change it (which would prevent translations from working).

Each row will have a dropdown with the official metric name (long version), and input for the long name, and an input for the abbreviated name.

The service that fetches a metric's name should prioritize custom metric names first and then fall back to the existing localized metric names.

Currently, this will not be locale-specific, so metrics will affect all available locales.

UI Designer doesn't seem to work with the Party Spell Timers

I have setup some party spell timers for most raid buffs, and then added a new section to the UI builder which I thought was gonna work for that, but sadly nothing seems in the section I created for that. I have added section with DPS: Buff, DPS: Spell, Healer: Buff, Healer: Spell, and nothing seems to show up. I have also created a section with each of the class/jobs and still nothing seems to appear.

Side note, it would seem Summoner's Devotion is missing from the party spell list

New class colors

The backgrounds on the DPS meter for the two new classes are a different shade of red than what is implemented for the previous DPS classes. Would like a way to adjust them/fix them. Not a major issue. I would just enjoy the uniformity.

Feature Request: Have TTS say what type of call-out it is giving on an expired timer

I think the TTS feature in spell timer mode rules. I think it'd be significantly more useful if you could have the TTS preface each of its call-outs by saying what type it is.

Examples:

  • Instead of "Power Surge", it could say "Buff: Power Surge".
  • Instead of "Swiftcast", it could say "Spell: Swiftcast".
  • Instead of just "Combust", it could say "Dot: Combust" or even just "Dot", perhaps depending on user input.

Incorrect cooldowns after traits

Edited to correct inaccuracies of level acquisition

Describe the bug
A clear and concise description of what the bug is.

Hissatsu: Senei ad Hissatsu: Guren continue to display a 120s cooldown in the spell timers, despite the level 94 trait that reduces its cooldown to 60s. Furthermore, Manafont continues to display a cooldown of 120s despite the level 84 trait that reduces it to 100s.

Reproduction steps
Exact steps, both in Ember and within FFXIV, to reproduce the behavior:

  1. Add Manafont, Hissatsu: Guren and Hissatsu: Senei to Ember Spell Timers
  2. Job change to Samurai at level 94 or above
  3. Build 25 kenki and cast 'Hissatsu:Senei' or 'Hissatsu: Guren' in game
  4. Job change to Black Mage at level 84 for above
  5. Use a fire spell and cast Manafont
    Expected behavior
    A clear and concise description of what you expected to happen.

Recast times of Hissatsu: Senei and Manafont should match their level 100 recast. Alternatively, it matches recast only with the trait enabled.

Screenshots
If applicable, add screenshots to help explain the issue.

image

image

Settings data
Paste your settings data below. This can be found at ACT > Plugins > OverlayPlugin.dll > (select overlay) > Open DevTools > Application > IndexedDB > localforage > keyvaluepairs > (copy the entire value for settings_cache). Replace any sensitive information (such as a webhook URL) with the word "redacted".

"{"intrinsic":{"table_type":"dps","collapsed":false,"current_version":"1.4.0","last_version":"0.0.0","player_blur":false},"interface":{"player_name":"YOU","opacity":100,"zoom":203,"text_scale":100,"top_right_rank":false,"blur_job_icons":false,"collapse_down":false,"theme":"ffxiv-dark","minimal_theme":false,"horizontal":false,"horizontal_shrink":false,"horizontal_alignment":"left","footer_when_collapsed":false,"footer_dps":false,"hide_top_bar":false,"decimal_accuracy":2,"shorten_thousands":false,"language":"en","auto_hide":"disabled","auto_hide_delay":0,"display_job_names":false},"custom":{"css":"","metric_names":{}},"tts":{"language":"en","rules":{"critical_hp":{"tank":0,"heal":0,"dps":0,"all":0},"critical_mp":{"tank":0,"heal":0,"dps":0,"all":0},"top":{"dps":false,"hps":false,"tps":false},"aggro":false,"encounter":{"start":false,"end":false}}},"table_settings":{"general":{"table":{"short_names":"no_short","footer_at_top":false,"percent_bars":true,"prioritize_party":false},"raid":{"short_names":"no_short","percent_bars":true,"prioritize_party":false}},"dps":{"show_footer":true},"heal":{"show_footer":true},"tank":{"show_footer":true}},"table_columns":{"dps":["damage%","encdps","crithit%","DirectHitPct","CritDirectHitPct"],"heal":["healed%","effective_heal_pct","enchps","effective_hps","OverHealPct","critheal%"],"tank":["damage_taken_pct","enctps","damagetaken","healstaken","BlockPct","ParryPct","deaths"],"raid":{"dps":["encdps","enchps"],"heal":["enchps","encdps"],"tank":["encdps","enchps"]}},"sort_columns":{"dps":"damage","heal":"healed","tank":"damagetaken","raid":"damage"},"detail_data":{"dps":["damage%","encdps","damage","crithit%","DirectHitPct","CritDirectHitPct","max_hit_format"],"heal":["healed%","effective_heal_pct","enchps","effective_hps","healed","OverHealPct","critheal%","max_heal_format"],"tank":["damage_taken_pct","damagetaken","enctps","healstaken","BlockPct","deaths"]},"discord":{"url":"","metrics":["encdps","enchps"],"sort":"damage"},"spells_mode":{"spells":["3625","7390","29056","29054","25801","2248","16138","29105","7520","3557","16493","2264","20","7383","7395","7396","16552","158","24405","29552","29659","34647","36957","16481"],"effects":["3248"],"dots":[],"debuffs":[],"party_spells":[],"party_effects":[],"party_dots":[],"party_debuffs":[],"reverse_skill":false,"reverse_effect":false,"reverse_dot":false,"reverse_debuff":false,"party_reverse_skill":false,"party_reverse_effect":false,"party_reverse_dot":false,"party_reverse_debuff":false,"always_skill":false,"always_effect":false,"always_dot":false,"always_debuff":false,"warning_threshold":2,"spells_per_row":2,"show_icon":true,"use_tts":false,"party_use_tts":false,"tts_on_effect":false,"party_tts_on_skill":false,"party_tts_on_effect":false,"party_zones":[],"tts_trigger":"zero","minimal_layout":false,"invert_vertical":true,"invert_horizontal":true,"designer":{"skill":{"warning":true,"indicator":"ticking","cooldown_bottom_left":false},"effect":{"border":false,"warning":true,"indicator":"ticking","cooldown_bottom_left":false},"dot":{"border":false,"warning":true,"indicator":"ticking","cooldown_bottom_left":false},"debuff":{"border":false,"warning":true,"indicator":"ticking","cooldown_bottom_left":false},"general":{"show_hover_names":false}},"ui":{"use":true,"sections":{"652d144d-5147-45a6-874a-d5322aa9cbc3":{"types":["you-skill"],"layout":{"x":900,"y":500,"width":100,"height":100,"layout":"default","spells_per_row":-1}},"3282834d-27d0-4eda-be35-993885e20036":{"types":["you-effect"],"layout":{"x":660,"y":490,"width":100,"height":100,"layout":"default","spells_per_row":-1}}}},"layout":"icon"}}"

Add buttons to copy/paste settings data

Copying/pasting the settings data (Settings > Export) may be difficult for some users due to older Chrome versions (OverlayPlugin 0.3.4.0) or questionable FFXIV key bindings (ctrl+V).

Can add a button in the import menu (right-click > Import) called "Paste from Clipboard" which focuses the import text box and runs document.execCommand("paste"). Import button remains as-is. These should remain as separate buttons, as someone accidentally pasting the wrong information would wipe their entire setup if this process was combined into a single button.

Rename "Select All" button in export menu (Settings > Export) to "Copy Settings" which focuses the export text box, runs the existing select-all logic, then runs document.execCommand("copy").

Should ensure this works in major browsers: Chrome (45 to latest), Firefox (latest), Android Chrome (latest), and OBS (latest).

VPR Noxious Gnash not being tracked via Display Permanently

Describe the bug
The VPR debuff Noxious Gnash timer does not display when not applied but Display Permanently is ticked. It tracks the debuff correctly while it's applied. RPR's Death's Design works as expected.

Reproduction steps
Exact steps, both in Ember and within FFXIV, to reproduce the behavior:

  1. Track Noxious Gnash Debuff
  2. Click Display Permanently for Debuffs
  3. Enter combat with VPR.
  4. No Noxious Gnash timer
  5. Apply Noxious Gnash, wait for timer to run out.
  6. Noxious Gnash disappears again.

Settings data

"{\"intrinsic\":{\"table_type\":\"dps\",\"collapsed\":true,\"current_version\":\"1.9.2\",\"last_version\":\"1.9.1\",\"player_blur\":false},\"interface\":{\"player_name\":\"YOU\",\"opacity\":100,\"zoom\":100,\"text_scale\":100,\"top_right_rank\":true,\"blur_job_icons\":false,\"collapse_down\":true,\"theme\":\"ffxiv-dark\",\"minimal_theme\":true,\"horizontal\":false,\"horizontal_shrink\":false,\"horizontal_alignment\":\"left\",\"footer_when_collapsed\":false,\"footer_dps\":true,\"hide_top_bar\":true,\"decimal_accuracy\":null,\"shorten_thousands\":false,\"language\":\"en\",\"auto_hide\":\"disabled\",\"auto_hide_delay\":300,\"display_job_names\":false},\"custom\":{\"css\":null,\"metric_names\":{}},\"tts\":{\"language\":\"en\",\"rules\":{\"critical_hp\":{\"tank\":0,\"heal\":0,\"dps\":0,\"all\":0},\"critical_mp\":{\"tank\":0,\"heal\":0,\"dps\":0,\"all\":0},\"top\":{\"dps\":false,\"hps\":false,\"tps\":false},\"aggro\":false,\"encounter\":{\"start\":false,\"end\":false}}},\"table_settings\":{\"general\":{\"table\":{\"short_names\":\"no_short\",\"footer_at_top\":true,\"percent_bars\":true,\"prioritize_party\":false},\"raid\":{\"short_names\":\"no_short\",\"percent_bars\":true,\"prioritize_party\":false}},\"dps\":{\"show_footer\":false},\"heal\":{\"show_footer\":false},\"tank\":{\"show_footer\":false}},\"table_columns\":{\"dps\":[\"damage%\",\"encdps\",\"crithit%\",\"DirectHitPct\",\"CritDirectHitPct\"],\"heal\":[\"healed%\",\"effective_heal_pct\",\"enchps\",\"effective_hps\",\"OverHealPct\",\"critheal%\"],\"tank\":[\"damage_taken_pct\",\"enctps\",\"damagetaken\",\"healstaken\",\"BlockPct\",\"ParryPct\",\"deaths\"],\"raid\":{\"dps\":[\"encdps\",\"enchps\"],\"heal\":[\"enchps\",\"encdps\"],\"tank\":[\"encdps\",\"enchps\"]}},\"sort_columns\":{\"dps\":\"damage\",\"heal\":\"healed\",\"tank\":\"damagetaken\",\"raid\":\"damage\"},\"detail_data\":{\"dps\":[\"damage%\",\"encdps\",\"damage\",\"crithit%\",\"DirectHitPct\",\"CritDirectHitPct\",\"max_hit_format\"],\"heal\":[\"healed%\",\"effective_heal_pct\",\"enchps\",\"effective_hps\",\"healed\",\"OverHealPct\",\"critheal%\",\"max_heal_format\"],\"tank\":[\"damage_taken_pct\",\"damagetaken\",\"enctps\",\"healstaken\",\"BlockPct\",\"deaths\"]},\"discord\":{\"url\":\"\",\"metrics\":[\"encdps\",\"enchps\"],\"sort\":\"damage\"},\"spells_mode\":{\"spells\":[\"7443\"],\"effects\":[],\"dots\":[\"163\",\"1871\",\"2616\",\"1881\"],\"debuffs\":[\"2586\",\"3667\"],\"party_spells\":[],\"party_effects\":[],\"party_dots\":[],\"party_debuffs\":[],\"reverse_skill\":false,\"reverse_effect\":false,\"reverse_dot\":false,\"reverse_debuff\":false,\"party_reverse_skill\":false,\"party_reverse_effect\":false,\"party_reverse_dot\":false,\"party_reverse_debuff\":false,\"always_skill\":true,\"always_effect\":false,\"always_dot\":true,\"always_debuff\":true,\"warning_threshold\":6,\"spells_per_row\":1,\"show_icon\":true,\"use_tts\":false,\"party_use_tts\":false,\"tts_on_effect\":false,\"party_tts_on_skill\":false,\"party_tts_on_effect\":false,\"party_zones\":[],\"tts_trigger\":\"zero\",\"minimal_layout\":false,\"invert_vertical\":false,\"invert_horizontal\":false,\"designer\":{\"skill\":{\"warning\":true,\"indicator\":\"ticking\",\"cooldown_bottom_left\":false},\"effect\":{\"border\":false,\"warning\":true,\"indicator\":\"ticking\",\"cooldown_bottom_left\":false},\"dot\":{\"border\":true,\"warning\":true,\"indicator\":\"ticking\",\"cooldown_bottom_left\":false},\"debuff\":{\"border\":false,\"warning\":true,\"indicator\":\"ticking\",\"cooldown_bottom_left\":false},\"general\":{\"show_hover_names\":false}},\"ui\":{\"use\":false,\"sections\":{}},\"layout\":\"normal\",\"always_dot_static\":true,\"always_debuff_static\":true}}"

Allow No More Than One Settings Window

Describe the bug
Currently, the user can open multiple settings windows.

Reproduction steps
Exact steps, both in Ember and within FFXIV, to reproduce the behavior:

  1. Open the settings.
  2. Without closing the settings window, open the settings again.

Expected behavior
If a settings window is already open, then another one shouldn't be opened. Ideally, focus should be moved to the already opened window.

Screenshots
image

Settings data
Paste your settings data below. This can be found at ACT > Plugins > OverlayPlugin.dll > (select overlay) > Open DevTools > Application > IndexedDB > localforage > keyvaluepairs > (copy the entire value for settings_cache). Replace any sensitive information (such as a webhook URL) with the word "redacted".

Not applicable

Add 24-person view

Probably need to show:

  • Job icon
  • Name
  • DPS
  • HPS

Four players per row? Names will need to cut off with ellipses.

A few requests if possible for Spell Timers

Describe the feature you'd like
-Option to disable truncated names or change the name width
-Option to change the "ticking" fill in color
-Option to have separate TTS triggers for the sections Spells & Buffs/Effects

Is your feature request related to a problem? Please describe.
No

Additional context

Example:
image

There is enough space for Standard Step to be spelled out fully but it gets truncated. Also in the picture, the transparent black ticking color on top of the dark grey background makes it very hard to see. A color picker would be nice to change the color or at least an option for a lighter color.

For the TTS triggers currently with that option it TTS's everything when I just want my Spell CDs to have TTS when they're about to come up. A TTS option under Spells for only Spells and a TTS option under Buffs/Effects for only Buffs/Effects would be great.

Add health and mana bar metrics

  • Can subscribe to LogLine event for data
    • Event type 39 has HP/mana, index 2 actor ID, index 3 player name, index 4/5 current/max HP, index 6/7 current/max mana
    • Event type 38 has HP/mana, index 2 actor ID, index 3 player name, index 5/6 current/max HP, index 7/8 current/max mana
  • Use health bar similar to monster health bar in aggro table
  • Refactor PercentBar component to have two subcomponents HealthBar and ResourceBar (mana) which change their colors accordingly

Scrolling inside the game

Hi so i'm not sure why or if i done something wrong but everything works fine it just doesn't scroll while inside the game. It only work while i'm outside the game.

Custom CSS persists, but Custom CSS settings are sanitized when closing/re-opening settings

When one adds Custom CSS, the changes are enabled (as long as one can find the correct id/classes). While the changes persist, the actual CSS does not as demonstrated here: https://gyazo.com/9743da9238e3c3fc970c3fad2d3ce0cc

To be clear, whatever Custom CSS is added stays in effect even after closing Settings, reloading the overlay, or closing/opening ACT. The issue is the field is sanitized when any of the above actions are taken. This can make Custom CSS difficult, as one would need to go look at the source code to find the correct ids/classes.

Hide Limit Break from Irrelevant Player Tables

Describe the feature you'd like
Limit Break has multiple uses. But each use is limited to a single purpose. Sometimes, it's simply not relevant in some player tables. Currently, the overlay always displays Limit Break in the DPS, heal, and tank player tables. However, this isn't necessary. For example, if Limit Break is only used for DPS, then it's wasting space in the heal and tank player tables. Due to the nature of Limit Break, any reasonable person would safely assume that its omission from a player table would signify that it wasn't used for the purpose corresponding to that player table.

Is your feature request related to a problem? Please describe.
It clutters up some of the player tables.

Describe alternatives you've considered
One alternative solution that I considered is to suggest hiding entries from the player tables as follow:

  • Entities that do zero damage should be hidden from the DPS player table.
  • Entities that do zero heals should be hidden from the heal player table.
  • Entities that take zero damage and block zero damage should be hidden from the tank player table.

However, in some cases, this would hide relevant information. For example, if a DPS player does no damage, then that should most certainly be displayed. So I ruled out this potential solution.

Additional context
No additional context is necessary.

Error when loading or reloading the overlay

Since some time now (I think shortly after 5.5's release), the overlay just does not appear and when reloading the overlay in the plugin settings of ACT, it throws an error in the console. Rarely, the overlay actually works, but most of the time it does that. Restarting the game or ACT usually doesn't fix the issue. I know the error message doesn't say much information, let me know if there is something I can do to provide a better error message :

Info: Ember Spell Timer: BrowserConsole: Uncaught (in promise) undefined (Source: https://goldenchrysus.github.io/ffxiv/ember-overlay/#/, Line: 0)

The same error happens with the parse version of the overlay as well, with the URL being the only difference. Let me know if there's anything you want me to test or if you have any questions regarding my setup that could help fix this.

Full Screen Installation Steps

It's mentioned in the readme that the overlay plugin might be used when running in fullscreen:

If you wish to remain in full screen mode, you must use OverlayPlugin.

Per this ticket, would it be possible to add the additional instructions for setting up the overlay to work while running in fullscreen (not borderless windowed)?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.