Back to Home

ESO Lua File v101041

ingame/resourcewarner/resourcewarner.lua

[◄ back to folders ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
--Resource Warner
--------------------
local RESOURCE_WARNER_FLASH_TIME  = 300
local RESOURCE_WARNER_NUM_FLASHES = 3
ZO_ResourceWarner = ZO_Object:Subclass()
function ZO_ResourceWarner:New(...)
    local warner = ZO_Object.New(self)
    warner:Initialize(...)
    return warner
end
function ZO_ResourceWarner:Initialize(parent, powerType)
    self.warning = GetControl(parent, "Warner")
    self.warnAnimation = ZO_AlphaAnimation:New(self.warning)
    self.powerType = powerType
    self.statusBar = parent
    self.paused = false
    self.currentPower = 0
    self.warning:RegisterForEvent(EVENT_COMBAT_EVENT, function(eventCode, ...) self:OnCombatEvent(...) end)
    self.warning:AddFilterForEvent(EVENT_COMBAT_EVENT, REGISTER_FILTER_POWER_TYPE, powerType, REGISTER_FILTER_COMBAT_RESULT, ACTION_RESULT_INSUFFICIENT_RESOURCE)
    self.warning:RegisterForEvent(EVENT_POWER_UPDATE, function(_, unitTag, powerIndex, powerType, currentPower, maxPower) self:OnPowerUpdate(powerType, currentPower, maxPower) end)
    self.warning:AddFilterForEvent(EVENT_POWER_UPDATE, REGISTER_FILTER_POWER_TYPE, powerType, REGISTER_FILTER_UNIT_TAG, "player")
end
function ZO_ResourceWarner:SetPaused(paused)
    if self.paused ~= paused then
        self.paused = paused
        if paused and self.warnAnimation:IsPlaying() then
            self.warnAnimation:Stop()
        end
    end
end
function ZO_ResourceWarner:OnCombatEvent(result, isError, abilityName, abilityGraphic, abilityActionSlotType, sourceName, sourceType, targetName, targetType, hitValue, powerType, damageType, log)
    if not self.paused then
        if not self.warnAnimation:IsPlaying() then
            self.warnAnimation:PingPong(0, 1, RESOURCE_WARNER_FLASH_TIME, RESOURCE_WARNER_NUM_FLASHES)
        else
            --Reset the animation by making it do RESOURCE_WARNER_NUM_FLASHES after this point
            local remainingLoops = self.warnAnimation:GetPlaybackLoopsRemaining()
            local newLoops = RESOURCE_WARNER_NUM_FLASHES
            --If we're on the backswing of the ping pong we need to do one addition loop to make sure it ends in the alpha down state, otherwise it stops at full alpha
            if remainingLoops % 2 == 0 then
                newLoops = newLoops + 1
            end
            self.warnAnimation:SetPlaybackLoopCount(newLoops)
        end
    end
end
function ZO_ResourceWarner:OnPowerUpdate(powerType, currentPower, maxPower)
    if not self.paused then
        if currentPower == 0 and self.currentPower > 0 and not self.warnAnimation:IsPlaying() then
            self.warnAnimation:PingPong(0, 1, RESOURCE_WARNER_FLASH_TIME, RESOURCE_WARNER_NUM_FLASHES)
        end
        self.currentPower = currentPower
    end
end
--Health Warner
---------------
local HEALTH_ALPHA_PULSE_THRESHOLD = 0.25
ZO_HealthWarner = ZO_Object:Subclass()
function ZO_HealthWarner:New(...)
    local warner = ZO_Object.New(self)
    warner:Initialize(...)
    return warner
end
function ZO_HealthWarner:Initialize(parent)
    local function OnPowerUpdate(_, unitTag, powerIndex, powerType, health, maxHealth)
        self:OnHealthUpdate(health, maxHealth)
    end
    local function OnPlayerActivated()
        local current, max = GetUnitPower("player", COMBAT_MECHANIC_FLAGS_HEALTH)
        self:OnHealthUpdate(current, max)
    end
    self.warning = GetControl(parent, "Warner")
    self.warnAnimation = ZO_AlphaAnimation:New(self.warning)
    self.statusBar = parent
    self.paused = false
    self.warning:RegisterForEvent(EVENT_POWER_UPDATE, OnPowerUpdate)
    self.warning:AddFilterForEvent(EVENT_POWER_UPDATE, REGISTER_FILTER_POWER_TYPE, COMBAT_MECHANIC_FLAGS_HEALTH, REGISTER_FILTER_UNIT_TAG, "player")
    self.warning:RegisterForEvent(EVENT_PLAYER_ACTIVATED, OnPlayerActivated)
end
function ZO_HealthWarner:SetPaused(paused)
    if self.paused ~= paused then
        self.paused = paused
        if paused then
            if self.warnAnimation:IsPlaying() then
                self.warnAnimation:Stop()
            end
        else
            local current, max = GetUnitPower("player", COMBAT_MECHANIC_FLAGS_HEALTH)
            self.warning:SetAlpha(0)
            self:UpdateAlphaPulse(current / max)
        end
    end
end
function ZO_HealthWarner:UpdateAlphaPulse(healthPerc)
    if healthPerc <= HEALTH_ALPHA_PULSE_THRESHOLD then
        if not self.warnAnimation:IsPlaying() then
            self.warnAnimation:PingPong(0, 1, RESOURCE_WARNER_FLASH_TIME)
        end
    else
        if self.warnAnimation:IsPlaying() then
            self.warnAnimation:Stop()
            self.warning:SetAlpha(0)
        end
    end
end
function ZO_HealthWarner:OnHealthUpdate(health, maxHealth)
    if not self.paused then
        local healthPerc = health / maxHealth
        self:UpdateAlphaPulse(healthPerc)
    end
end