Nenue@62
|
1 -- Veneer
|
Nenue@62
|
2 -- PaperDoll.lua
|
Nenue@62
|
3 -- Created: 8/16/2016 8:18 AM
|
Nenue@62
|
4 -- %file-revision%
|
Nenue@80
|
5 -- Displays the item level and modifications of character sheet equipment, including artifact power
|
Nenue@62
|
6
|
Nenue@62
|
7 local plugin = CreateFrame('Frame', 'VeneerPaper', UIParent)
|
Nenue@75
|
8 local vn, print = LibStub("LibKraken").register(Veneer, plugin)
|
Nenue@62
|
9
|
Nenue@64
|
10 local slot_anchors = {
|
Nenue@64
|
11 [1] = 'TOPLEFT',
|
Nenue@64
|
12 [2] = 'TOPLEFT',
|
Nenue@64
|
13 [3] = 'TOPLEFT',
|
Nenue@64
|
14 [15] = 'TOPLEFT',
|
Nenue@64
|
15 [5] = 'TOPLEFT',
|
Nenue@64
|
16 [9] = 'TOPLEFT',
|
Nenue@62
|
17
|
Nenue@64
|
18 [10] = 'TOPRIGHT',
|
Nenue@64
|
19 [6] = 'TOPRIGHT',
|
Nenue@64
|
20 [7] = 'TOPRIGHT',
|
Nenue@64
|
21 [8] = 'TOPRIGHT',
|
Nenue@64
|
22 [11] = 'TOPRIGHT',
|
Nenue@64
|
23 [12] = 'TOPRIGHT',
|
Nenue@64
|
24 [13] = 'TOPRIGHT',
|
Nenue@64
|
25 [14] = 'TOPRIGHT',
|
Nenue@64
|
26
|
Nenue@64
|
27 [16] = 'BOTTOMRIGHT',
|
Nenue@64
|
28 [17] = 'BOTTOMLEFT',
|
Nenue@64
|
29 }
|
Nenue@64
|
30
|
Nenue@64
|
31 local slot_relative = {
|
Nenue@64
|
32 [1] = 'TOPRIGHT',
|
Nenue@64
|
33 [2] = 'TOPRIGHT',
|
Nenue@64
|
34 [3] = 'TOPRIGHT',
|
Nenue@64
|
35 [15] = 'TOPRIGHT',
|
Nenue@64
|
36 [5] = 'TOPRIGHT',
|
Nenue@64
|
37 [9] = 'TOPRIGHT',
|
Nenue@64
|
38
|
Nenue@64
|
39 [10] = 'TOPLEFT',
|
Nenue@64
|
40 [6] = 'TOPLEFT',
|
Nenue@64
|
41 [7] = 'TOPLEFT',
|
Nenue@64
|
42 [8] = 'TOPLEFT',
|
Nenue@64
|
43 [11] = 'TOPLEFT',
|
Nenue@64
|
44 [12] = 'TOPLEFT',
|
Nenue@64
|
45 [13] = 'TOPLEFT',
|
Nenue@64
|
46 [14] = 'TOPLEFT',
|
Nenue@64
|
47
|
Nenue@64
|
48 [16] = 'TOPRIGHT',
|
Nenue@64
|
49 [17] = 'TOPLEFT',
|
Nenue@64
|
50 }
|
Nenue@64
|
51 local ticker
|
Nenue@64
|
52 local vnslot = {}
|
Nenue@64
|
53 local pendingSlots = {}
|
Nenue@64
|
54
|
Nenue@65
|
55
|
Nenue@80
|
56 local GetEquippedArtifactInfo = _G.C_ArtifactUI.GetEquippedArtifactInfo
|
Nenue@80
|
57 local GetCostForPointAtRank = _G.C_ArtifactUI.GetCostForPointAtRank
|
Nenue@80
|
58 local tooltip = CreateFrame('GameTooltip', 'VeneerTooltip', UIParent, 'GameTooltipTemplate')
|
Nenue@71
|
59 local jewel = {}
|
Nenue@80
|
60
|
Nenue@80
|
61 local artifactBar_OnEvent = function (self)
|
Nenue@80
|
62 local itemID, altItemID, name, icon, totalXP, pointsSpent = GetEquippedArtifactInfo()
|
Nenue@80
|
63 if not itemID then
|
Nenue@80
|
64 self:Hide()
|
Nenue@80
|
65 return
|
Nenue@80
|
66 end
|
Nenue@80
|
67
|
Nenue@80
|
68 local numRelicSlots = C_ArtifactUI.GetNumRelicSlots() or 0;
|
Nenue@89
|
69 for i = 1, numRelicSlots do
|
Nenue@80
|
70
|
Nenue@89
|
71 end
|
Nenue@80
|
72
|
Nenue@80
|
73 local pointsAvailable = 0
|
Nenue@80
|
74 local nextRankCost = GetCostForPointAtRank(pointsSpent + pointsAvailable) or 0
|
Nenue@80
|
75
|
Nenue@80
|
76 while totalXP >= nextRankCost do
|
Nenue@80
|
77 totalXP = totalXP - nextRankCost
|
Nenue@80
|
78 pointsAvailable = pointsAvailable + 1
|
Nenue@80
|
79 nextRankCost = GetCostForPointAtRank(pointsSpent + pointsAvailable) or 0
|
Nenue@80
|
80 end
|
Nenue@80
|
81 self.Header:SetText(name)
|
Nenue@81
|
82 self.Level:SetText((pointsAvailable >= 1) and (pointsSpent .. ' ('.. pointsAvailable..')') or (pointsSpent))
|
Nenue@80
|
83 self.ProgressText:SetFormattedText("|cFF00FFFF%d|r / %d", totalXP, nextRankCost)
|
Nenue@80
|
84
|
Nenue@80
|
85 self.ProgressBar:SetPoint('TOPRIGHT', self.ProgressBG, 'TOPLEFT', self:GetWidth()*(totalXP/nextRankCost), 0)
|
Nenue@80
|
86 self.ProgressBar:SetColorTexture(1,.5,0)
|
Nenue@80
|
87
|
Nenue@80
|
88 self:Show()
|
Nenue@80
|
89 end
|
Nenue@80
|
90
|
Nenue@80
|
91
|
Nenue@80
|
92 local artifactBar = CreateFrame('Frame', 'VnPaperDollArtifact', CharacterModelFrame, 'VeneerStatusBarTemplate')
|
Nenue@80
|
93 artifactBar:ClearAllPoints()
|
Nenue@80
|
94 artifactBar:SetHeight(28)
|
Nenue@80
|
95 artifactBar:SetPoint('LEFT', CharacterModelFrame, 'LEFT', 30, 0)
|
Nenue@80
|
96 artifactBar:SetPoint('RIGHT', CharacterModelFrame, 'RIGHT', -30, 0)
|
Nenue@80
|
97 artifactBar:SetPoint('BOTTOM', CharacterMainHandSlotFrame, 'TOP', 0, 1)
|
Nenue@80
|
98 artifactBar.ProgressBG:SetColorTexture(0.5, 0.5, 0.5)
|
Nenue@80
|
99 artifactBar.Header:Show()
|
Nenue@80
|
100 artifactBar:RegisterEvent('ARTIFACT_UPDATE')
|
Nenue@80
|
101 artifactBar:SetScript('OnEvent', artifactBar_OnEvent)
|
Nenue@80
|
102
|
Nenue@80
|
103 plugin.artifactBar = artifactBar
|
Nenue@80
|
104 print(CharacterMainHandSlotFrame:GetPoint(1))
|
Nenue@80
|
105 print(artifactBar:GetPoint(3))
|
Nenue@80
|
106
|
Nenue@80
|
107 for i = 1, 3 do
|
Nenue@80
|
108 local relicSlot = CreateFrame('Frame', 'VnPaperDollRelic'..i, artifactBar)
|
Nenue@80
|
109 relicSlot:SetSize(40,40)
|
Nenue@80
|
110 relicSlot:SetPoint('BOTTOM', artifactBar, 'TOP', (i-2)*40, 24)
|
Nenue@80
|
111 relicSlot.relicArt = relicSlot:CreateTexture(nil, 'BACKGROUND')
|
Nenue@80
|
112 artifactBar['RelicSlot'..i] = relicSlot
|
Nenue@80
|
113 end
|
Nenue@80
|
114
|
Nenue@80
|
115
|
Nenue@80
|
116 artifactBar:EnableMouse(true)
|
Nenue@80
|
117 artifactBar:SetScript('OnMouseUp', function()
|
Nenue@80
|
118 SocketInventoryItem(16)
|
Nenue@80
|
119 end)
|
Nenue@80
|
120
|
Nenue@64
|
121 local UpdateVeneer = function(itemslot, frame)
|
Nenue@64
|
122 local slot = itemslot:GetID()
|
Nenue@64
|
123 if itemslot.hasItem then
|
Nenue@80
|
124 local unit = frame.target.unit or 'player'
|
Nenue@80
|
125 frame.link = GetInventoryItemLink(unit, slot)
|
Nenue@80
|
126 tooltip:SetOwner(frame, 'ANCHOR_NONE')
|
Nenue@80
|
127 tooltip:SetInventoryItem(unit, slot)
|
Nenue@80
|
128 tooltip:Show()
|
Nenue@80
|
129 --print(tooltip:NumLines())
|
Nenue@80
|
130 if tooltip:NumLines() >= 3 then
|
Nenue@71
|
131
|
Nenue@80
|
132 local ilvl
|
Nenue@80
|
133 if _G['VeneerTooltipTextLeft2'] then
|
Nenue@80
|
134 ilvl = _G['VeneerTooltipTextLeft2']:GetText():match("Item Level (%d+)")
|
Nenue@80
|
135 --print('l2', ilvl)
|
Nenue@80
|
136 end
|
Nenue@62
|
137
|
Nenue@80
|
138 if _G['VeneerTooltipTextLeft3'] then
|
Nenue@80
|
139 if not ilvl then
|
Nenue@80
|
140 ilvl = _G['VeneerTooltipTextLeft3']:GetText():match("Item Level (%d+)")
|
Nenue@80
|
141 --print('l3', ilvl)
|
Nenue@80
|
142 end
|
Nenue@80
|
143 end
|
Nenue@64
|
144
|
Nenue@80
|
145 if ilvl then
|
Nenue@80
|
146 frame.label:SetText(ilvl)
|
Nenue@62
|
147 end
|
Nenue@62
|
148 end
|
Nenue@80
|
149
|
Nenue@80
|
150 local quality = GetInventoryItemQuality(unit, slot)
|
Nenue@80
|
151 if slot == 16 and quality == LE_ITEM_QUALITY_ARTIFACT then
|
Nenue@80
|
152 artifactBar_OnEvent(plugin.artifactBar)
|
Nenue@71
|
153 end
|
Nenue@71
|
154
|
Nenue@71
|
155
|
Nenue@80
|
156
|
Nenue@71
|
157
|
Nenue@62
|
158 frame:Show()
|
Nenue@62
|
159 else
|
Nenue@62
|
160 frame:Hide()
|
Nenue@62
|
161 end
|
Nenue@62
|
162 end
|
Nenue@62
|
163
|
Nenue@76
|
164 local UpdateNext = function(frame)
|
Nenue@76
|
165
|
Nenue@76
|
166 plugin.next(function()
|
Nenue@76
|
167 print('updating', frame:GetName())
|
Nenue@76
|
168 UpdateVeneer(frame:GetParent(), frame)
|
Nenue@76
|
169 end)
|
Nenue@76
|
170 end
|
Nenue@76
|
171
|
Nenue@76
|
172
|
Nenue@64
|
173 local UpdateAll = function()
|
Nenue@64
|
174 for index, frame in pairs(vnslot) do
|
Nenue@64
|
175 if frame:IsVisible() then
|
Nenue@64
|
176 print('forcing', index, frame:GetName())
|
Nenue@76
|
177 UpdateNext(frame)
|
Nenue@64
|
178 end
|
Nenue@64
|
179 end
|
Nenue@64
|
180 end
|
Nenue@64
|
181
|
Nenue@71
|
182
|
Nenue@64
|
183 -- PaperDollFrame is separate from InspectUI handlers
|
Nenue@64
|
184 local PaperDollItemSlotButton_Update = function(self)
|
Nenue@64
|
185 local name = self:GetName()
|
Nenue@64
|
186 local slot = self:GetID()
|
Nenue@64
|
187 if not slot_anchors[slot] then
|
Nenue@64
|
188 return
|
Nenue@64
|
189 end
|
Nenue@80
|
190 print(self:GetName())
|
Nenue@64
|
191
|
Nenue@64
|
192 local frame = _G[name .. 'Veneer']
|
Nenue@64
|
193
|
Nenue@64
|
194 if not frame then
|
Nenue@64
|
195
|
Nenue@64
|
196 frame = CreateFrame('Frame', name..'Veneer', self)
|
Nenue@64
|
197 vnslot[slot] = frame
|
Nenue@64
|
198
|
Nenue@64
|
199 frame.label = frame:CreateFontString(nil, 'OVERLAY', 'VeneerNumberFont')
|
Nenue@64
|
200 frame.gemslot = {}
|
Nenue@64
|
201
|
Nenue@64
|
202
|
Nenue@80
|
203 frame.target = self
|
Nenue@71
|
204 frame.gemslot = {}
|
Nenue@80
|
205 frame:SetAllPoints(self)
|
Nenue@80
|
206 frame:SetParent(self)
|
Nenue@80
|
207 frame.label:SetPoint('BOTTOMLEFT', self, 'BOTTOMLEFT', 2, 2)
|
Nenue@64
|
208
|
Nenue@64
|
209 tinsert(pendingSlots, frame)
|
Nenue@64
|
210 end
|
Nenue@66
|
211
|
Nenue@80
|
212 UpdateVeneer(self, frame)
|
Nenue@80
|
213
|
Nenue@64
|
214 end
|
Nenue@64
|
215
|
Nenue@80
|
216 local PaperDollFrame_UpdateStats = function()
|
Nenue@80
|
217
|
Nenue@80
|
218 end
|
Nenue@64
|
219
|
Nenue@64
|
220
|
Nenue@64
|
221
|
Nenue@65
|
222 plugin.event = function(self, event, ...)
|
Nenue@80
|
223 print(self, event, ...)
|
Nenue@64
|
224
|
Nenue@65
|
225 if event == 'PLAYER_EQUIPMENT_CHANGED' then
|
Nenue@65
|
226 local slot, hasItem = ...
|
Nenue@65
|
227 if vnslot[slot] then
|
Nenue@65
|
228 UpdateVeneer(vnslot[slot]:GetParent(), vnslot[slot])
|
Nenue@80
|
229
|
Nenue@65
|
230 end
|
Nenue@64
|
231
|
Nenue@66
|
232 elseif event == 'PLAYER_ENTERING_WORLD' then
|
Nenue@66
|
233 UpdateAll()
|
Nenue@66
|
234
|
Nenue@65
|
235 end
|
Nenue@65
|
236
|
Nenue@64
|
237 end
|
Nenue@80
|
238 local artifactBarCreated
|
Nenue@80
|
239 plugin.init = function()
|
Nenue@80
|
240 LoadAddOn('Blizzard_ArtifactUI')
|
Nenue@80
|
241 end
|
Nenue@66
|
242
|
Nenue@72
|
243 --plugin:SetScript('OnEvent', plugin.event)
|
Nenue@65
|
244 plugin:RegisterEvent('PLAYER_EQUIPMENT_CHANGED')
|
Nenue@66
|
245 plugin:RegisterEvent('PLAYER_ENTERING_WORLD')
|
Nenue@64
|
246
|
Nenue@66
|
247
|
Nenue@80
|
248 hooksecurefunc("PaperDollItemSlotButton_Update", PaperDollItemSlotButton_Update)
|
Nenue@80
|
249
|
Nenue@80
|
250 hooksecurefunc("PaperDollFrame_UpdateStats", PaperDollFrame_UpdateStats) |