Maintenance for the week of December 23:
• NA megaservers for maintenance – December 23, 4:00AM EST (9:00 UTC) - 9:00AM EST (14:00 UTC)
• EU megaservers for maintenance – December 23, 9:00 UTC (4:00AM EST) - 14:00 UTC (9:00AM EST)

[Addon] Bigger Chat Window

Crabby654
Crabby654
✭✭
Hey all! I figure I would share this add-on I created on the forums so more people may be aware of it.

Bigger Chat Window is a very basic add-on that lets you make your chat window as big as you want!

For me the default chat window size was far to small and it was something that always irked me. I do love the default chat by itself which is why I made a stand alone add-on to manipulate the chat window size and not have any extras.

This is my very first add-on ever and if it has any bugs or issues please feel free to post a comment and let me know. I hope at least a couple people find this add-on useful! Enjoy!

Download Link: http://www.esoui.com/downloads/info657-BiggerChatWindow.html
  • zgrssd
    zgrssd
    ✭✭✭✭
    FYI, there is a "Scale UI" Slider under Interface. It's sole job is to make all windows/tooltips slightly bigger.

    You are also requried to put in a Disclaimer into the addon since 1.2.3 went live:
    http://www.esoui.com/forums/showpost.php?p=9931&postcount=8

    Lets lookt at te code a bit:
    BiggerChatWindow = {}
     
    BiggerChatWindow.name = "BiggerChatWindow"
     
    function BiggerChatWindow:Initialize()
    
    end
     
    function BiggerChatWindow.OnAddOnLoaded(event, addonName)
    
    	CHAT_SYSTEM['maxContainerHeight'] = 1200
    	CHAT_SYSTEM['maxContainerWidth'] = 1800
    
      if addonName == BiggerChatWindow.name then
        BiggerChatWindow:Initialize()
      end
    end
     
    EVENT_MANAGER:RegisterForEvent(BiggerChatWindow.name, EVENT_ADD_ON_LOADED, BiggerChatWindow.OnAddOnLoaded)
    

    The basic idea seems simple and solid enough (setting the max high/width to full UI size).

    There is only basic coding stuff you should look out for:
    Avoid using global variables like the black death. Global means "shared between every addon and the Zenimax code itself". Never use global unless you absolutely need to do it. You never know wich other code might be interfering with you or your with them. If you write a libraraiy, use LibStub to expose it globally.
    The initialise function seems rather useless (it is empty). And in the OnLoaded you run the code before checking if that is your addons on laoded event (every registered on loaded event is run once for every addon that is executed).

    Working that all in I would propably write it like this:
    local RegistgeredEventName = "BiggerChatWindow_OnLoaded"
     
    local function OnAddOnLoaded(event, addonName)
        if(addonName ~= "BiggerChatWindow") then return end
    
        CHAT_SYSTEM['maxContainerHeight'] = 1200
        CHAT_SYSTEM['maxContainerWidth'] = 1800
    end
     
    EVENT_MANAGER:RegisterForEvent(RegistgeredEventName , EVENT_ADD_ON_LOADED, OnAddOnLoaded)
    
    You only need to give a name for this event registration if you plan to remove it at runtime (not normally the case).
    If you don't, just leave it blank/nil.
    Elana Peterson (EU), Dominion, Imperial Sorc, Rune & Alchemy Crafting Char
    Leonida Peterson (EU), Daggerfall, Kajiit Nightblade, Tank & main Crafter
    Kurga Peterson (EU), Ebonhart, Ork Dragonknight, Provision Mule
    Coldblood Peterson (EU) Argonian Templer, Daggerfall, Healer
    Incendia Peterson (EU), Dominion, Dunmer Dragonknight, fire DPS & healer
    Haldor Belendor (EU), Ebonhart, Breton Sorcerer, Tank
    Fuliminictus Peterson (EU), Ebonhart, Altmer Sorcerer, Electric DPS

    Me babbling about PvE roles and Armor, Short Guide to Addon Programming (for Programmers)

    If you think anything I or somebody else said violates the Rules of this Forum, you are free to flag my posts. Till I get any notifcaion from this, I just asume you know you have no case against me or Zenimax disagrees with you.
  • Crabby654
    Crabby654
    ✭✭
    Oh amazing tips thank you. I may do some reworking of the addon when I get home from work and I had no idea about the license thing. Thank you very much!

    Edit: also I am aware of the scale UI window but I tend to like having my chat window fairly wide with other elements smaller
    Edited by Crabby654 on July 21, 2014 5:58PM
  • Garkin
    Garkin
    ✭✭✭
    By the way did you know that similar 'addon' (in quotes, because it contains just 2 lines of code) already exists? :)
    Alisu's Chat Enlarge
    Garkin / EU / CSF guild
    My addons: SkyShards, LoreBooks, Dustman, Map Coordinates, No, thank you, ... (full list)
    I'm taking care of: Azurah - Interface Enhanced, Srendarr - Aura, Buff & Debuff Tracker and more
    My folder with updated/modified addons: DROPBOX
  • Crabby654
    Crabby654
    ✭✭
    Garkin wrote: »
    By the way did you know that similar 'addon' (in quotes, because it contains just 2 lines of code) already exists? :)
    Alisu's Chat Enlarge

    Wow...I have no idea how I missed that addon, I literally look everywhere for this. Grr!! I should probably just take my mess down haha

    Edit: Then again he stopped updating it and I am planning on keeping mine up to date
    Edited by Crabby654 on July 21, 2014 7:16PM
  • Crabby654
    Crabby654
    ✭✭
    zgrssd wrote: »
    FYI, there is a "Scale UI" Slider under Interface. It's sole job is to make all windows/tooltips slightly bigger.

    You are also requried to put in a Disclaimer into the addon since 1.2.3 went live:
    http://www.esoui.com/forums/showpost.php?p=9931&postcount=8

    Lets lookt at te code a bit:
    BiggerChatWindow = {}
     
    BiggerChatWindow.name = "BiggerChatWindow"
     
    function BiggerChatWindow:Initialize()
    
    end
     
    function BiggerChatWindow.OnAddOnLoaded(event, addonName)
    
    	CHAT_SYSTEM['maxContainerHeight'] = 1200
    	CHAT_SYSTEM['maxContainerWidth'] = 1800
    
      if addonName == BiggerChatWindow.name then
        BiggerChatWindow:Initialize()
      end
    end
     
    EVENT_MANAGER:RegisterForEvent(BiggerChatWindow.name, EVENT_ADD_ON_LOADED, BiggerChatWindow.OnAddOnLoaded)
    

    The basic idea seems simple and solid enough (setting the max high/width to full UI size).

    There is only basic coding stuff you should look out for:
    Avoid using global variables like the black death. Global means "shared between every addon and the Zenimax code itself". Never use global unless you absolutely need to do it. You never know wich other code might be interfering with you or your with them. If you write a libraraiy, use LibStub to expose it globally.
    The initialise function seems rather useless (it is empty). And in the OnLoaded you run the code before checking if that is your addons on laoded event (every registered on loaded event is run once for every addon that is executed).

    Working that all in I would propably write it like this:
    local RegistgeredEventName = "BiggerChatWindow_OnLoaded"
     
    local function OnAddOnLoaded(event, addonName)
        if(addonName ~= "BiggerChatWindow") then return end
    
        CHAT_SYSTEM['maxContainerHeight'] = 1200
        CHAT_SYSTEM['maxContainerWidth'] = 1800
    end
     
    EVENT_MANAGER:RegisterForEvent(RegistgeredEventName , EVENT_ADD_ON_LOADED, OnAddOnLoaded)
    
    You only need to give a name for this event registration if you plan to remove it at runtime (not normally the case).
    If you don't, just leave it blank/nil.

    I did everything you suggested and it seems to work fantastic still.

    I have a question thought. I was wondering if its possible to create a saved variable for this addon. Looking around it seems like you can only have addons create saved variables if there an option on the addon (Like turning an option on or off). I tried to create a saved variable function but I'm not sure how to get it to retain the window size for each character. By default when I log on/off it saves the window size for each character individually but I have no idea where that information is. I'd like to make a saved variable for it as a just in case you someone how loose it.
  • zgrssd
    zgrssd
    ✭✭✭✭
    zgrssd wrote: »
    FYI, there is a "Scale UI" Slider under Interface. It's sole job is to make all windows/tooltips slightly bigger.

    You are also requried to put in a Disclaimer into the addon since 1.2.3 went live:
    http://www.esoui.com/forums/showpost.php?p=9931&postcount=8

    Lets lookt at te code a bit:
    BiggerChatWindow = {}
     
    BiggerChatWindow.name = "BiggerChatWindow"
     
    function BiggerChatWindow:Initialize()
    
    end
     
    function BiggerChatWindow.OnAddOnLoaded(event, addonName)
    
    	CHAT_SYSTEM['maxContainerHeight'] = 1200
    	CHAT_SYSTEM['maxContainerWidth'] = 1800
    
      if addonName == BiggerChatWindow.name then
        BiggerChatWindow:Initialize()
      end
    end
     
    EVENT_MANAGER:RegisterForEvent(BiggerChatWindow.name, EVENT_ADD_ON_LOADED, BiggerChatWindow.OnAddOnLoaded)
    

    The basic idea seems simple and solid enough (setting the max high/width to full UI size).

    There is only basic coding stuff you should look out for:
    Avoid using global variables like the black death. Global means "shared between every addon and the Zenimax code itself". Never use global unless you absolutely need to do it. You never know wich other code might be interfering with you or your with them. If you write a libraraiy, use LibStub to expose it globally.
    The initialise function seems rather useless (it is empty). And in the OnLoaded you run the code before checking if that is your addons on laoded event (every registered on loaded event is run once for every addon that is executed).

    Working that all in I would propably write it like this:
    local RegistgeredEventName = "BiggerChatWindow_OnLoaded"
     
    local function OnAddOnLoaded(event, addonName)
        if(addonName ~= "BiggerChatWindow") then return end
    
        CHAT_SYSTEM['maxContainerHeight'] = 1200
        CHAT_SYSTEM['maxContainerWidth'] = 1800
    end
     
    EVENT_MANAGER:RegisterForEvent(RegistgeredEventName , EVENT_ADD_ON_LOADED, OnAddOnLoaded)
    
    You only need to give a name for this event registration if you plan to remove it at runtime (not normally the case).
    If you don't, just leave it blank/nil.

    I did everything you suggested and it seems to work fantastic still.

    I have a question thought. I was wondering if its possible to create a saved variable for this addon. Looking around it seems like you can only have addons create saved variables if there an option on the addon (Like turning an option on or off). I tried to create a saved variable function but I'm not sure how to get it to retain the window size for each character. By default when I log on/off it saves the window size for each character individually but I have no idea where that information is. I'd like to make a saved variable for it as a just in case you someone how loose it.
    Every addon can use saved variables. You propably want account wide ones:
    http://wiki.esoui.com/AddOn_Quick_Questions#How_do_I_save_settings_on_the_local_machine.3F

    The addon menu is only nessesary if you want to allow people to turn anything on/off.
    If anything the Addon Menu needs the saved variables to store what the user set.

    I asume you want to synch the chat sizes across characters?
    As there is no "Unloading" event, there is no obvious way to get the data on logging out. I also have no idea of a fitting event (like chat size changed), but there are 469 Events as of 100007 (1.2.5).
    So you propably need a autosave timer for that.

    I wrote a Addon to synch other chat related stuff (wich categories are enabeld, wich colors are set). I am just not sure if I will include stuff like chat size and position at this point.
    I still ahve to include stuff like Chat Font Size, Transparency, background color and the like.
    Elana Peterson (EU), Dominion, Imperial Sorc, Rune & Alchemy Crafting Char
    Leonida Peterson (EU), Daggerfall, Kajiit Nightblade, Tank & main Crafter
    Kurga Peterson (EU), Ebonhart, Ork Dragonknight, Provision Mule
    Coldblood Peterson (EU) Argonian Templer, Daggerfall, Healer
    Incendia Peterson (EU), Dominion, Dunmer Dragonknight, fire DPS & healer
    Haldor Belendor (EU), Ebonhart, Breton Sorcerer, Tank
    Fuliminictus Peterson (EU), Ebonhart, Altmer Sorcerer, Electric DPS

    Me babbling about PvE roles and Armor, Short Guide to Addon Programming (for Programmers)

    If you think anything I or somebody else said violates the Rules of this Forum, you are free to flag my posts. Till I get any notifcaion from this, I just asume you know you have no case against me or Zenimax disagrees with you.
  • Crabby654
    Crabby654
    ✭✭
    Hmm ya I did glance through the saved variable section. Honestly I am a complete noob to all of this and it was by pure chance I got the right code to even be able to unlock the chat window size further.

    If there is no option to actually save chat size in a saved variable I may just leave it alone for now until they add that option.
    Edited by Crabby654 on July 21, 2014 8:22PM
  • zgrssd
    zgrssd
    ✭✭✭✭
    Hmm ya I did glance through the saved variable section. Honestly I am a complete noob to all of this and it was by pure chance I got the right code to even be able to unlock the chat window size further.

    If there is no option to actually save chat size in a saved variable I may just leave it alone for now until they add that option.
    If you can get or set it via the API, you can store it in a Saved Variable to be persisted between runs of the client/relogs and synced between Chracters.

    But it is a surprising amount of setup work for this feature.
    Elana Peterson (EU), Dominion, Imperial Sorc, Rune & Alchemy Crafting Char
    Leonida Peterson (EU), Daggerfall, Kajiit Nightblade, Tank & main Crafter
    Kurga Peterson (EU), Ebonhart, Ork Dragonknight, Provision Mule
    Coldblood Peterson (EU) Argonian Templer, Daggerfall, Healer
    Incendia Peterson (EU), Dominion, Dunmer Dragonknight, fire DPS & healer
    Haldor Belendor (EU), Ebonhart, Breton Sorcerer, Tank
    Fuliminictus Peterson (EU), Ebonhart, Altmer Sorcerer, Electric DPS

    Me babbling about PvE roles and Armor, Short Guide to Addon Programming (for Programmers)

    If you think anything I or somebody else said violates the Rules of this Forum, you are free to flag my posts. Till I get any notifcaion from this, I just asume you know you have no case against me or Zenimax disagrees with you.
  • Garkin
    Garkin
    ✭✭✭
    zgrssd wrote: »
    ... <snip> ...
    I asume you want to synch the chat sizes across characters?
    As there is no "Unloading" event, there is no obvious way to get the data on logging out. I also have no idea of a fitting event (like chat size changed), but there are 469 Events as of 100007 (1.2.5).
    So you probably need a autosave timer for that.
    ... < snip >...
    Every window can have defined handlers for such events - for example "OnResizeStart", "OnResizeStop", "OnDragStart", "OnMoveStart", "OnMoveStop" etc (full list in documentation attached to this topic).
    As you never know if those handlers are already defined, it is safer to use function ZO_PreHookHandler(control, handlerName, hookFunction) to hook or define new handlers.

    But back to the topic - You have asked where dimensions of chat containers are saved. Dimensions are saved to the ZO_Ingame_SavedVariables table an you can find it in the "~\Documents\Elder Scrolls Online\live\SavedVariables\ZO_Ingame.lua" file.

    Usually there is just one chat container (it is not possible to have more containers unless you use addon), so all following code snippets are just for the first container.

    Get dimensions from the chat container itself:
    local width, height = CHAT_SYSTEM.containers[1].control:GetDimensions()
    

    Get dimensions from the saved variables for the current character:
    local width = CHAT_SYSTEM.sv.containers[1].width
    local height = CHAT_SYSTEM.sv.containers[1].height
    

    Get dimensions from the saved variables for any character:
    local displayName = GetDisplayName()
    local sv = ZO_Ingame_SavedVariables.Default[displayName]
    for characterName, characterSettings in pairs(sv) do
       local settings = characterSettings.Chat.containers[1]
       d("Character: " .. characterName .. ", width: " .. settings.width .. ", height: " .. settings.height)
    end
    

    How to get dimesions of the chat container every time when it is resized:
    (there is more possibilities how to do it, this is just an example)
    local width, height
    
    ZO_PreHook("ZO_ChatSystem_OnResizeStop", function(control)
       width, height = control:GetDimensions()
    end)
    

    How to load chat container settings:
    local settings = {
       point = BOTTOMLEFT,
       relPoint = BOTTOMLEFT,
       x = 0,
       y = 0,
       width = 445,
       height = 267,
    }
    CHAT_SYSTEM.containers[1]:LoadSettings(settings)
    

    Or directly set dimensions:
    CHAT_SYSTEM.containers[1].control:SetDimensions(width, height)
    

    I hope that it will really works, because I didn't try any of those code snippets...
    Garkin / EU / CSF guild
    My addons: SkyShards, LoreBooks, Dustman, Map Coordinates, No, thank you, ... (full list)
    I'm taking care of: Azurah - Interface Enhanced, Srendarr - Aura, Buff & Debuff Tracker and more
    My folder with updated/modified addons: DROPBOX
  • Crabby654
    Crabby654
    ✭✭
    The more I have been thinking about it I am probably not going to try to fight with a saved variable option. Mainly because in the ZOS saved variable it already has a different setting for each character and its really not necessary. And also because I really have no idea how to do ANY of that.

    However I do want to try some simple things. I've been slowly looking up how to create a slash command. Like "/bcw reset" that will reset the chat window to the default size and position, the only issue is I can't seem to find the function (right word?) that will actually reset the size. Hmm this is a lot more daunting that I thought!..but fun!
  • Garkin
    Garkin
    ✭✭✭
    The more I have been thinking about it I am probably not going to try to fight with a saved variable option. Mainly because in the ZOS saved variable it already has a different setting for each character and its really not necessary. And also because I really have no idea how to do ANY of that.

    However I do want to try some simple things. I've been slowly looking up how to create a slash command. Like "/bcw reset" that will reset the chat window to the default size and position, the only issue is I can't seem to find the function (right word?) that will actually reset the size. Hmm this is a lot more daunting that I thought!..but fun!
    CHAT_SYSTEM:ResetContainerPositionAndSize(CHAT_SYSTEM.containers[1])
    


    This is the source code with my changes, but do not look if you want to write it by yourself. :)
    BiggerChatWindow.txt:
    ## Title: Bigger Chat Window
    ## Description: Allows you to make your chat window bigger than default.
    ## Version: 1.2
    ## Author: Crabby654
    ## APIVersion: 100007
    ## SavedVariables: BiggerChatWindow_SavedVariables
    
    BiggerChatWindow.lua
    

    BiggerChatWindow.lua:
    local addonName = "BiggerChatWindow"
    local defaults = {
        ["*"] = {
            width = 445,
            height = 267,
            point = BOTTOMLEFT,
            relPoint = BOTTOMLEFT,
            x = 0,
            y = 0,
        },
    }
        
    local function OnAddOnLoaded(event, name)
        if(name ~= addonName) then return end
        EVENT_MANAGER:UnregisterForEvent(addonName, event)
    
        --account wide saved variables
        local savedVars = ZO_SavedVars:NewAccountWide("BiggerChatWindow_SavedVariables", 1, "Chat", defaults)
    
        --set maximal chat size to full screen
        CHAT_SYSTEM.maxContainerWidth, CHAT_SYSTEM.maxContainerHeight = GuiRoot:GetDimensions()
        
        --chat tabs are created when palyer is activated, we just need to replace settings with our values
        for i = 1, GetNumChatContainers() do
            local chatSV = ZO_Ingame_SavedVariables.Default[GetDisplayName()][GetUnitName("player")].Chat.containers
            for key, value in pairs(savedVars[i]) do
                chatSV[i][key] = value
            end
        end
    
        --hook functions, so we can store chat containers size and position
        local function SaveSettings(control)
            local sv, _ = savedVars[control.container.id] 
            sv.width, sv.height = control:GetDimensions()
            _, sv.point, _, sv.relPoint, sv.x, sv.y = control:GetAnchor(0)
        end
        ZO_PreHook("ZO_ChatSystem_OnResizeStop", SaveSettings)
        ZO_PreHook("ZO_ChatSystem_OnMoveStop", SaveSettings)
        
        --define slash command
        SLASH_COMMANDS["/bcwreset"] = function()
            for i = 1, #CHAT_SYSTEM.containers do
                savedVars[i] = nil
                CHAT_SYSTEM:ResetContainerPositionAndSize(CHAT_SYSTEM.containers[i])
            end
        end
    end
     
    EVENT_MANAGER:RegisterForEvent(addonName, EVENT_ADD_ON_LOADED, OnAddOnLoaded)
    
    Edited by Garkin on July 23, 2014 11:58AM
    Garkin / EU / CSF guild
    My addons: SkyShards, LoreBooks, Dustman, Map Coordinates, No, thank you, ... (full list)
    I'm taking care of: Azurah - Interface Enhanced, Srendarr - Aura, Buff & Debuff Tracker and more
    My folder with updated/modified addons: DROPBOX
  • Crabby654
    Crabby654
    ✭✭
    Garkin you are a wizard and honestly I feel horrendously guilty using your code you have there because you basically made my stupid little addon for me haha.

    But I am wondering if this is possible. Considering that the Chat Window Size is held into the ZoS Saved Variable file I wonder if it would be easier to have my reset slash command set the "container" size back to the default size and position without using or pulling from a saved variable created from the addon.

    Unless you really think I should use a saved variable for some reason? I am so new to dinking around with addons im not sure if its 100% necessary or not, I'd just like to make it as simple as possible.
  • Garkin
    Garkin
    ✭✭✭
    I have originally thought that you want the same settings for all your characters, so I made account wide saved variables. If it is not the case and you want to have stored settings for each character, you won't need your own saved variables or any other changes that I made to the code:
    local addonName = "BiggerChatWindow"
        
    local function OnAddOnLoaded(event, name)
        if(name ~= addonName) then return end
        EVENT_MANAGER:UnregisterForEvent(addonName, event)
    
        --set maximal chat size to full screen
        CHAT_SYSTEM.maxContainerWidth, CHAT_SYSTEM.maxContainerHeight = GuiRoot:GetDimensions()
    
        --define slash command
        SLASH_COMMANDS["/bcwreset"] = function()
            for i = 1, #CHAT_SYSTEM.containers do
                CHAT_SYSTEM:ResetContainerPositionAndSize(CHAT_SYSTEM.containers[i])
            end
        end
    end
     
    EVENT_MANAGER:RegisterForEvent(addonName, EVENT_ADD_ON_LOADED, OnAddOnLoaded)
    
    Garkin / EU / CSF guild
    My addons: SkyShards, LoreBooks, Dustman, Map Coordinates, No, thank you, ... (full list)
    I'm taking care of: Azurah - Interface Enhanced, Srendarr - Aura, Buff & Debuff Tracker and more
    My folder with updated/modified addons: DROPBOX
  • Crabby654
    Crabby654
    ✭✭
    Ok amazing! I have it working. I actually am understanding how things are working now..well sort of!

    Question though, my original "code" I basically took from the ESO API wiki and you changed some things I'm curious about:

    As an example you removed:
    BiggerChatWindow = {}
     
    BiggerChatWindow.name = "BiggerChatWindow"
    
    and replaced it with just:
    local addonName = "BiggerChatWindow"
    
    Why is that? Sorry if its a stupid question I'm honestly curious why little things like that you changed.
  • Garkin
    Garkin
    ✭✭✭
    Ok amazing! I have it working. I actually am understanding how things are working now..well sort of!

    Question though, my original "code" I basically took from the ESO API wiki and you changed some things I'm curious about:

    As an example you removed:
    BiggerChatWindow = {}
     
    BiggerChatWindow.name = "BiggerChatWindow"
    
    and replaced it with just:
    local addonName = "BiggerChatWindow"
    
    Why is that? Sorry if its a stupid question I'm honestly curious why little things like that you changed.
    Your addon doesn't need global table, you don't use it anywhere else in the code. That's the reason why I have removed it.
    I agree with @zgrssd that it's a good practice to keep global space clean. I'm always trying to expose only those functions/variables which should be shared with other addons. You really do not need to share name of your addon, right?

    As for tutorials on wiki - what is written there is just an example how things can be done. If you check other tutorials there, you will see that they do not use global tables.
    Garkin / EU / CSF guild
    My addons: SkyShards, LoreBooks, Dustman, Map Coordinates, No, thank you, ... (full list)
    I'm taking care of: Azurah - Interface Enhanced, Srendarr - Aura, Buff & Debuff Tracker and more
    My folder with updated/modified addons: DROPBOX
  • Crabby654
    Crabby654
    ✭✭
    Thank you again for all your help Garkin. I had another question after messing around with the slash command stuff.

    How would I go about making the slash command be "/bcw reset" instead of "/bcwreset". I kind of want /bcw to be the base so I can add more slash commands later on.
  • Garkin
    Garkin
    ✭✭✭
    Garkin / EU / CSF guild
    My addons: SkyShards, LoreBooks, Dustman, Map Coordinates, No, thank you, ... (full list)
    I'm taking care of: Azurah - Interface Enhanced, Srendarr - Aura, Buff & Debuff Tracker and more
    My folder with updated/modified addons: DROPBOX
  • Crabby654
    Crabby654
    ✭✭
Sign In or Register to comment.