diff --git a/esoui/ingame/hud/hudinfamymeter.lua b/esoui/ingame/hud/hudinfamymeter.lua
index 13f081c..89c0545 100755
--- a/esoui/ingame/hud/hudinfamymeter.lua
+++ b/esoui/ingame/hud/hudinfamymeter.lua
@@ -16,6 +16,16 @@ local INFAMY_METER_SLOW_FADE_TIME = 1400 -- in milliseconds
local INFAMY_METER_SLOW_FADE_DELAY = 600 -- in milliseconds
local INFAMY_METER_FADE_TIME = 200 -- in milliseconds
+local CENTER_ICON_STATE_DAGGER_GREY = 1
+local CENTER_ICON_STATE_DAGGER_RED = 2
+local CENTER_ICON_STATE_EYE = 3
+
+local GREY_DAGGER_ICON = "EsoUI/Art/HUD/infamy_dagger-grey.dds"
+local RED_DAGGER_ICON = "EsoUI/Art/HUD/infamy_dagger-red.dds"
+local DAGGER_ICON_CUTOUT = "EsoUI/Art/HUD/infamy_dagger-cutout.dds"
+local RED_EYE_ICON = "EsoUI/Art/HUD/trespassing_eye-red.dds"
+local EYE_ICON_CUTOUT = "EsoUI/Art/HUD/trespassing_eye-cutout.dds"
+
local ZO_HUDInfamyMeter = ZO_Object:Subclass()
function ZO_HUDInfamyMeter:New(...)
@@ -24,21 +34,36 @@ function ZO_HUDInfamyMeter:New(...)
return object
end
+function ZO_HUDInfamyMeter:UpdateInfamyMeterState(infamy, bounty, isKOS, isTrespassing)
+ self.infamyMeterState["infamy"] = infamy or GetInfamy()
+ self.infamyMeterState["bounty"] = bounty or GetBounty()
+
+ if isKOS ~= nil then
+ self.infamyMeterState["isKOS"] = isKOS
+ else
+ self.infamyMeterState["isKOS"] = IsKillOnSight()
+ end
+
+ if isTrespassing ~= nil then
+ self.infamyMeterState["isTrespassing"] = isTrespassing
+ else
+ self.infamyMeterState["isTrespassing"] = IsTrespassing()
+ end
+end
+
+function ZO_HUDInfamyMeter:GetOldInfamyMeterState()
+ return self.infamyMeterState["infamy"], self.infamyMeterState["bounty"], self.infamyMeterState["isKOS"], self.infamyMeterState["isTrespassing"]
+end
+
function ZO_HUDInfamyMeter:Initialize(control)
-- Initialize state
self.nextUpdateTime = 0
self.hiddenExternalRequest = false
self.meterTotal = GetInfamyMeterSize()
- self.wasKOS = IsKillOnSight()
- self.infamy = GetInfamy()
- self.bounty = GetBounty()
-
- self.oldInfamy = self.infamy
- self.oldBounty = self.bounty
+ self.infamyMeterState = {}
+ self:UpdateInfamyMeterState(0, 0, false, false)
- self.playerOwesGold = true -- This controls the color of the currency label. When Enforcers get implemented, this variable will reflect
- -- whether the player is owed gold (reward) or owes gold (bounty). But for now, only the latter is possible.
self.isInGamepadMode = IsInGamepadPreferredMode()
self.currencyOptions =
@@ -57,7 +82,8 @@ function ZO_HUDInfamyMeter:Initialize(control)
self.meterFrame = control:GetNamedChild("Frame")
self.infamyBar = control:GetNamedChild("InfamyBar")
self.bountyBar = control:GetNamedChild("BountyBar")
- self.kosIcon = control:GetNamedChild("KOSIcon")
+ self.centerIconAnimatingTexture = control:GetNamedChild("CenterIconAnimatingTexture")
+ self.centerIconPersistentTexture = control:GetNamedChild("CenterIconPersistentTexture")
self.bountyLabel = control:GetNamedChild("BountyDisplay")
-- Set up fade in/out animations
@@ -67,26 +93,33 @@ function ZO_HUDInfamyMeter:Initialize(control)
-- Initialize bar states and animations
self.infamyBar.easeAnimation = ANIMATION_MANAGER:CreateTimelineFromVirtual("ZO_HUDInfamyMeterEasing")
self.infamyBar.startPercent = 0
- self.infamyBar.endPercent = self.infamy / self.meterTotal
+ self.infamyBar.endPercent = self.infamyMeterState["infamy"] / self.meterTotal
self.bountyBar.easeAnimation = ANIMATION_MANAGER:CreateTimelineFromVirtual("ZO_HUDInfamyMeterEasing")
self.bountyBar.startPercent = 0
- self.bountyBar.endPercent = self.bounty / self.meterTotal
+ self.bountyBar.endPercent = self.infamyMeterState["bounty"] / self.meterTotal
+
+ -- Initialize Center Icon and its animations
+ self.centerIconCutoutInAnimation = ANIMATION_MANAGER:CreateTimelineFromVirtual("ZO_HUDInfamyMeterCenterIconCutoutIn")
+ self.centerIconCutoutInAnimation:GetAnimation(1):SetAnimatedControl(self.centerIconAnimatingTexture)
+ self.centerIconCutoutInAnimation:GetAnimation(2):SetAnimatedControl(self.centerIconAnimatingTexture)
+ self.centerIconCutoutInAnimation:GetAnimation(3):SetAnimatedControl(self.centerIconAnimatingTexture)
+ self.centerIconCutoutInAnimation:GetAnimation(4):SetAnimatedControl(self.centerIconPersistentTexture)
- -- Initialize KOS Icon
- self.kosIcon.bounceAnimation = ANIMATION_MANAGER:CreateTimelineFromVirtual("ZO_HUDInfamyMeterKOSIconBounce", self.kosIcon)
+ self.centerIconScaleOutAnimation = ANIMATION_MANAGER:CreateTimelineFromVirtual("ZO_HUDInfamyMeterCenterIconScaleOut")
+ self.centerIconScaleOutAnimation:GetAnimation(1):SetAnimatedControl(self.centerIconAnimatingTexture)
+ self.centerIconScaleOutAnimation:GetAnimation(2):SetAnimatedControl(self.centerIconAnimatingTexture)
+ self.centerIconScaleOutAnimation:GetAnimation(3):SetAnimatedControl(self.centerIconPersistentTexture)
-- Register for events
control:RegisterForEvent(EVENT_JUSTICE_INFAMY_UPDATED, function()
- local infamy = GetInfamy()
- if IsInJusticeEnabledZone() and not self.hiddenExternalRequest and infamy ~= 0 and infamy ~= self.oldInfamy then
+ if self:ShouldProcessUpdateEvent() then
self:OnInfamyUpdated(UPDATE_TYPE_EVENT)
end
end)
control:RegisterForEvent(EVENT_LEVEL_UPDATE, function()
- local infamy = GetInfamy()
- if IsInJusticeEnabledZone() and not self.hiddenExternalRequest and infamy ~= 0 and infamy ~= self.oldInfamy then
+ if self:ShouldProcessUpdateEvent() then
self:OnInfamyUpdated(UPDATE_TYPE_EVENT)
end
end)
@@ -94,7 +127,7 @@ function ZO_HUDInfamyMeter:Initialize(control)
control:RegisterForEvent(EVENT_PLAYER_ACTIVATED, function()
local infamy = GetInfamy()
if IsInJusticeEnabledZone() then
- if infamy ~= 0 then
+ if self:ShouldProcessUpdateEvent() then
self:OnInfamyUpdated(UPDATE_TYPE_EVENT)
end
else
@@ -103,6 +136,15 @@ function ZO_HUDInfamyMeter:Initialize(control)
end)
end
+function ZO_HUDInfamyMeter:ShouldProcessUpdateEvent()
+ local infamy = GetInfamy()
+ local isKOS = IsKillOnSight()
+ local isTrespassing = IsTrespassing()
+ return IsInJusticeEnabledZone()
+ and not self.hiddenExternalRequest
+ and ((infamy ~= 0 and infamy ~= self.infamyMeterState["infamy"]) or isTrespassing ~= self.infamyMeterState["isTrespassing"])
+end
+
function ZO_HUDInfamyMeter:Update(time)
if self.nextUpdateTime <= time and not self.hiddenExternalRequest and IsInJusticeEnabledZone() then
self.nextUpdateTime = time + INFAMY_METER_UPDATE_DELAY_SECONDS
@@ -111,11 +153,12 @@ function ZO_HUDInfamyMeter:Update(time)
end
function ZO_HUDInfamyMeter:OnInfamyUpdated(updateType)
- local isKOS = IsKillOnSight()
- self.infamy = GetInfamy()
- self.bounty = GetBounty()
+ local oldInfamy, oldBounty, wasKOS, wasTrespassing = self:GetOldInfamyMeterState()
+ self:UpdateInfamyMeterState()
- if self.infamy ~= self.oldInfamy or updateType == UPDATE_TYPE_EVENT then
+ local gamepadModeSwitchUpdate = IsInGamepadPreferredMode() ~= self.isInGamepadMode
+
+ if oldInfamy ~= self.infamyMeterState["infamy"] or updateType == UPDATE_TYPE_EVENT or gamepadModeSwitchUpdate then
-- Update frame and bars if we're switching between PC and console mode
if IsInGamepadPreferredMode() and not self.isInGamepadMode then
self.currencyOptions.font = "ZoFontGamepadHeaderDataValue"
@@ -131,7 +174,7 @@ function ZO_HUDInfamyMeter:OnInfamyUpdated(updateType)
end
-- Hide or show meter
- if self.infamy == 0 then
+ if self.infamyMeterState["infamy"] == 0 then
self.fadeAnim:FadeOut(INFAMY_METER_SLOW_FADE_DELAY, INFAMY_METER_SLOW_FADE_TIME, ZO_ALPHA_ANIMATION_OPTION_FORCE_ALPHA, function() self.control:SetHidden(true) end)
else
self.control:SetHidden(false)
@@ -139,32 +182,36 @@ function ZO_HUDInfamyMeter:OnInfamyUpdated(updateType)
end
-- Update bars
- self:UpdateBar(self.infamyBar, self.infamy, updateType)
- self:UpdateBar(self.bountyBar, self.bounty, updateType)
+ self:UpdateBar(self.infamyBar, self.infamyMeterState["infamy"], updateType)
+ self:UpdateBar(self.bountyBar, self.infamyMeterState["bounty"], updateType)
- -- Update KoS icon
- if isKOS then
- if self.wasKOS then
- self.kosIcon:SetAlpha(1)
- else
- self.kosIcon.bounceAnimation:PlayFromStart()
- end
- else
- if self.wasKOS then
- self.kosIcon.bounceAnimation:PlayFromEnd()
- else
- self.kosIcon:SetAlpha(0)
- end
- end
+ -- Update trespassing/KOS icon
+ self:AnimateCenterIcon(wasKOS, wasTrespassing)
-- Update label
- ZO_CurrencyControl_SetSimpleCurrency(self.bountyLabel, CURT_MONEY, GetFullBountyPayoffAmount(), self.currencyOptions, CURRENCY_SHOW_ALL, self.playerOwesGold)
+ ZO_CurrencyControl_SetSimpleCurrency(self.bountyLabel, CURT_MONEY, GetFullBountyPayoffAmount(), self.currencyOptions, CURRENCY_SHOW_ALL, true)
-- Fire center-screen announcement if we updated below a threshold
- local infamyLevel = GetInfamyLevel(self.infamy)
- local oldInfamyLevel = GetInfamyLevel(self.oldInfamy)
- if infamyLevel ~= oldInfamyLevel then
+ local infamyLevel = GetInfamyLevel(self.infamyMeterState["infamy"])
+ local oldInfamyLevel = GetInfamyLevel(oldInfamy)
+
-- Fire CSA
+ if self.infamyMeterState["isTrespassing"] ~= wasTrespassing then
+ local sound, primaryMessage, secondaryMessage
+ if wasTrespassing then
+ sound = SOUNDS.JUSTICE_NO_LONGER_KOS
+ primaryMessage = zo_strformat(SI_JUSTICE_CSA, GetString(SI_JUSTICE_NO_LONGER_TRESPASSING_PRIMARY))
+ secondaryMessage = zo_strformat(SI_JUSTICE_CSA, GetString(SI_JUSTICE_NO_LONGER_TRESPASSING_SECONDARY))
+ else
+ TriggerTutorial(TUTORIAL_TRIGGER_TRESPASS_SUBZONE_ENTERED)
+ sound = SOUNDS.JUSTICE_NOW_KOS
+ primaryMessage = zo_strformat(SI_JUSTICE_CSA, GetString(SI_JUSTICE_NOW_TRESPASSING_PRIMARY))
+ secondaryMessage = zo_strformat(SI_JUSTICE_CSA, GetString(SI_JUSTICE_NOW_TRESPASSING_SECONDARY))
+ end
+
+ CENTER_SCREEN_ANNOUNCE:AddMessage(EVENT_JUSTICE_INFAMY_UPDATED, CSA_EVENT_COMBINED_TEXT, sound, primaryMessage, secondaryMessage)
+
+ elseif infamyLevel ~= oldInfamyLevel then
local sound, primaryMessage, secondaryMessage, icon
if oldInfamyLevel == INFAMY_THRESHOLD_FUGITIVE then
sound = SOUNDS.JUSTICE_NO_LONGER_KOS
@@ -200,9 +247,34 @@ function ZO_HUDInfamyMeter:OnInfamyUpdated(updateType)
)
end
end
+end
- self.wasKOS = isKOS
- self.oldInfamy = self.infamy
+function ZO_HUDInfamyMeter:AnimateCenterIcon(wasKOS, wasTrespassing)
+ if self.infamyMeterState["isTrespassing"] then
+ if not wasTrespassing then
+ self.centerIconAnimatingTexture:SetTexture(EYE_ICON_CUTOUT)
+ self.centerIconPersistentTexture:SetTexture(RED_EYE_ICON)
+ self.centerIconPersistentTexture:SetAlpha(0)
+ self.centerIconCutoutInAnimation:PlayFromStart()
+ end
+ elseif self.infamyMeterState["isKOS"] then
+ if wasTrespassing then
+ self.centerIconAnimatingTexture:SetTexture(RED_EYE_ICON)
+ self.centerIconPersistentTexture:SetTexture(RED_DAGGER_ICON)
+ self.centerIconScaleOutAnimation:PlayFromStart()
+ elseif not wasKOS then
+ self.centerIconAnimatingTexture:SetTexture(DAGGER_ICON_CUTOUT)
+ self.centerIconPersistentTexture:SetTexture(RED_DAGGER_ICON)
+ self.centerIconPersistentTexture:SetAlpha(0)
+ self.centerIconCutoutInAnimation:PlayFromStart()
+ end
+ else
+ if wasTrespassing or wasKOS then
+ self.centerIconAnimatingTexture:SetTexture(self.centerIconPersistentTexture:GetTextureFileName())
+ self.centerIconPersistentTexture:SetTexture(GREY_DAGGER_ICON)
+ self.centerIconScaleOutAnimation:PlayFromStart()
+ end
+ end
end
function ZO_HUDInfamyMeter:UpdateBar(bar, newValue, updateType)
@@ -223,9 +295,10 @@ end
function ZO_HUDInfamyMeter:AnimateMeter(progress)
local infamyFillPercentage = zo_min((progress * (self.infamyBar.endPercent - self.infamyBar.startPercent)) + self.infamyBar.startPercent, 1)
local bountyFillPercentage = zo_min((progress * (self.bountyBar.endPercent - self.bountyBar.startPercent)) + self.bountyBar.startPercent, 1)
- local minPercentage = self.infamy ~= 0 and MIN_BAR_PERCENTAGE or 0
- self:SetBarValue(self.infamyBar, zo_max(infamyFillPercentage, minPercentage))
- self:SetBarValue(self.bountyBar, zo_max(bountyFillPercentage, minPercentage))
+ local infamyMinPercentage = self.infamyMeterState["infamy"] ~= 0 and MIN_BAR_PERCENTAGE or 0
+ local bountyMinPercentage = self.infamyMeterState["bounty"] ~= 0 and MIN_BAR_PERCENTAGE or 0
+ self:SetBarValue(self.infamyBar, zo_max(infamyFillPercentage, infamyMinPercentage))
+ self:SetBarValue(self.bountyBar, zo_max(bountyFillPercentage, bountyMinPercentage))
end
function ZO_HUDInfamyMeter:SetBarValue(bar, percentFilled)
@@ -236,7 +309,7 @@ function ZO_HUDInfamyMeter:RequestHidden(hidden)
if hidden ~= self.hiddenExternalRequest then
if hidden then
self.fadeAnim:FadeOut(0, INFAMY_METER_FADE_TIME, ZO_ALPHA_ANIMATION_OPTION_USE_CURRENT_ALPHA, function() self.control:SetHidden(true) end)
- elseif IsInJusticeEnabledZone() and (GetInfamy() ~= 0 or self.infamy ~= 0 or self.oldInfamy ~= 0) then
+ elseif IsInJusticeEnabledZone() and (GetInfamy() ~= 0 or self.infamyMeterState["infamy"] ~= 0) then
self.control:SetHidden(false)
self.fadeAnim:FadeIn(0, INFAMY_METER_FADE_TIME, ZO_ALPHA_ANIMATION_OPTION_USE_CURRENT_ALPHA)
end