Back to Home

ESO Lua File v101041

ingame/instancekickwarning/instancekickwarning.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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
-- ZO_InstanceKickWarning Base Object
local ZO_InstanceKickWarning = ZO_Object:Subclass()
function ZO_InstanceKickWarning:New(control)
    local instanceKickWarning = ZO_Object.New(self)
    instanceKickWarning:Initialize(control)
    return instanceKickWarning
end
do
    local INSTANCE_KICK_KEYBOARD_STYLE =
    {
        font = "ZoFontWinH2",
        anchorOffsetY = ZO_COMMON_INFO_DEFAULT_KEYBOARD_BOTTOM_OFFSET_Y,
    }
    local INSTANCE_KICK_GAMEPAD_STYLE =
    {
        font = "ZoFontGamepad34",
        anchorOffsetY = ZO_COMMON_INFO_DEFAULT_GAMEPAD_BOTTOM_OFFSET_Y,
    }
    function ZO_InstanceKickWarning:ApplyPlatformStyle(style)
        self.kickLabel:SetFont(style.font)
        self.container:ClearAnchors()
        self.container:SetAnchor(BOTTOM, nil, BOTTOM, 0, style.anchorOffsetY)
        ApplyTemplateToControl(self.keybindButton, ZO_GetPlatformTemplate("ZO_KeybindButton"))
    end
    function ZO_InstanceKickWarning:Initialize(control)
        self.control = control
        local function OnPlayerActivated()
            local timeRemaining, totalTime = GetInstanceKickTime()
            self:OnInstanceKickTimeUpdate(timeRemaining, totalTime)
        end
        local function OnInstanceKickTimeUpdate(event, timeRemaining)
            local totalTime = timeRemaining
            self:OnInstanceKickTimeUpdate(timeRemaining, totalTime)
        end
        local function OnGroupInviteUpdate()
            self:UpdateVisibility()
        end
        self.control:RegisterForEvent(EVENT_PLAYER_ACTIVATED, OnPlayerActivated)
        self.control:RegisterForEvent(EVENT_INSTANCE_KICK_TIME_UPDATE, OnInstanceKickTimeUpdate)
        self.control:RegisterForEvent(EVENT_GROUP_INVITE_RECEIVED, OnGroupInviteUpdate)
        self.control:RegisterForEvent(EVENT_GROUP_INVITE_REMOVED, OnGroupInviteUpdate)
        self.container = self.control:GetNamedChild("Container")
        self.keybindButton = self.container:GetNamedChild("KeybindButton")
        self.keybindButton:SetKeybind("INSTANCE_KICK_LEAVE_INSTANCE")
        self.keybindButton:SetText(GetString(SI_INSTANCE_KICK_LEAVE_NOW_KEYBIND))
        self.timerCooldown = self.container:GetNamedChild("Timer")
        self.timerCooldown:SetNumWarningSounds(5)
        self.kickLabel = self.container:GetNamedChild("Text")
        ZO_PlatformStyle:New(function(...) self:ApplyPlatformStyle(...) end, INSTANCE_KICK_KEYBOARD_STYLE, INSTANCE_KICK_GAMEPAD_STYLE)
        if IsPlayerActivated() then
            OnInstanceKickTimeUpdate()
        end
    end
end
function ZO_InstanceKickWarning:OnInstanceKickTimeUpdate(timeRemaining, totalTime)
    if timeRemaining and totalTime and timeRemaining > 0 and totalTime > 0 then
        if not self.kickPending then
            self.timerCooldown:Start(timeRemaining)
            self.kickPending = true
        end
        self:UpdateVisibility()
        
        -- give an alert text to explain why being removed from the instance
        local kickReason = GetInstanceKickReason()
        if GetInstanceKickReason() == INSTANCE_KICK_REASON_NOT_IN_REQUIRED_GROUP then
            if IsUnitGrouped("player") then
                ZO_Alert(UI_ALERT_CATEGORY_ALERT, SOUNDS.GENERAL_ALERT_ERROR, GetString(SI_INSTANCE_KICK_WARNING_GROUPED))
            else
                ZO_Alert(UI_ALERT_CATEGORY_ALERT, SOUNDS.GENERAL_ALERT_ERROR, GetString(SI_INSTANCE_KICK_WARNING_UNGROUPED))
            end
        else
            ZO_Alert(UI_ALERT_CATEGORY_ALERT, SOUNDS.INSTANCE_SHUTDOWN, GetString(SI_INSTANCE_KICK_WARNING_SHUTDOWN))
        end
    else
        self.timerCooldown:Stop()
        self.kickPending = false
        self:UpdateVisibility()
    end
end
-- There are two instance kick controls, and the order they update their visibility may be arbitrary
-- Starting value is set to 1 due to Dead using Hidden Reasons, and therefore being set to shown by default to force a RefreshVisibility
local g_showingCount = 1
function ZO_InstanceKickWarning:SetHidden(hidden)
    if hidden ~= self.control:IsHidden() then
        self.control:SetHidden(hidden)
        local showKeybind = not hidden and CanExitInstanceImmediately()
        if showKeybind then
            self.keybindButton:SetHidden(false)
            if g_showingCount == 0 then
                PushActionLayerByName(GetString(SI_KEYBINDINGS_LAYER_INSTANCE_KICK_WARNING))
            end
            g_showingCount = g_showingCount + 1
        else
            self.keybindButton:SetHidden(true)
            g_showingCount = g_showingCount - 1
            if g_showingCount == 0 then
                RemoveActionLayerByName(GetString(SI_KEYBINDINGS_LAYER_INSTANCE_KICK_WARNING))
            end
        end
    end
end
-- ZO_InstanceKickWarning_Alive...Used when the player is alive (in shared info area)
local ZO_InstanceKickWarning_Alive = ZO_InstanceKickWarning:Subclass()
function ZO_InstanceKickWarning_Alive:Initialize(control)
    ZO_InstanceKickWarning.Initialize(self, control)
    SHARED_INFORMATION_AREA:AddInstanceKick(self)
end
function ZO_InstanceKickWarning_Alive:UpdateVisibility()
    local groupInviterName = GetGroupInviteInfo()
    local hasInvitePending = groupInviterName ~= ""
    local hideKickWarning = hasInvitePending or not self.kickPending
    SHARED_INFORMATION_AREA:SetHidden(self, hideKickWarning)
end
-- ZO_InstanceKickWarning_Dead...Used when the player is dead
local ZO_InstanceKickWarning_Dead = ZO_InstanceKickWarning:Subclass()
function ZO_InstanceKickWarning_Dead:Initialize(control)
    self.hiddenReasons = ZO_HiddenReasons:New()
    ZO_InstanceKickWarning.Initialize(self, control)
end
function ZO_InstanceKickWarning_Dead:UpdateVisibility()
    self:SetHiddenForReason("kickPending", not self.kickPending)
end
function ZO_InstanceKickWarning_Dead:RefreshVisible()
    self:SetHidden(self.hiddenReasons:IsHidden())
end
function ZO_InstanceKickWarning_Dead:SetHiddenForReason(reason, hidden)
    if self.hiddenReasons:SetHiddenForReason(reason, hidden) then
        self:RefreshVisible()
    end
end
-- Global functions
    INSTANCE_KICK_WARNING_ALIVE = ZO_InstanceKickWarning_Alive:New(control)
end
    INSTANCE_KICK_WARNING_DEAD = ZO_InstanceKickWarning_Dead:New(control)
end