diff --git a/Azurah.txt b/Azurah.txt
index 36d0bbb..89e7ea5 100644
--- a/Azurah.txt
+++ b/Azurah.txt
@@ -1,6 +1,6 @@
## Title: |c67b1e9A|c4779cezurah|r
## Description: Enhances the default interface with additional overlay details and customization options while retaining the stock theme.
-## Version: 2.2.0
+## Version: 2.2.1
## Author: Kith, |cEFEBBEGarkin|r, |c66ccffPhinix|r, |c68D2E8Sounomi|r
## APIVersion: 100013
## SavedVariables: AzurahDB
@@ -41,6 +41,8 @@ ActionBar.lua
ExperienceBar.lua
Bossbar.lua
BagWatcher.lua
+Thievery.lua
+Werewolf.lua
Settings.lua
diff --git a/Azurah.xml b/Azurah.xml
index 95e3106..3173c73 100644
--- a/Azurah.xml
+++ b/Azurah.xml
@@ -6,5 +6,9 @@
<Dimensions x="375" y="56" />
<Anchor point="TOPRIGHT" relativeTo="GuiRoot" relativePoint="TOPRIGHT" offsetX="-15" offsetY="10" />
</TopLevelControl>
+ <TopLevelControl name="Azurah_WerewolfTimer" clampedToScreen="true" hidden="true">
+ <Dimensions x="90" y="48" />
+ <Anchor point="BOTTOM" relativeTo="GuiRoot" relativePoint="BOTTOM" offsetX="285" offsetY="-21" />
+ </TopLevelControl>
</Controls>
</GuiXml>
diff --git a/BagWatcher.lua b/BagWatcher.lua
index 3f1da94..44bf708 100644
--- a/BagWatcher.lua
+++ b/BagWatcher.lua
@@ -11,12 +11,12 @@ local GetBagSize = GetBagSize
local VISIBLE_TIME_HOLD = 2500
local VISIBLE_TIME_FADE_OUT = 400
-local BAR_WIDTH = 315
+local firstLoad = true
+local bagMax = 0
+local bagCurrent, bagNew = 0, 0
local FormatOverlay
local db
-local bagMax, bagCurrent, bagNew = 0, 0, 0
-local firstLoad = true
local function ShowWatcher()
@@ -94,53 +94,24 @@ local function BuildWatcher()
-- ICON
Watcher.icon, ctrl = AddControl(Watcher, CT_TEXTURE, 3)
ctrl:SetDimensions(56, 56)
- ctrl:SetAnchor(CENTER)
- ctrl:SetTexture([[esoui/art/mainmenu/menuBar_inventory_up.dds]])
+ ctrl:SetTexture([[/esoui/art/mainmenu/menuBar_inventory_up.dds]])
ctrl:SetTextureCoords(0.0625, 0.9375, 0.0625, 0.9375)
-- BAR
Watcher.bar, ctrl = AddControl(Watcher, CT_STATUSBAR, 2)
- ctrl:SetDimensions(BAR_WIDTH, 20)
- ctrl:SetTexture([[/esoui/art/miscellaneous/progressbar_genericfill.dds]])
- ctrl:SetTextureCoords(0, 1, 0, 0.625)
ZO_StatusBar_SetGradientColor(ctrl, ZO_XP_BAR_GRADIENT_COLORS)
- ctrl:SetLeadingEdge([[/esoui/art/miscellaneous/progressbar_genericfill_leadingedge.dds]], 8, 32)
- ctrl:SetLeadingEdgeTextureCoords(0, 1, 0, 0.625)
ctrl:EnableLeadingEdge(true)
- ctrl:SetMinMax(0, 1)
ctrl:SetHandler('OnValueChanged', function(bar, value) bar.gloss:SetValue(value) end) -- change gloss value as main bar changes
-- BAR GLOSS
Watcher.bar.gloss, ctrl = AddControl(Watcher.bar, CT_STATUSBAR, 3)
- ctrl:SetDimensions(BAR_WIDTH, 20)
ctrl:SetAnchor(TOPLEFT)
- ctrl:SetTexture([[/esoui/art/miscellaneous/progressbar_genericfill_gloss.dds]])
- ctrl:SetTextureCoords(0, 1, 0, 0.625)
- ctrl:SetLeadingEdge([[/esoui/art/miscellaneous/progressbar_genericfill_leadingedge_gloss.dds]], 8, 32)
- ctrl:SetLeadingEdgeTextureCoords(0, 1, 0, 0.625)
ctrl:EnableLeadingEdge(true)
- ctrl:SetMinMax(0, 1)
-- BAR FRAME
Watcher.bar.borderL, ctrl = AddControl(Watcher.bar, CT_TEXTURE, 4)
- ctrl:SetDimensions(10, 20)
- ctrl:SetAnchor(TOPLEFT)
- ctrl:SetTexture([[/esoui/art/miscellaneous/progressbar_frame.dds]])
Watcher.bar.borderR, ctrl = AddControl(Watcher.bar, CT_TEXTURE, 4)
- ctrl:SetDimensions(10, 20)
- ctrl:SetAnchor(TOPRIGHT)
- ctrl:SetTexture([[/esoui/art/miscellaneous/progressbar_frame.dds]])
Watcher.bar.borderM, ctrl = AddControl(Watcher.bar, CT_TEXTURE, 4)
- ctrl:SetDimensions(BAR_WIDTH - 20, 20)
- ctrl:SetAnchor(TOPLEFT, Watcher.bar, TOPLEFT, 10, 0)
- ctrl:SetTexture([[/esoui/art/miscellaneous/progressbar_frame.dds]])
- ctrl:SetTextureCoords(0.019500000402331, 0.58980000019073, 0, 0.625)
-- BAR BACKDROP
Watcher.bar.backdropEnd, ctrl = AddControl(Watcher.bar, CT_TEXTURE, 1)
- ctrl:SetDimensions(10, 20)
- ctrl:SetTexture([[/esoui/art/miscellaneous/progressbar_genericfill_leadingedge.dds]])
- ctrl:SetColor(0,0,0,0.4)
Watcher.bar.backdrop, ctrl = AddControl(Watcher.bar, CT_TEXTURE, 1)
- ctrl:SetDimensions(BAR_WIDTH - 10, 20)
- ctrl:SetTexture('')
- ctrl:SetColor(0,0,0,0.4)
-- OVERLAY
Watcher.overlay = Azurah:CreateOverlay(Watcher, CENTER, CENTER, 0, 0, nil, nil, nil, TEXT_ALIGN_LEFT) -- will be reanchored later by configure
-- ANIMATION TIMELINE
@@ -164,6 +135,163 @@ end
-- ------------------------
-- CONFIGURATION
-- ------------------------
+function Azurah:ConfigureBagWatcherKeyboard()
+ Watcher:SetDimensions(375, 56)
+
+ if (not Watcher.bar) then return end -- bar isn't built yet (is disabled), abort
+
+ Watcher.icon:ClearAnchors()
+ Watcher.overlay:SetHidden(false)
+ Watcher.overlay:ClearAnchors()
+ Watcher.bar:ClearAnchors()
+ Watcher.bar.borderL:ClearAnchors()
+ Watcher.bar.borderR:ClearAnchors()
+ Watcher.bar.borderM:ClearAnchors()
+ Watcher.bar.backdropEnd:ClearAnchors()
+ Watcher.bar.backdrop:ClearAnchors()
+
+ Watcher.bar:SetDimensions(315, 20)
+ Watcher.bar:SetTexture([[/esoui/art/miscellaneous/progressbar_genericfill.dds]])
+ Watcher.bar:SetTextureCoords(0, 1, 0, 0.625)
+ Watcher.bar:SetLeadingEdge([[/esoui/art/miscellaneous/progressbar_genericfill_leadingedge.dds]], 10, 20)
+ Watcher.bar:SetLeadingEdgeTextureCoords(0, 1, 0, 0.625)
+
+ Watcher.bar.gloss:SetDimensions(315, 20)
+ Watcher.bar.gloss:SetTexture([[/esoui/art/miscellaneous/progressbar_genericfill_gloss.dds]])
+ Watcher.bar.gloss:SetTextureCoords(0, 1, 0, 0.625)
+ Watcher.bar.gloss:SetLeadingEdge([[/esoui/art/miscellaneous/progressbar_genericfill_leadingedge_gloss.dds]], 10, 20)
+ Watcher.bar.gloss:SetLeadingEdgeTextureCoords(0, 1, 0, 0.625)
+
+ Watcher.bar.borderL:SetDimensions(10, 20)
+ Watcher.bar.borderL:SetAnchor(TOPLEFT)
+ Watcher.bar.borderL:SetTexture([[/esoui/art/miscellaneous/progressbar_frame.dds]])
+
+ Watcher.bar.borderR:SetDimensions(10, 20)
+ Watcher.bar.borderR:SetAnchor(TOPRIGHT)
+ Watcher.bar.borderR:SetTexture([[/esoui/art/miscellaneous/progressbar_frame.dds]])
+
+ Watcher.bar.borderM:SetDimensions(295, 20)
+ Watcher.bar.borderM:SetAnchor(TOPLEFT, Watcher.bar, TOPLEFT, 10, 0)
+ Watcher.bar.borderM:SetTexture([[/esoui/art/miscellaneous/progressbar_frame.dds]])
+ Watcher.bar.borderM:SetTextureCoords(0.019500000402331, 0.58980000019073, 0, 0.625)
+
+ Watcher.bar.backdropEnd:SetDimensions(10, 20)
+ Watcher.bar.backdropEnd:SetTexture([[/esoui/art/miscellaneous/progressbar_frame_bg.dds]])
+
+ Watcher.bar.backdrop:SetDimensions(305, 20)
+ Watcher.bar.backdrop:SetTexture([[/esoui/art/miscellaneous/progressbar_frame_bg.dds]])
+ Watcher.bar.backdrop:SetTextureCoords(0.019500000402331, 0.58980000019073, 0, 0.625)
+
+ if (db.reverseAlignment) then
+ Watcher.icon:SetAnchor(TOPRIGHT, Watcher, TOPRIGHT, 10, 7)
+ Watcher.overlay:SetAnchor(BOTTOMRIGHT, Watcher.bar, TOPRIGHT, -4, -2)
+ Watcher.bar:SetAnchor(BOTTOMRIGHT, Watcher.icon, BOTTOMLEFT, 7, -8)
+ Watcher.bar:SetBarAlignment(BAR_ALIGNMENT_REVERSE)
+ Watcher.bar.gloss:SetBarAlignment(BAR_ALIGNMENT_REVERSE)
+ Watcher.bar.borderL:SetTextureCoords(0.6133000254631, 0.59380000829697, 0, 0.625)
+ Watcher.bar.borderR:SetTextureCoords(0.019500000402331, 0, 0, 0.625)
+ Watcher.bar.backdropEnd:SetAnchor(TOPLEFT, Watcher.bar, TOPLEFT, 0, 0)
+ Watcher.bar.backdropEnd:SetTextureCoords(0.6133000254631, 0.59380000829697, 0, 0.625)
+ Watcher.bar.backdrop:SetAnchor(TOPRIGHT, Watcher.bar, TOPRIGHT, 0, 0)
+ else
+ Watcher.icon:SetAnchor(TOPLEFT, Watcher, TOPLEFT, -10, 7)
+ Watcher.overlay:SetAnchor(BOTTOMLEFT, Watcher.bar, TOPLEFT, 4, -2)
+ Watcher.bar:SetAnchor(BOTTOMLEFT, Watcher.icon, BOTTOMRIGHT, -7, -8)
+ Watcher.bar:SetBarAlignment(BAR_ALIGNMENT_NORMAL)
+ Watcher.bar.gloss:SetBarAlignment(BAR_ALIGNMENT_NORMAL)
+ Watcher.bar.borderL:SetTextureCoords(0, 0.019500000402331, 0, 0.625)
+ Watcher.bar.borderR:SetTextureCoords(0.59380000829697, 0.6133000254631, 0, 0.625)
+ Watcher.bar.backdropEnd:SetAnchor(TOPRIGHT, Watcher.bar, TOPRIGHT, 0, 0)
+ Watcher.bar.backdropEnd:SetTextureCoords(0.59380000829697, 0.6133000254631, 0, 0.625)
+ Watcher.bar.backdrop:SetAnchor(TOPLEFT, Watcher.bar, TOPLEFT, 0, 0)
+ end
+end
+
+function Azurah:ConfigureBagWatcherGamepad()
+ Watcher:SetDimensions(255, 56)
+
+ if (not Watcher.bar) then return end -- bar isn't built yet (is disabled), abort
+
+ Watcher.icon:ClearAnchors()
+ Watcher.overlay:SetHidden(true) -- no overlay in gamepad mode
+-- Watcher.overlay:ClearAnchors()
+ Watcher.bar:ClearAnchors()
+ Watcher.bar.borderL:ClearAnchors()
+ Watcher.bar.borderR:ClearAnchors()
+ Watcher.bar.borderM:ClearAnchors()
+ Watcher.bar.backdropEnd:ClearAnchors()
+ Watcher.bar.backdrop:ClearAnchors()
+
+ Watcher.bar:SetDimensions(205, 22)
+ Watcher.bar:SetTexture([[/esoui/art/miscellaneous/gamepad/gp_dynamicbar_medium_fill.dds]])
+ Watcher.bar:SetTextureCoords(0, 1, 0.15625, 0.84375)
+ Watcher.bar:SetLeadingEdge([[/esoui/art/miscellaneous/gamepad/gp_dynamicbar_medium_leadingedge.dds]], 16, 32)
+ Watcher.bar:SetLeadingEdgeTextureCoords(0, 0.5, 0.15625, 0.84375)
+
+ Watcher.bar.gloss:SetDimensions(205, 22)
+ Watcher.bar.gloss:SetTexture([[/esoui/art/miscellaneous/gamepad/gp_dynamicbar_medium_gloss.dds]])
+ Watcher.bar.gloss:SetTextureCoords(0, 1, 0.15625, 0.84375)
+ Watcher.bar.gloss:SetLeadingEdge([[/esoui/art/miscellaneous/gamepad/gp_dynamicbar_medium_leadingedge_gloss.dds]], 16, 32)
+ Watcher.bar.gloss:SetLeadingEdgeTextureCoords(0, 0.5, 0.15625, 0.84375)
+
+ Watcher.bar.borderL:SetDimensions(7, 22)
+ Watcher.bar.borderL:SetTexture([[/esoui/art/miscellaneous/gamepad/gp_dynamicbar_medium_frame.dds]])
+
+ Watcher.bar.borderR:SetDimensions(11, 22)
+ Watcher.bar.borderR:SetTexture([[/esoui/art/miscellaneous/gamepad/gp_dynamicbar_medium_frame.dds]])
+
+ Watcher.bar.borderM:SetDimensions(191, 22)
+ Watcher.bar.borderM:SetTexture([[/esoui/art/miscellaneous/gamepad/gp_dynamicbar_medium_frame.dds]])
+ Watcher.bar.borderM:SetTextureCoords(0.6875, 0.4375, 0.15625, 0.84375)
+
+ Watcher.bar.backdropEnd:SetDimensions(11, 22)
+ Watcher.bar.backdropEnd:SetTexture([[/esoui/art/miscellaneous/gamepad/gp_dynamicbar_medium_bg.dds]])
+
+ Watcher.bar.backdrop:SetDimensions(198, 22)
+ Watcher.bar.backdrop:SetTexture([[/esoui/art/miscellaneous/gamepad/gp_dynamicbar_medium_bg.dds]])
+ Watcher.bar.backdrop:SetTextureCoords(0.6875, 0.4375, 0.15625, 0.84375)
+
+ if (db.reverseAlignment) then
+ Watcher.icon:SetAnchor(TOPRIGHT, Watcher, TOPRIGHT, 9, 7)
+-- Watcher.overlay:SetAnchor(BOTTOMRIGHT, Watcher.bar, TOPRIGHT, -4, 1)
+ Watcher.bar:SetAnchor(BOTTOMRIGHT, Watcher.icon, BOTTOMLEFT, 7, -15)
+ Watcher.bar:SetBarAlignment(BAR_ALIGNMENT_REVERSE)
+ Watcher.bar.gloss:SetBarAlignment(BAR_ALIGNMENT_REVERSE)
+
+ Watcher.bar.borderL:SetAnchor(TOPRIGHT, Watcher.bar, TOPRIGHT, 2, 0)
+ Watcher.bar.borderL:SetTextureCoords(0.71875, 0.9375, 0.15625, 0.84375)
+
+ Watcher.bar.borderR:SetAnchor(TOPLEFT, Watcher.bar, TOPLEFT, -2, 0)
+ Watcher.bar.borderR:SetTextureCoords(0.0625, 0.40625, 0.15625, 0.84375)
+
+ Watcher.bar.borderM:SetAnchor(TOPRIGHT, Watcher.bar, TOPRIGHT, -5, 0)
+
+ Watcher.bar.backdropEnd:SetAnchor(TOPLEFT, Watcher.bar, TOPLEFT, -2, 0)
+ Watcher.bar.backdropEnd:SetTextureCoords(0.0625, 0.40625, 0.15625, 0.84375)
+
+ Watcher.bar.backdrop:SetAnchor(TOPRIGHT, Watcher.bar, TOPRIGHT, 2, 0)
+ else
+ Watcher.icon:SetAnchor(TOPLEFT, Watcher, TOPLEFT, -9, 0)
+-- Watcher.overlay:SetAnchor(BOTTOMLEFT, Watcher.bar, TOPLEFT, 4, 1)
+ Watcher.bar:SetAnchor(BOTTOMLEFT, Watcher.icon, BOTTOMRIGHT, -7, -15)
+ Watcher.bar:SetBarAlignment(BAR_ALIGNMENT_NORMAL)
+ Watcher.bar.gloss:SetBarAlignment(BAR_ALIGNMENT_NORMAL)
+
+ Watcher.bar.borderL:SetAnchor(TOPLEFT, Watcher.bar, TOPLEFT, -2, 0)
+ Watcher.bar.borderL:SetTextureCoords(0.9375, 0.71875, 0.15625, 0.84375)
+
+ Watcher.bar.borderR:SetAnchor(TOPRIGHT, Watcher.bar, TOPRIGHT, 2, 0)
+ Watcher.bar.borderR:SetTextureCoords(0.40625, 0.0625, 0.15625, 0.84375)
+
+ Watcher.bar.borderM:SetAnchor(TOPLEFT, Watcher.bar, TOPLEFT, 5, 0)
+
+ Watcher.bar.backdropEnd:SetAnchor(TOPRIGHT, Watcher.bar, TOPRIGHT, 2, 0)
+ Watcher.bar.backdropEnd:SetTextureCoords(0.40625, 0.0625, 0.15625, 0.84375)
+
+ Watcher.bar.backdrop:SetAnchor(TOPLEFT, Watcher.bar, TOPLEFT, -2, 0)
+ end
+end
+
function Azurah:ConfigureBagWatcher(onLoad)
if (not db.enabled) then -- not using bag watcher
-- unregister watcher events
@@ -177,43 +305,18 @@ function Azurah:ConfigureBagWatcher(onLoad)
-- configure bag watcher appearance
Watcher.overlay:SetFont(string.format('%s|%d|%s', LMP:Fetch('font', db.fontFace), db.fontSize, db.fontOutline))
Watcher.overlay:SetColor(db.fontColour.r, db.fontColour.g, db.fontColour.b, db.fontColour.a)
- Watcher.overlay:ClearAnchors()
-
- Watcher.bar:ClearAnchors()
- Watcher.bar.backdrop:ClearAnchors()
- Watcher.bar.backdropEnd:ClearAnchors()
- Watcher.icon:ClearAnchors()
-
- if (db.reverseAlignment) then
- Watcher.bar.backdrop:SetAnchor(TOPRIGHT, Watcher.bar, TOPRIGHT, 0, 0)
- Watcher.bar.backdropEnd:SetAnchor(TOPLEFT, Watcher.bar, TOPLEFT, 0, 0)
- Watcher.bar:SetBarAlignment(BAR_ALIGNMENT_REVERSE)
- Watcher.bar.gloss:SetBarAlignment(BAR_ALIGNMENT_REVERSE)
- Watcher.bar.borderL:SetTextureCoords(0.6133000254631, 0.59380000829697, 0, 0.625)
- Watcher.bar.borderR:SetTextureCoords(0.019500000402331, 0, 0, 0.625)
- Watcher.bar.backdropEnd:SetTextureCoords(1, 0, 0, 0.625)
-
- Watcher.icon:SetAnchor(TOPRIGHT, Watcher, TOPRIGHT, 10, 7)
- Watcher.bar:SetAnchor(BOTTOMRIGHT, Watcher.icon, BOTTOMLEFT, 7, -8)
- Watcher.overlay:SetAnchor(BOTTOMRIGHT, Watcher.bar, TOPRIGHT, -4, -2)
+
+
+ if (IsInGamepadPreferredMode()) then
+ self:ConfigureBagWatcherGamepad()
else
- Watcher.bar.backdrop:SetAnchor(TOPLEFT, Watcher.bar, TOPLEFT, 0, 0)
- Watcher.bar.backdropEnd:SetAnchor(TOPRIGHT, Watcher.bar, TOPRIGHT, 0, 0)
- Watcher.bar:SetBarAlignment(BAR_ALIGNMENT_NORMAL)
- Watcher.bar.gloss:SetBarAlignment(BAR_ALIGNMENT_NORMAL)
- Watcher.bar.borderL:SetTextureCoords(0, 0.019500000402331, 0, 0.625)
- Watcher.bar.borderR:SetTextureCoords(0.59380000829697, 0.6133000254631, 0, 0.625)
- Watcher.bar.backdropEnd:SetTextureCoords(0, 1, 0, 0.625)
-
- Watcher.icon:SetAnchor(TOPLEFT, Watcher, TOPLEFT, -10, 7)
- Watcher.bar:SetAnchor(BOTTOMLEFT, Watcher.icon, BOTTOMRIGHT, -7, -8)
- Watcher.overlay:SetAnchor(BOTTOMLEFT, Watcher.bar, TOPLEFT, 4, -2)
+ self:ConfigureBagWatcherKeyboard()
end
- bagMax = GetBagSize(BAG_BACKPACK)
- bagCurrent = GetNumBagUsedSlots(BAG_BACKPACK)
+ bagMax = GetBagSize(BAG_BACKPACK)
+ bagCurrent = GetNumBagUsedSlots(BAG_BACKPACK)
- FormatOverlay = self.overlayFuncs[db.overlay]
+ FormatOverlay = self.overlayFuncs[db.overlay]
Watcher.bar:SetMinMax(0, bagMax)
Watcher.bar.gloss:SetMinMax(0, bagMax)
diff --git a/Core.lua b/Core.lua
index 24e3f06..af4ad62 100644
--- a/Core.lua
+++ b/Core.lua
@@ -5,22 +5,22 @@
* stock interface with optional components to provide
* additional information while maintaining the stock feel.
*
- * Version 2.2.0
+ * Version 2.2.1
* Kith, Garkin, Phinix, Sounomi
*
*
]]--
-local Azurah = _G['Azurah'] -- grab addon table from global
-local L = Azurah:GetLocale()
+local Azurah = _G['Azurah'] -- grab addon table from global
+local L = Azurah:GetLocale()
-Azurah.name = 'Azurah'
-Azurah.slash = '/azurah'
-Azurah.version = '2.2.0'
-Azurah.versionDB = 2
+Azurah.name = 'Azurah'
+Azurah.slash = '/azurah'
+Azurah.version = '2.2.1'
+Azurah.versionDB = 2
-Azurah.movers = {}
-Azurah.snapToGrid = true
-Azurah.uiUnlocked = false
+Azurah.movers = {}
+Azurah.snapToGrid = true
+Azurah.uiUnlocked = false
-- ------------------------
@@ -34,7 +34,11 @@ function Azurah.OnInitialize(code, addon)
EVENT_MANAGER:UnregisterForEvent(self.name, EVENT_ADD_ON_LOADED)
SLASH_COMMANDS[self.slash] = self.SlashCommand
- self.db = ZO_SavedVars:New('AzurahDB', self.versionDB, nil, self:GetDefaults())
+ self.db = ZO_SavedVars:NewAccountWide('AzurahDB', self.versionDB, nil, self:GetDefaults())
+
+ if (not self.db.useAccountWide) then -- not using global settings, generate (or load) character specific settings
+ self.db = ZO_SavedVars:New('AzurahDB', self.versionDB, nil, self:GetDefaults())
+ end
self:InitializePlayer() -- Player.lua
self:InitializeTarget() -- Target.lua
@@ -42,6 +46,7 @@ function Azurah.OnInitialize(code, addon)
self:InitializeActionBar() -- ActionBar.lua
self:InitializeExperienceBar() -- ExperienceBar.lua
self:InitializeBagWatcher() -- BagWatcher.lua
+ self:InitializeWerewolf() -- Werewolf.lua
self:InitializeSettings()
@@ -64,13 +69,15 @@ function Azurah.OnPlayerActivated()
Azurah:ConfigureUltimateOverlays() -- ActionBar.lua
Azurah:ConfigureExperienceBarOverlay() -- ExperienceBar.lua
Azurah:ConfigureBagWatcher() -- BagWatcher.lua
+ Azurah:ConfigureThievery() -- Thievery.lua
+ Azurah:ConfigureWerewolf() -- Werewolf.lua
end
function Azurah.OnStateChanged()
Azurah:ConfigureAttributeFade()
end
-function Azurah.OnPreferredModeChanged() -- eventCode, gamepadPreferred)
+function Azurah.OnPreferredModeChanged(evt, gamepadPreferred)
if (Azurah.uiUnlocked) then
Azurah:LockUI()
end
@@ -78,6 +85,12 @@ function Azurah.OnPreferredModeChanged() -- eventCode, gamepadPreferred)
Azurah:InitializeUnlock()
Azurah:ConfigureTargetIcons()
Azurah:ConfigureExperienceBarOverlay()
+
+ if (gamepadPreferred) then
+ Azurah:ConfigureBagWatcherGamepad()
+ else
+ Azurah:ConfigureBagWatcherKeyboard()
+ end
end
function Azurah.SlashCommand(text)
diff --git a/Defaults.lua b/Defaults.lua
index 683cd19..875a64a 100644
--- a/Defaults.lua
+++ b/Defaults.lua
@@ -2,9 +2,12 @@ local Azurah = _G['Azurah'] -- grab addon table from global
local defaults = {
uiData = {},
+ -- compass pins
compassPinScale = 1.0,
compassHidePinLabel = false,
-
+ -- thievery
+ theftPreventAccidental = false,
+ theftMakeSafer = false,
attributes = {
fadeMinAlpha = 0, -- when full
fadeMaxAlpha = 1, -- when not full
@@ -94,6 +97,15 @@ local defaults = {
fontOutline = 'soft-shadow-thick',
fontSize = 18,
},
+ werewolf = {
+ enabled = false,
+ flashOnExtend = true,
+ iconOnRight = false,
+ fontFace = 'Univers 67',
+ fontColour = {r = 0.9, g = 0.9, b = 0.9, a = 1.0},
+ fontOutline = 'soft-shadow-thick',
+ fontSize = 20,
+ }
}
function Azurah:GetDefaults()
diff --git a/Locales/Local_en.lua b/Locales/Local_en.lua
index ea5690f..f699a32 100644
--- a/Locales/Local_en.lua
+++ b/Locales/Local_en.lua
@@ -1,4 +1,4 @@
-local Azurah = _G['Azurah'] -- grab addon table from global
+local Azurah = _G['Azurah'] -- grab addon table from global
local L = {}
@@ -36,6 +36,7 @@ L.ActiveCombatTips = 'Active Combat Tips'
L.Tutorial = 'Tutorials'
L.CaptureMeter = 'AvA Capture Meter'
L.BagWatcher = 'Bag Watcher'
+L.WerewolfTimer = 'WWolf Timer'
-- --------------------------------------------
-- SETTINGS -----------------------------------
@@ -61,7 +62,7 @@ L.TabButton3 = 'Target'
L.TabButton4 = 'Action Bar'
L.TabButton5 = 'Experience'
L.TabButton6 = 'Bag Watcher'
-L.TabButton7 = 'Thievery'
+L.TabButton7 = 'Werewolf'
L.TabButton8 = 'Profiles'
L.TabHeader1 = 'General Settings'
L.TabHeader2 = 'Player Attribute Settings'
@@ -69,7 +70,7 @@ L.TabHeader3 = 'Target Window Settings'
L.TabHeader4 = 'Action Bar Settings'
L.TabHeader5 = 'Experience Bar Settings'
L.TabHeader6 = 'Bag Watcher Settings'
-L.TabHeader7 = 'Thievery Settings'
+L.TabHeader7 = 'Werewolf Timer Settings'
L.TabHeader8 = 'Profile Settings'
-- unlock window
L.UnlockHeader = 'UI Unlocked'
@@ -85,7 +86,6 @@ L.SettingOverlayFancyTip = 'Set whether to break up large numbers in this overla
L.SettingOverlayFont = 'Overlay Text Font'
L.SettingOverlayStyle = 'Overlay Text Colour & Style'
L.SettingOverlaySize = 'Overlay Text Size'
-
-- settings: general tab (1)
L.GeneralAnchorDesc = 'Unlock to allow the UI windows to be dragged using the mouse, and size scaled using the scrollwheel. An overlay will be shown for each unlocked UI window and will reposition windows even if they are not currently shown (eg, the target health if you have no target).'
L.GeneralAnchorUnlock = 'Unlock UI Windows'
@@ -94,7 +94,12 @@ L.GeneralPinScale = 'Compass Pin Size'
L.GeneralPinScaleTip = 'Set how large the compass pins should be. This size is independant of the size of the compass itself which can be changed when the UI is unlocked.\n\nA setting of 100 is 100% of the default size (no change).'
L.GeneralPinLabel = 'Hide Compass Pin Text'
L.GeneralPinLabelTip = 'Set whether to hide the text that identifies your current \'pin\' target (eg, the name of the quest marker you are currently looking at).\n\nThe default UI setting is Off.'
-
+L.General_TheftHeader = 'Thievery'
+L.General_TheftPrevent = 'Prevent Accidental Theft Of World Items'
+L.General_TheftPreventTip = 'Set whether to prevent the looting of owned items in the world unless you are in sneak mode.\n\nPlease note that this provides no protection against looting containers.'
+L.General_TheftSafer = ' Safer Theft Of World Items'
+L.General_TheftSaferTip = 'Set whether to make the theft of items in the world safer by preventing looting unless you are actually hidden.\n\nPlease note that this provides no protection against looting containers.'
+L.General_TheftSaferWarn = 'This is technically cheating!'
-- settings: attributes tab (2)
L.AttributesFadeMin = 'Visibility: When Full'
L.AttributesFadeMinTip = 'Set how opaque the attribute bars should be when the attribute is full. At 100% the bars will be fully visible, and at 0%, they will be invisible.\n\nThe default UI setting is 0%.'
@@ -109,7 +114,6 @@ L.AttributesOverlayHealth = 'Overlay Text: Health'
L.AttributesOverlayMagicka = 'Overlay Text: Magicka'
L.AttributesOverlayStamina = 'Overlay Text: Stamina'
L.AttributesOverlayFormatTip = 'Set how to display the overlay text for this attribute bar.\n\nThe default UI setting is No Overlay.'
-
-- settings: target tab (3)
L.TargetLockSize = 'Lock Target Size'
L.TargetLockSizeTip = 'Set whether the size of the target bar is locked so it does not change when targetting somebody with bonus health.\n\nThe default UI setting is Off.'
@@ -128,10 +132,8 @@ L.TargetIconAllianceShowTip = 'Set whether to show the target player\'s alliance
L.TargetIconAllianceByName = 'Show Alliance Icon By Nameplate'
L.TargetIconAllianceByNameTip = 'Set whether the alliance icon (if shown) is displayed to the right of the target\'s nameplate instead of to the right of the target\'s health bar.'
L.TargetOverlayFormatTip = 'Set how to display the overlay text for the target bar.\n\nThe default UI setting is No Overlay.'
-
L.BossbarHeader = 'Bossbar Settings'
L.BossbarOverlayFormatTip = 'Set how to display the overlay text for the boss bar. Boss bar shows sum of health values for all active bosses.\n\nThe default UI setting is No Overlay.'
-
-- settings: action bar tab (4)
L.ActionBarHideBindBG = 'Hide Keybind Background'
L.ActionBarHideBindBGTip = 'Set whether the dark background behind the action bar key bindings is visible.'
@@ -148,13 +150,11 @@ L.ActionBarOverlayUltPercent = 'Overlay Text: Ultimate (Percentage)'
L.ActionBarOverlayUltPercentShowTip = 'Set whether to show an overlay over the ultimate button displaying your ultimate level as a percentage.'
L.ActionBarOverlayUltPercentRelative = 'Show Relative Percent'
L.ActionBarOverlayUltPercentRelativeTip = 'Set whether the percentage shown on the overlay is relative to the cost of your slotted ultimate ability instead of a percentage of your maximum ultimate pool of 1000 points.'
-
-- settings: experience bar tab (5)
L.ExperienceDisplayStyle = 'Display Style'
L.ExperienceDisplayStyleTip = 'Set how to display the experience bar.\n\nNote: Even when Always Shown, the bar will be hidden while crafting and when the World Map is open so as not to overlap other windows.'
L.ExperienceOverlayFormatTip = 'Set how to display the overlay text for the experience bar.\n\nThe default UI setting is No Overlay.'
-
--- serttings: bag watcher tab (6)
+-- settings: bag watcher tab (6)
L.Bag_Desc = 'The bag watcher creates a bar (similar to the experience bar in appearance) that shows how full your backpack is. It will show up briefly whenever your bag contents change, and can optionally be set to always show if your bag is almost full.'
L.Bag_Enable = 'Enable Bag Watcher'
L.Bag_ReverseAlignment = 'Reverse Bar Alignment'
@@ -163,16 +163,25 @@ L.Bag_LowSpaceLock = 'Always Show When Low On Space'
L.Bag_LowSpaceLockTip = 'Set whether the bag watcher should always be shown when your backpack is nearly full.'
L.Bag_LowSpaceTrigger = 'Low On Space Trigger Level'
L.Bag_LowSpaceTriggerTip = 'Set how many slots should remain free before considering your backpack to be low on space.'
-
+-- settings: werewolf tab (7)
+L.Werewolf_Desc = 'The werewolf timer is a seperate (movable) window that displays the remaining werewolf transformation time in seconds for an easier way to keep track of how much time you have to hunt. It is initially placed just to the right of the ultimate button.'
+L.Werewolf_Enable = 'Enable Werewolf Timer'
+L.Werewolf_Flash = 'Flash On Time Extension'
+L.Werewolf_FlashTip = 'Set whether the timer icon should flash briefly when the time remaining on your transformation increases.'
+L.Werewolf_IconOnRight = 'Show Icon On The Right'
+L.Werewolf_IconOnRightTip = 'Set whether to have the icon displayed to the right of the timer instead of the left.'
-- settings: profiles tab (8)
-L.ProfileHeader = 'Profiles'
-L.ProfileCharacterList = 'Existing Settings'
-L.ProfileCharacterListTip = 'List of characters that currently have Azurah settings.'
-L.ProfileCopyFrom = 'Copy Settings'
-L.ProfileCopyFromTip = 'Copy the settings of the selected character to the currently logged in character.'
-L.ProfileCopyFromWarn = 'Clicking this button will reload the UI and permanently overwrite this character\'s settings with those of the selected character.\n\nThis cannot be undone.'
-L.Profile_CopyCannotCopy = 'Unable to copy selected profile. Please try again or select another profile.'
-
+L.Profile_Desc = 'Setting profiles can be managed here including the option to enable an account wide profile that will apply the same settings to ALL character\'s on this account. Due to the permanency of these options, management must first be enabled using the checkbox at the bottom of the panel.'
+L.Profile_UseGlobal = 'Use Account Wide Profile'
+L.Profile_UseGlobalWarn = 'Switching between local and global profiles will reload the interface.'
+L.Profile_Copy = 'Select A Profile To Copy'
+L.Profile_CopyTip = 'Select a profile to copy its settings to the currently actrive profile. The active profile will be for either the logged in character or the account wide profile if enabled. The existing profile settings will be permanently overwritten.\n\nThis cannot be undone!'
+L.Profile_CopyButton = 'Copy Profile'
+L.Profile_CopyButtonWarn = 'Copying a profile will reload the interface.'
+L.Profile_Delete = 'Select A Profile To Delete'
+L.Profile_DeleteTip = 'Select a profile to delete its settings from the database. If that character is logged in later, and you are not using the account wide profile, new default settings will be created.\n\nDeleting a profile is permanent!'
+L.Profile_DeleteButton = 'Delete Profile'
+L.Profile_Guard = 'Enable Profile Management'
function Azurah:GetLocale() -- default locale, will be the return unless overwritten
return L
diff --git a/Locales/Local_fr.lua b/Locales/Local_fr.lua
index b2438b2..a530314 100644
--- a/Locales/Local_fr.lua
+++ b/Locales/Local_fr.lua
@@ -1,4 +1,4 @@
-local Azurah = _G['Azurah'] -- grab addon table from global [French (fr) - Translations provided by Ykses (http://www.esoui.com/forums/member.php?u=1521)]
+local Azurah = _G['Azurah'] -- grab addon table from global [French (fr) - Translations provided by Ykses (http://www.esoui.com/forums/member.php?u=1521)]
local L = {}
@@ -37,6 +37,7 @@ L.Tutorial = 'Didacticiels'
L.CaptureMeter = 'AvA capture compteur'
+
-- --------------------------------------------
-- SETTINGS -----------------------------------
-- --------------------------------------------
@@ -82,16 +83,23 @@ L.UnlockResetConfirm = 'Confirmer la réinitialisation'
L.SettingOverlayFormat = 'Format de l\'affichage'
L.SettingOverlayFancy = 'Distinguer les milliers'
L.SettingOverlayFancyTip = 'Par exemple \"10000\" deviendra \"10,000\".'
-L.SettingOverlayStyle = 'Style de l\'affichage'
+
+
-- settings: general tab (1)
L.GeneralAnchorDesc = 'Déverrouiller l\'interface permet de déplacer librement les fenêtres et de régler la taille de celles-ci en utilisant la roulette de la souris. Un cadre est affiché pour chaque fenêtre permettant ainsi de les déplacer même si elles ne sont pas actuellement affichées en jeu (ex : la santé de la cible ou la vigueur de la monture).'
L.GeneralAnchorUnlock = 'Déverrouiller l\'IU'
+
L.GeneralPinScale = 'Taille des icones de la boussole'
L.GeneralPinScaleTip = 'Permet de définir la taille des icones affichés sur la boussole. Ce réglage est indépendant de la taille de la boussole (qui peut être réglée en déverouillant l\'interface).\n\nUne valeur de 100 correspond à 100% (ce qui est la taille par défaut).'
L.GeneralPinLabel = 'Masquer le texte de la boussole'
L.GeneralPinLabelTip = 'Permet de masquer le texte des icones sur la boussole (par exemple, l\'objectif de la quête que vous suivez actuellement).\n\nLe réglage par défaut est \"NON\" (le texte est affiché).'
+
+
+
+
+
-- settings: attributes tab (2)
L.AttributesFadeMin = 'Visibilité : Si remplies'
L.AttributesFadeMinTip = 'Permet de définir la façon dont s\'affichent les barres de caractéristiques de votre personnage quand elles sont pleines. A 100% les barres sont complètement affichées, à 0% les barres sont invisibles.\n\nLe réglage par défaut est 0% (les barres sont masquées lorsqu\'elles sont remplies).'
@@ -106,7 +114,6 @@ L.AttributesOverlayHealth = 'Affichage du texte : Santé'
L.AttributesOverlayMagicka = 'Affichage du texte : Magie'
L.AttributesOverlayStamina = 'Affichage du texte : Vigueur'
L.AttributesOverlayFormatTip = 'Permet de définir la façon dont le texte est affiché sur les barres de caractéristiques.\n\nLe réglage par défaut est \"Ne rien afficher\".'
-
-- settings: target tab (3)
L.TargetLockSize = 'Verrouiller la taille de la cible'
L.TargetLockSizeTip = 'Permet de verrouiller la taille de la barre de santé de la cible afin qu\'elle ne s\'aggrandisse pas lorsqu\'un buff (d\'augmentation de la santé) est actif.'
@@ -125,10 +132,8 @@ L.TargetIconAllianceShowTip = 'Permet d\'afficher (à côté du nom ou de la bar
L.TargetIconAllianceByName = 'Icone d\'Alliance à côté du nom'
L.TargetIconAllianceByNameTip = 'Permet d\'afficher l\'icone de l\'Alliance à côté du nom de la cible au lieu de l\'afficher à côté de la barre de santé.'
L.TargetOverlayFormatTip = 'Permet de définir la façon dont le texte est affiché sur la barre de santé de la cible.\n\nLe réglage par défaut est \"Ne rien afficher\".'
-
L.BossbarHeader = 'Réglages Barre de Boss'
L.BossbarOverlayFormatTip = 'Permet de définir comment est affiché le texte sur la barre de santé des Boss (boussole). Cette dernière affiche un résumé de la santé de tous les Boss actifs.\n\nLe réglage par défaut est \"Ne rien afficher\".'
-
-- settings: action bar tab (4)
L.ActionBarHideBindBG = 'Cacher le fond des raccourcis'
L.ActionBarHideBindBGTip = 'Permet de masquer l\'arrière plan noir qui est affiché derrière les raccourcis claviers de la barre de compétences.'
@@ -145,19 +150,36 @@ L.ActionBarOverlayUltPercent = 'Charge Ultime : Pourcentage'
L.ActionBarOverlayUltPercentShowTip = 'Permet de définir si le pourcentage de la charge Ultime est affichée sur le bouton de la Compétence Ultime.'
L.ActionBarOverlayUltPercentRelative = 'Charge Ultime : Pourcentage relatif'
L.ActionBarOverlayUltPercentRelativeTip = 'Permet de définir si le pourcentage affiché sur le bouton de la Compétence Ultime est relatif à la compétence actuelle ou relatif au maximum de charge possible (1000 points).\n\n\"OUI\" : relatif à la compétence actuelle.\n\"NON\" : relatif au maximum possible.'
-
-- settings: experience bar tab (5)
L.ExperienceDisplayStyle = 'Style de l\'affichage'
L.ExperienceDisplayStyleTip = 'Permet de définir la façon dont la barre d\'expérience s\'affiche.\n\nNote : Même avec l\'option \"Toujours affichée\", la barre sera masquée lors de l\'artisanat ou quand la carte du monde est ouverte, afin de ne pas se superposer à l\'affichage d\'autres informations.'
L.ExperienceOverlayFormatTip = 'Permet de définir la façon dont le texte est affiché sur la barre d\'expérience.\n\nLe réglage par défaut est \"Ne rien afficher\".'
+-- settings: bag watcher tab (6)
+
+
+
+
+
+
+
+
+-- settings: werewolf tab (7)
+
+
+
+
+
-- settings: profiles tab (8)
-L.ProfileHeader = 'Profils'
-L.ProfileCharacterList = 'Réglages existants'
-L.ProfileCharacterListTip = 'Liste des personnages utilisant Azurah.'
-L.ProfileCopyFrom = 'Copier les réglages'
-L.ProfileCopyFromTip = 'Permet de copier les réglages du personnage séléctionné vers le personnage actuellement connecté en jeu.'
-L.ProfileCopyFromWarn = 'Cliquer sur ce bouton rechargera l\'interface, en remplaçant les réglages d\'Azurah avec ceux du personnage séléctionné.\n\nVous ne pourrez pas revenir sur cette action, les nouveaux réglages écraseront les réglages actuels.'
+
+
+
+
+
+
+
+
+
diff --git a/Settings.lua b/Settings.lua
index 5f83bbe..0f71053 100644
--- a/Settings.lua
+++ b/Settings.lua
@@ -1,12 +1,13 @@
-local Azurah = _G['Azurah'] -- grab addon table from global
-local LAM = LibStub('LibAddonMenu-2.0')
-local LMP = LibStub('LibMediaProvider-1.0')
-local L = Azurah:GetLocale()
+local Azurah = _G['Azurah'] -- grab addon table from global
+local LAM = LibStub('LibAddonMenu-2.0')
+local LMP = LibStub('LibMediaProvider-1.0')
+local L = Azurah:GetLocale()
-- UPVALUES --
local WM = GetWindowManager()
local CM = CALLBACK_MANAGER
local tinsert = table.insert
+local tremove = table.remove
local tsort = table.sort
local strformat = string.format
@@ -17,7 +18,6 @@ local dropColourBy = {L.DropColourBy1, L.DropColourBy2, L.DropColourBy3}
local dropColourByRef = {[L.DropColourBy1] = 1, [L.DropColourBy2] = 2, [L.DropColourBy3] = 3}
local dropExpBarStyle = {L.DropExpBarStyle1, L.DropExpBarStyle2, L.DropExpBarStyle3}
local dropExpBarStyleRef = {[L.DropExpBarStyle1] = 1, [L.DropExpBarStyle2] = 2, [L.DropExpBarStyle3] = 3}
-
local dropFontStyle = {'none', 'outline', 'thin-outline', 'thick-outline', 'shadow', 'soft-shadow-thin', 'soft-shadow-thick'}
local tabButtons = {}
@@ -25,10 +25,13 @@ local tabPanels = {}
local lastAddedControl = {}
local settingsGlobalStr = strformat('%s_%s', Azurah.name, 'Settings')
local settingsGlobalStrBtns = strformat('%s_%s', settingsGlobalStr, 'TabButtons')
-local availableProfiles = {} -- profiles avilable to player to copy (either from other characters or built-in choices)
-local profileToCopy = false -- profile to copy (if chosen)
local controlPanel, controlPanelWidth, tabButtonsPanel, tabPanelData
+local profileGuard = false
+local profileCopyList = {}
+local profileDeleteList = {}
+local profileCopyToCopy, profileDeleteToDelete, profileDeleteDropRef
+
-- ------------------------
-- PROFILE FUNCTIONS
@@ -49,44 +52,81 @@ local function CopyTable(src, dest)
end
end
-local function CopyProfileSettings(source)
+local function CopyProfile()
+ local usingGlobal = AzurahDB.Default[GetDisplayName()]['$AccountWide'].useAccountWide
+ local destProfile = (usingGlobal) and '$AccountWide' or GetUnitName('player')
local sourceData, destData
- local dest = GetUnitName('player')
for account, accountData in pairs(AzurahDB.Default) do
- for character, data in pairs(accountData) do
- if (character == source and data.version == 2) then -- source character data (and is of the right version)
- sourceData = data
+ for profile, data in pairs(accountData) do
+ if (profile == profileCopyToCopy) then
+ sourceData = data -- get source data to copy
end
- if (character == dest) then -- dest character data (current character)
- destData = data
+ if (profile == destProfile) then
+ destData = data -- get destination to copy to
end
end
end
if (not sourceData or not destData) then -- something went wrong, abort
- CHAT_SYSTEM:AddMessage(string.format('%s: %s', L.Azurah, L.Profile_CopyCannotCopy))
+ CHAT_SYSTEM:AddMessage(strformat('%s: %s', L.Azurah, 'Error copying profile!'))
else
- CopyTable(sourceData, destData) -- do the copy
+ CopyTable(sourceData, destData)
ReloadUI()
end
end
-local function GetAvailableProfiles()
- local currentPlayer = GetUnitName('player')
+local function DeleteProfile()
+ for account, accountData in pairs(AzurahDB.Default) do
+ for profile, data in pairs(accountData) do
+ if (profile == profileDeleteToDelete) then -- found unwanted profile
+ accountData[profile] = nil
+ break
+ end
+ end
+ end
+
+ for i, profile in ipairs(profileDeleteList) do
+ if (profile == profileDeleteToDelete) then
+ tremove(profileDeleteList, i)
+ break
+ end
+ end
+
+ profileDeleteToDelete = false
+ profileDeleteDropRef:UpdateChoices()
+ profileDeleteDropRef:UpdateValue()
+end
+
+local function PopulateProfileLists()
+ local usingGlobal = AzurahDB.Default[GetDisplayName()]['$AccountWide'].useAccountWide
+ local currentPlayer = GetUnitName('player')
+ local versionDB = Azurah.versionDB
- for account, accountData in pairs(AzurahDB.Default) do
- for player, data in pairs (accountData) do
- if (data.version == 2 and player ~= currentPlayer) then -- only copy 2.X settings, ignore 1.X and current character
- tinsert(availableProfiles, player)
- end
- end
- end
+ for account, accountData in pairs(AzurahDB.Default) do
+ for profile, data in pairs(accountData) do
+ if (data.version == versionDB) then -- only populate current DB version
+ if (usingGlobal) then
+ if (profile ~= '$AccountWide') then
+ tinsert(profileCopyList, profile) -- don't add accountwide to copy selection
+ tinsert(profileDeleteList, profile) -- don't add accountwide to delete selection
+ end
+ else
+ if (profile ~= currentPlayer) then
+ tinsert(profileCopyList, profile) -- don't add current player to copy selection
- -- eventually add suggested default profiles to this list as well kt
+ if (profile ~= '$AccountWide') then
+ tinsert(profileDeleteList, profile) -- don't add accountwide or current player to delete selection
+ end
+ end
+ end
+ end
+ end
+ end
- tsort(availableProfiles)
+ tsort(profileCopyList)
+ tsort(profileDeleteList)
end
@@ -110,6 +150,10 @@ local function CreateWidgets(panelID, panelData)
widget:SetAnchor(TOPLEFT, lastAddedControl[panelID], BOTTOMLEFT, 0, 15)
lastAddedControl[panelID] = widget
end
+
+ if (widget.data.isProfileDeleteDrop) then
+ profileDeleteDropRef = widget -- need a reference for this dropdown to refresh choices list
+ end
end
end
@@ -185,7 +229,7 @@ local function CompleteInitialization(panel)
CreateTabPanel(1) -- create first (General) panel on settings first load
- GetAvailableProfiles() -- populate available profiles
+ PopulateProfileLists() -- populate available profiles for copy and deletion
end
function Azurah:InitializeSettings()
@@ -267,6 +311,41 @@ tabPanelData = {
Azurah:ConfigureCompass()
end,
},
+ -- -----------------------
+ -- THIEVERY
+ -- -----------------------
+ {
+ type = 'header',
+ name = L.General_TheftHeader
+ },
+ {
+ type = 'checkbox',
+ name = L.General_TheftPrevent,
+ tooltip = L.General_TheftPreventTip,
+ getFunc = function()
+ return Azurah.db.theftPreventAccidental
+ end,
+ setFunc = function(v)
+ Azurah.db.theftPreventAccidental = v
+ Azurah:ConfigureThievery()
+ end,
+ },
+ {
+ type = 'checkbox',
+ name = L.General_TheftSafer,
+ tooltip = L.General_TheftSaferTip,
+ warning = L.General_TheftSaferWarn,
+ getFunc = function()
+ return Azurah.db.theftMakeSafer
+ end,
+ setFunc = function(v)
+ Azurah.db.theftMakeSafer = v
+ Azurah:ConfigureThievery()
+ end,
+ disabled = function()
+ return not Azurah.db.theftPreventAccidental
+ end
+ },
},
-- -----------------------
-- ATTRIBUTES PANEL
@@ -1194,40 +1273,220 @@ tabPanelData = {
},
},
-- ----------------------------
- -- THIEVERY PANEL
+ -- WEREWOLF PANEL
-- ----------------------------
[7] = {
-
+ -- -----------------------
+ -- WEREWOLF
+ -- -----------------------
+ {
+ type = 'description',
+ text = L.Werewolf_Desc
+ },
+ {
+ type = 'checkbox',
+ name = L.Werewolf_Enable,
+ getFunc = function()
+ return Azurah.db.werewolf.enabled
+ end,
+ setFunc = function(v)
+ Azurah.db.werewolf.enabled = v
+ Azurah:ConfigureWerewolf()
+ end,
+ },
+ {
+ type = 'checkbox',
+ name = L.Werewolf_Flash,
+ tooltip = L.Werewolf_FlashTip,
+ getFunc = function()
+ return Azurah.db.werewolf.flashOnExtend
+ end,
+ setFunc = function(v)
+ Azurah.db.werewolf.flashOnExtend = v
+ Azurah:ConfigureWerewolf()
+ end,
+ disabled = function()
+ return not Azurah.db.werewolf.enabled
+ end
+ },
+ {
+ type = 'checkbox',
+ name = L.Werewolf_IconOnRight,
+ tooltip = L.Werewolf_IconOnRightTip,
+ getFunc = function()
+ return Azurah.db.werewolf.iconOnRight
+ end,
+ setFunc = function(v)
+ Azurah.db.werewolf.iconOnRight = v
+ Azurah:ConfigureWerewolf()
+ end,
+ disabled = function()
+ return not Azurah.db.werewolf.enabled
+ end
+ },
+ {
+ type = 'dropdown',
+ name = L.SettingOverlayFont,
+ choices = LMP:List('font'),
+ getFunc = function()
+ return Azurah.db.werewolf.fontFace
+ end,
+ setFunc = function(v)
+ Azurah.db.werewolf.fontFace = v
+ Azurah:ConfigureWerewolf()
+ end,
+ disabled = function()
+ return not Azurah.db.werewolf.enabled
+ end
+ },
+ {
+ type = 'dropdown',
+ name = L.SettingOverlayStyle,
+ choices = dropFontStyle,
+ getFunc = function()
+ return Azurah.db.werewolf.fontOutline
+ end,
+ setFunc = function(v)
+ Azurah.db.werewolf.fontOutline = v
+ Azurah:ConfigureWerewolf()
+ end,
+ disabled = function()
+ return not Azurah.db.werewolf.enabled
+ end
+ },
+ {
+ type = 'colorpicker',
+ getFunc = function()
+ return Azurah.db.werewolf.fontColour.r, Azurah.db.werewolf.fontColour.g, Azurah.db.werewolf.fontColour.b, Azurah.db.werewolf.fontColour.a
+ end,
+ setFunc = function(r, g, b, a)
+ Azurah.db.werewolf.fontColour.r = r
+ Azurah.db.werewolf.fontColour.g = g
+ Azurah.db.werewolf.fontColour.b = b
+ Azurah.db.werewolf.fontColour.a = a
+ Azurah:ConfigureWerewolf()
+ end,
+ disabled = function()
+ return not Azurah.db.werewolf.enabled
+ end,
+ isFontColour = true,
+ },
+ {
+ type = 'slider',
+ name = L.SettingOverlaySize,
+ min = 8,
+ max = 32,
+ getFunc = function()
+ return Azurah.db.werewolf.fontSize
+ end,
+ setFunc = function(v)
+ Azurah.db.werewolf.fontSize = v
+ Azurah:ConfigureWerewolf()
+ end,
+ disabled = function()
+ return not Azurah.db.werewolf.enabled
+ end
+ },
},
-- ----------------------------
-- PROFILES PANEL
-- ----------------------------
[8] = {
{
- type = "dropdown",
- name = L.ProfileCharacterList,
- tooltip = L.ProfileCharacterListTip,
- choices = availableProfiles,
+ type = 'description',
+ text = L.Profile_Desc
+ },
+ {
+ type = 'checkbox',
+ name = L.Profile_UseGlobal,
+ warning = L.Profile_UseGlobalWarn,
getFunc = function()
- if (#availableProfiles >= 1) then -- if there are entries, set the first as default
- if (not profileToCopy) then -- profile hasn't been set yet
- profileToCopy = availableProfiles[1]
- end
-
- return availableProfiles[1]
+ return AzurahDB.Default[GetDisplayName()]['$AccountWide'].useAccountWide
+ end,
+ setFunc = function(v)
+ AzurahDB.Default[GetDisplayName()]['$AccountWide'].useAccountWide = v
+ ReloadUI()
+ end,
+ disabled = function()
+ return not profileGuard
+ end
+ },
+ {
+ type = 'dropdown',
+ name = L.Profile_Copy,
+ tooltip = L.Profile_CopyTip,
+ choices = profileCopyList,
+ getFunc = function()
+ if (#profileCopyList >= 1) then -- there are entries, set first as default
+ profileCopyToCopy = profileCopyList[1]
+ return profileCopyList[1]
+ end
+ end,
+ setFunc = function(v)
+ profileCopyToCopy = v
+ end,
+ disabled = function()
+ return not profileGuard
+ end
+ },
+ {
+ type = 'button',
+ name = L.Profile_CopyButton,
+ warning = L.Profile_CopyButtonWarn,
+ func = function(btn)
+ CopyProfile()
+ end,
+ disabled = function()
+ return not profileGuard
+ end
+ },
+ {
+ type = 'dropdown',
+ name = L.Profile_Delete,
+ tooltip = L.Profile_DeleteTip,
+ choices = profileDeleteList,
+ getFunc = function()
+ if (#profileDeleteList >= 1) then
+ if (not profileDeleteToDelete) then -- nothing selected yet, return first
+ profileDeleteToDelete = profileDeleteList[1]
+ return profileDeleteList[1]
+ else
+ return profileDeleteToDelete
end
- end,
- setFunc = function(arg)
- profileToCopy = arg
+ end
+ end,
+ setFunc = function(v)
+ profileDeleteToDelete = v
end,
+ disabled = function()
+ return not profileGuard
+ end,
+ isProfileDeleteDrop = true
},
{
- type = "button",
- name = L.ProfileCopyFrom,
- tooltip = L.ProfileCopyFromTip,
- warning = L.ProfileCopyFromWarn,
+ type = 'button',
+ name = L.Profile_DeleteButton,
func = function(btn)
- CopyProfileSettings(profileToCopy)
+ DeleteProfile()
+ end,
+ disabled = function()
+ return not profileGuard
+ end
+ },
+ {
+ type = 'description'
+ },
+ {
+ type = 'header'
+ },
+ {
+ type = 'checkbox',
+ name = L.Profile_Guard,
+ getFunc = function()
+ return profileGuard
+ end,
+ setFunc = function(v)
+ profileGuard = v
end,
},
},
diff --git a/Thievery.lua b/Thievery.lua
new file mode 100644
index 0000000..d786e7b
--- /dev/null
+++ b/Thievery.lua
@@ -0,0 +1,70 @@
+local Azurah = _G['Azurah'] -- grab addon table from global
+local LMP = LibStub('LibMediaProvider-1.0')
+
+-- UPVALUES --
+local GetGameCameraInteractableActionInfo = GetGameCameraInteractableActionInfo
+local STR_LOOT_STEAL = GetString(SI_LOOT_STEAL)
+
+local customStealthStates = { -- so we can manipulate 'safer theft'
+ [STEALTH_STATE_NONE] = false,
+ [STEALTH_STATE_DETECTED] = true,
+ [STEALTH_STATE_HIDING] = true,
+ [STEALTH_STATE_HIDDEN] = true,
+ [STEALTH_STATE_STEALTH] = true,
+ [STEALTH_STATE_HIDDEN_ALMOST_DETECTED] = true,
+ [STEALTH_STATE_STEALTH_ALMOST_DETECTED] = true,
+}
+local theftPreventAccidental, theftMakeSafer
+local interactAction, interactIsOwned
+local StartInteractionOrig
+local isHidden
+
+
+local function Azurah_StartInteraction(...)
+ interactAction, _, _, interactIsOwned = GetGameCameraInteractableActionInfo()
+
+ if ((not isHidden) and interactIsOwned and interactAction == STR_LOOT_STEAL) then
+ return true
+ else
+ return StartInteractionOrig(...)
+ end
+end
+
+local function OnStealthStateChanged(evt, unit, stealthState)
+ if (unit ~= 'player') then return end
+
+ isHidden = customStealthStates[stealthState]
+end
+
+
+-- ------------------------
+-- CONFIGURATION
+-- ------------------------
+function Azurah:ConfigureThievery()
+ -- setup local refs to database entries
+ theftPreventAccidental = self.db.theftPreventAccidental
+ theftMakeSafer = self.db.theftMakeSafer
+
+ if (theftPreventAccidental) then
+ customStealthStates[STEALTH_STATE_DETECTED] = (not theftMakeSafer)
+ customStealthStates[STEALTH_STATE_HIDING] = (not theftMakeSafer)
+ customStealthStates[STEALTH_STATE_STEALTH] = (not theftMakeSafer)
+ customStealthStates[STEALTH_STATE_STEALTH_ALMOST_DETECTED] = (not theftMakeSafer)
+
+ EVENT_MANAGER:RegisterForEvent(self.name .. 'Thievery', EVENT_STEALTH_STATE_CHANGED, OnStealthStateChanged)
+
+ isHidden = customStealthStates[GetUnitStealthState('player')]
+
+ if (not StartInteractionOrig) then
+ StartInteractionOrig = FISHING_MANAGER.StartInteraction
+ end
+
+ FISHING_MANAGER.StartInteraction = Azurah_StartInteraction
+ else
+ EVENT_MANAGER:UnregisterForEvent(self.name .. 'Thievery', EVENT_STEALTH_STATE_CHANGED)
+
+ if (StartInteractionOrig) then -- only unset if we set it in this session
+ FISHING_MANAGER.StartInteraction = StartInteractionOrig
+ end
+ end
+end
diff --git a/Unlock.lua b/Unlock.lua
index 034f97a..8d615cd 100644
--- a/Unlock.lua
+++ b/Unlock.lua
@@ -33,7 +33,8 @@ local uiFrames = {
['ZO_ActiveCombatTipsTip'] = {1, L.ActiveCombatTips, 250, 20},
['ZO_TutorialHudInfoTipKeyboard'] = {1, L.Tutorial},
['ZO_ObjectiveCaptureMeter'] = {1, L.CaptureMeter, 128, 128},
- ['Azurah_BagWatcher'] = {1, L.BagWatcher},
+ ['Azurah_BagWatcher'] = {1, strformat('[%s] %s', L.Azurah, L.BagWatcher)},
+ ['Azurah_WerewolfTimer'] = {1, strformat('[%s] %s', L.Azurah, L.WerewolfTimer)},
},
gamepad = {
['ZO_PlayerAttributeHealth'] = {1, L.Health},
@@ -57,7 +58,8 @@ local uiFrames = {
['ZO_ActiveCombatTipsTip'] = {1, L.ActiveCombatTips, 250, 20},
['ZO_TutorialHudInfoTipGamepad'] = {1, L.Tutorial},
['ZO_ObjectiveCaptureMeter'] = {1, L.CaptureMeter, 128, 128},
- ['Azurah_BagWatcher'] = {1, L.BagWatcher},
+ ['Azurah_BagWatcher'] = {1, strformat('[%s] %s', L.Azurah, L.BagWatcher)},
+ ['Azurah_WerewolfTimer'] = {1, strformat('[%s] %s', L.Azurah, L.WerewolfTimer)},
}
}
diff --git a/Werewolf.lua b/Werewolf.lua
new file mode 100644
index 0000000..7afdf58
--- /dev/null
+++ b/Werewolf.lua
@@ -0,0 +1,153 @@
+local Azurah = _G['Azurah'] -- grab addon table from global
+local Werewolf = _G['Azurah_WerewolfTimer'] -- grab werewolf control
+local LMP = LibStub('LibMediaProvider-1.0')
+
+-- UPVALUES --
+local GetGameTimeMillis = GetGameTimeMilliseconds
+
+local flashOnExtend = false
+local SetFinishTime -- onupdate external function ref
+local db
+
+
+-- ------------------------
+-- TIMER UPDATE HANDLER
+do ------------------------
+ local strformat = string.format
+
+ local UPDATE_RATE = 0.1
+ local nextUpdate = 0
+ local finishTime = 0
+ local timeRemaining
+
+ local function OnUpdate(self, updateTime)
+ if (updateTime >= nextUpdate) then
+ timeRemaining = finishTime - updateTime
+
+ if (timeRemaining <= 0) then -- time expired before event was called, hide just incase
+ self:SetHidden(true)
+ else
+ self.overlay:SetText(strformat('%ds', timeRemaining))
+ end
+
+ nextUpdate = updateTime + UPDATE_RATE
+ end
+ end
+
+ SetFinishTime = function(finish)
+ if (flashOnExtend and (finish > (finishTime + 2.5))) then -- duration has been increased notably, so flash
+ if (not Werewolf.flashAnim:IsPlaying()) then
+ Werewolf.flashAnim:PlayFromStart()
+ end
+ end
+
+ finishTime = finish -- set value locally for speed
+ end
+
+ Werewolf:SetHandler('OnUpdate', OnUpdate)
+end
+
+-- ------------------------
+-- EVENT HANDLERS
+-- ------------------------
+local function OnWerewolfStateChanged(evt, isWerewolf)
+ if (isWerewolf) then
+ SetFinishTime((GetGameTimeMillis() / 1000) + 30)
+ Werewolf:SetHidden(false)
+ else
+ Werewolf:SetHidden(true)
+ end
+end
+
+local function OnPowerUpdate(evt, unitTag, powerIndex, powerType, powerValue, powerMax, powerEffMax)
+ SetFinishTime((GetGameTimeMillis() / 1000) + (powerValue * 0.03))
+end
+
+
+-- ------------------------
+-- CONSTRUCTION
+-- ------------------------
+local function AddControl(parent, cType, level)
+ local c = WINDOW_MANAGER:CreateControl(nil, parent, cType)
+ c:SetDrawLayer(DL_CONTROLS)
+ c:SetDrawLevel(level)
+ return c, c
+end
+
+local function BuildWerewolfTimer()
+ local ctrl
+
+ Werewolf.icon, ctrl = AddControl(Werewolf, CT_TEXTURE, 2)
+ ctrl:SetDimensions(48, 48)
+ ctrl:SetTexture([[esoui/art/progression/progression_indexicon_world_up.dds]])
+
+ Werewolf.flashIcon, ctrl = AddControl(Werewolf, CT_TEXTURE, 1)
+ ctrl:SetDimensions(48, 48)
+ ctrl:SetTexture([[esoui/art/progression/progression_indexicon_world_down.dds]])
+ ctrl:SetAnchor(CENTER, Werewolf.icon, CENTER, 0, 0)
+ ctrl:SetAlpha(0)
+
+ Werewolf.overlay = Azurah:CreateOverlay(Werewolf.icon, LEFT, RIGHT, -3, 0, nil, nil, nil, TEXT_ALIGN_LEFT)
+
+ -- animation for when remaining time increases
+ ctrl = ANIMATION_MANAGER:CreateTimeline()
+ ctrl:SetPlaybackType(ANIMATION_PLAYBACK_ONE_SHOT)
+ Werewolf.flashAnim = ctrl
+ ctrl = Werewolf.flashAnim:InsertAnimation(ANIMATION_ALPHA, Werewolf.flashIcon, 0)
+ ctrl:SetDuration(50)
+ ctrl:SetEasingFunction(ZO_LinearEase)
+ ctrl:SetAlphaValues(0, 1)
+ ctrl = Werewolf.flashAnim:InsertAnimation(ANIMATION_ALPHA, Werewolf.flashIcon, 250)
+ ctrl:SetDuration(200)
+ ctrl:SetEasingFunction(ZO_LinearEase)
+ ctrl:SetAlphaValues(1, 0)
+
+ Werewolf:SetHidden(true)
+end
+
+
+-- ------------------------
+-- CONFIGURATION
+-- ------------------------
+function Azurah:ConfigureWerewolf()
+ if (db.enabled) then
+ if (not Werewolf.icon) then -- build timer
+ BuildWerewolfTimer()
+ end
+
+ Werewolf.icon:ClearAnchors()
+ Werewolf.overlay:ClearAnchors()
+ Werewolf.overlay:SetFont(string.format('%s|%d|%s', LMP:Fetch('font', db.fontFace), db.fontSize, db.fontOutline))
+ Werewolf.overlay:SetColor(db.fontColour.r, db.fontColour.g, db.fontColour.b, db.fontColour.a)
+
+ if (db.iconOnRight) then
+ Werewolf.icon:SetAnchor(RIGHT, Werewolf, RIGHT, 0, 0)
+ Werewolf.overlay:SetHorizontalAlignment(TEXT_ALIGN_RIGHT)
+ Werewolf.overlay:SetAnchor(RIGHT, Werewolf.icon, LEFT, 3, 0)
+ else
+ Werewolf.icon:SetAnchor(LEFT, Werewolf, LEFT, 0, 0)
+ Werewolf.overlay:SetHorizontalAlignment(TEXT_ALIGN_LEFT)
+ Werewolf.overlay:SetAnchor(LEFT, Werewolf.icon, RIGHT, -3, 0)
+ end
+
+ flashOnExtend = db.flashOnExtend
+
+ EVENT_MANAGER:RegisterForEvent(self.name .. 'Werewolf', EVENT_WEREWOLF_STATE_CHANGED, OnWerewolfStateChanged)
+ EVENT_MANAGER:RegisterForEvent(self.name .. 'Werewolf', EVENT_POWER_UPDATE, OnPowerUpdate)
+ EVENT_MANAGER:AddFilterForEvent(self.name .. 'Werewolf', EVENT_POWER_UPDATE, REGISTER_FILTER_POWER_TYPE, POWERTYPE_WEREWOLF)
+ EVENT_MANAGER:AddFilterForEvent(self.name .. 'Werewolf', EVENT_POWER_UPDATE, REGISTER_FILTER_UNIT_TAG, 'player')
+ else
+ EVENT_MANAGER:UnregisterForEvent(self.name .. 'Werewolf', EVENT_WEREWOLF_STATE_CHANGED)
+ EVENT_MANAGER:UnregisterForEvent(self.name .. 'Werewolf', EVENT_POWER_UPDATE)
+
+ Werewolf:SetHidden(true)
+ end
+end
+
+
+-- ------------------------
+-- INITIALIZATION
+-- ------------------------
+function Azurah:InitializeWerewolf()
+ db = self.db.werewolf -- local db reference
+end