Back to Home

ESO Lua File v101050

ingame/skills/skilllineassignmentmanager.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
171
172
173
174
175
176
177
178
179
180
181
-- ESO-911673: When swapping out a player skill line for another player skill line pendingDeactivationLines can
-- equal MAX_LINE_SWAPS temporarily until the pending deactivation player skill line is removed upon activation.
-- ESO-915394: Bumping MAX_LINE_SWAPS from 2 to 3 to account for the fact that you actually can swap 3 things if you had
-- already subclassed two lines, and then want to do it again and swap your player class with another player class.
-- As a result of this change, it makes the fix for the prior bug (ESO-911673) moot.
local MAX_LINE_SWAPS = 3
ZO_SkillLineAssignmentManager = ZO_SkillsAssignmentManager_Base:Subclass()
function ZO_SkillLineAssignmentManager:Initialize()
    SKILL_LINE_ASSIGNMENT_MANAGER = self
    self.pendingTrainingLines = {}
    self.pendingDeactivationLines = {}
    self.pendingActivationLines = {}
    ZO_SkillsAssignmentManager_Base.Initialize(self, ZO_SkillsAndActionBarManager.OnSkillLineAssignmentManagerReady)
    SKILLS_DATA_MANAGER:OnSkillLineAssignmentManagerReady()
end
function ZO_SkillLineAssignmentManager:RegisterForEvents()
    local function Reset()
        self:Reset()
    end
    SKILLS_AND_ACTION_BAR_MANAGER:RegisterCallback("SkillPointAllocationModeChanged", Reset)
    SKILLS_AND_ACTION_BAR_MANAGER:RegisterCallback("RespecStateReset", Reset)
end
-- Training --
function ZO_SkillLineAssignmentManager:TrainSkillLine(skillLineData, suppressCallback)
    if #self.pendingTrainingLines < MAX_SKILL_LINES_IN_TRAINING and not self:IsSkillLinePendingTrain(skillLineData) then
        table.insert(self.pendingTrainingLines, skillLineData:GetId())
        if not suppressCallback then
            self:FireCallbacks("SkillLineRespecUpdate", skillLineData)
        end
        return true
    end
    return false
end
function ZO_SkillLineAssignmentManager:UntrainSkillLine(skillLineData, suppressCallback)
    local index = ZO_IndexOfElementInNumericallyIndexedTable(self.pendingTrainingLines, skillLineData:GetId())
    if index then
        table.remove(self.pendingTrainingLines, index)
        if not suppressCallback then
            self:FireCallbacks("SkillLineRespecUpdate", skillLineData)
        end
        return true
    end
    return false
end
function ZO_SkillLineAssignmentManager:IsSkillLinePendingTrain(skillLineData)
    return ZO_IsElementInNumericallyIndexedTable(self.pendingTrainingLines, skillLineData:GetId())
end
-- Deactivation --
function ZO_SkillLineAssignmentManager:DeactivateSkillLine(skillLineData, suppressCallback)
    local success = false
    local pendingActivationIndex = ZO_IndexOfElementInNumericallyIndexedTable(self.pendingActivationLines, skillLineData:GetId())
    if pendingActivationIndex then
        table.remove(self.pendingActivationLines, pendingActivationIndex)
        success = true
    elseif #self.pendingDeactivationLines < MAX_LINE_SWAPS and not self:IsSkillLinePendingDeactivation(skillLineData) then
        table.insert(self.pendingDeactivationLines, skillLineData:GetId())
        success = true
    end
    if success then
        -- Cannot suppress this, it's necessary
        SKILL_POINT_ALLOCATION_MANAGER:FireCallbacks("OnSkillsCleared", skillLineData)
        if not suppressCallback then
            self:FireCallbacks("SkillLineRespecUpdate", skillLineData)
        end
    end
    return success
end
function ZO_SkillLineAssignmentManager:IsSkillLinePendingDeactivation(skillLineData)
    return ZO_IsElementInNumericallyIndexedTable(self.pendingDeactivationLines, skillLineData:GetId())
end
-- Activation --
function ZO_SkillLineAssignmentManager:ActivateSkillLine(skillLineData)
    local success = false
    local pendingDeactivationIndex = ZO_IndexOfElementInNumericallyIndexedTable(self.pendingDeactivationLines, skillLineData:GetId())
    if pendingDeactivationIndex then
        table.remove(self.pendingDeactivationLines, pendingDeactivationIndex)
        success = true
    elseif #self.pendingActivationLines < MAX_LINE_SWAPS and not self:IsSkillLinePendingActivation(skillLineData) then
        table.insert(self.pendingActivationLines, skillLineData:GetId())
        success = true
    end
    if success and not suppressCallback then
        self:FireCallbacks("SkillLineRespecUpdate", skillLineData)
    end
    return success
end
function ZO_SkillLineAssignmentManager:IsSkillLinePendingActivation(skillLineData)
    return ZO_IsElementInNumericallyIndexedTable(self.pendingActivationLines, skillLineData:GetId())
end
-- Processing --
function ZO_SkillLineAssignmentManager:GetPendingPointAllocationDelta()
    local pendingDelta = 0
    for _, skillLineId in ipairs(self.pendingDeactivationLines) do
        local skillLineData = SKILLS_DATA_MANAGER:GetSkillLineDataById(skillLineId)
        pendingDelta = pendingDelta - skillLineData:GetNumPointsAllocated()
    end
    return pendingDelta
end
function ZO_SkillLineAssignmentManager:IsAnyTrainingChangePending()
    return #self.pendingTrainingLines > 0
end
function ZO_SkillLineAssignmentManager:GetNumTrainingChangesPending()
    return #self.pendingTrainingLines
end
function ZO_SkillLineAssignmentManager:GetPendingTrainingLines()
    return self.pendingTrainingLines
end
function ZO_SkillLineAssignmentManager:IsActivationOrDeactivationPending()
    return #self.pendingDeactivationLines > 0 or #self.pendingActivationLines > 0
end
function ZO_SkillLineAssignmentManager:HasSubclassingChanges()
    local pendingTrainingLines = self:GetPendingTrainingLines()
    return #pendingTrainingLines > 0 or hasSwap
end
function ZO_SkillLineAssignmentManager:IsAnyChangePending()
end
function ZO_SkillLineAssignmentManager:DoPendingChangesIncurCost()
end
function ZO_SkillLineAssignmentManager:DoAnyChangesIncurPointRefunds()
    return self:GetPendingPointAllocationDelta() < 0
end
function ZO_SkillLineAssignmentManager:AddChangesToMessage()
    local anyChangesAdded = false
    if #self.pendingTrainingLines > 0 then
        anyChangesAdded = true
        AddTrainingToAllocationRequest(unpack(self.pendingTrainingLines))
    end
    if #self.pendingDeactivationLines > 0 then
        anyChangesAdded = true
        DeactivateSkillLinesInAllocationRequest(unpack(self.pendingDeactivationLines))
    end
    if #self.pendingActivationLines > 0 then
        anyChangesAdded = true
        ActivateSkillLinesInAllocationRequest(unpack(self.pendingActivationLines))
    end
    return anyChangesAdded
end
function ZO_SkillLineAssignmentManager:Reset()
    ZO_ClearNumericallyIndexedTable(self.pendingTrainingLines)
    ZO_ClearNumericallyIndexedTable(self.pendingDeactivationLines)
    ZO_ClearNumericallyIndexedTable(self.pendingActivationLines)
    self:FireCallbacks("SkillLineRespecUpdate")
end
ZO_SkillLineAssignmentManager:New()