Nenue@0
|
1 --- ${PACKAGE_NAME}
|
Nenue@0
|
2 -- @file-author@
|
Nenue@0
|
3 -- @project-revision@ @project-hash@
|
Nenue@0
|
4 -- @file-revision@ @file-hash@
|
Nenue@0
|
5 -- Created: 3/29/2016 7:07 PM
|
Nenue@0
|
6 local B = select(2,...).frame
|
Nenue@0
|
7 local mod = B:RegisterModule("ObjectiveTracker", _G.VeneerObjectiveWrapper, 'BuffFrame')
|
Nenue@0
|
8 local print = B.print('Objectives')
|
Nenue@0
|
9 local Tracker, AutoQuest, Quest, Cheevs = mod.Tracker, mod.AutoQuest, mod.Quest, mod.Cheevs
|
Nenue@6
|
10 local itemButtonSize, itemButtonSpacing = 36, 1
|
Nenue@7
|
11 local tremove, tremovebyval = table.remove, table.removebyval
|
Nenue@0
|
12
|
Nenue@0
|
13 --------------------------------------------------------------------
|
Nenue@3
|
14 --- Tracker-specific widgets and their handlers
|
Nenue@0
|
15 --------------------------------------------------------------------
|
Nenue@0
|
16
|
Nenue@0
|
17 Tracker.Select = function(self) end
|
Nenue@0
|
18 Tracker.Open = function(self) end
|
Nenue@0
|
19 Tracker.Remove = function(self) end
|
Nenue@0
|
20 Tracker.Report = function(self)
|
Nenue@0
|
21 print('Stats:', self.numWatched,'items tracked,', self.numBlocks,'blocks assigned.')
|
Nenue@0
|
22 end
|
Nenue@0
|
23
|
Nenue@0
|
24 Tracker.OnMouseUp = function(self, button)
|
Nenue@9
|
25 if button == 'LeftButton' then
|
Nenue@9
|
26 if IsModifiedClick("CHATLINK") and ChatEdit_GetActiveWindow() then
|
Nenue@7
|
27 self:Link()
|
Nenue@9
|
28 elseif IsModifiedClick("QUESTWATCHTOGGLE") then
|
Nenue@1
|
29 self:Remove()
|
Nenue@7
|
30 else
|
Nenue@7
|
31 self:Select()
|
Nenue@1
|
32 end
|
Nenue@0
|
33 elseif button == 'RightButton' then
|
Nenue@0
|
34 self:Open()
|
Nenue@0
|
35 end
|
Nenue@1
|
36 self.initialButton = nil
|
Nenue@7
|
37 self.modChatLink = nil
|
Nenue@7
|
38 self.modQuestWatch = nil
|
Nenue@8
|
39 print('|cFFFF8800'..tostring(self:GetName())..':MouseUp()|r')
|
Nenue@0
|
40 end
|
Nenue@0
|
41
|
Nenue@0
|
42 Tracker.OnMouseDown = function(self, button)
|
Nenue@7
|
43 self:SetStyle('Active')
|
Nenue@8
|
44 print(IsModifiedClick("CHATLINK"), IsModifiedClick("QUESTWATCHTOGGLE"))
|
Nenue@0
|
45 print(self.info.title)
|
Nenue@0
|
46 end
|
Nenue@0
|
47
|
Nenue@0
|
48 -----------------------------
|
Nenue@0
|
49 --- AUTO_QUEST
|
Nenue@0
|
50 AutoQuest.name = "Remote Quests"
|
Nenue@0
|
51 AutoQuest.GetNumWatched = GetNumAutoQuestPopUps
|
Nenue@0
|
52
|
Nenue@0
|
53 -----------------------------
|
Nenue@0
|
54 --- QUEST
|
Nenue@0
|
55 Quest.name = "Quests"
|
Nenue@0
|
56 Quest.Select = function(self)
|
Nenue@0
|
57 SetSuperTrackedQuestID(self.info.questID)
|
Nenue@7
|
58 mod.UpdateWrapper()
|
Nenue@7
|
59 end
|
Nenue@7
|
60 Quest.Link = function(self)
|
Nenue@7
|
61 local questLink = GetQuestLink(block.questLogIndex);
|
Nenue@7
|
62 if ( questLink ) then
|
Nenue@7
|
63 ChatEdit_InsertLink(questLink);
|
Nenue@7
|
64 end
|
Nenue@0
|
65 end
|
Nenue@0
|
66 Quest.Open = function(self)
|
Nenue@1
|
67 QuestMapFrame_OpenToQuestDetails(self.info.questID)
|
Nenue@1
|
68 end
|
Nenue@1
|
69
|
Nenue@1
|
70 Quest.Remove = function(self)
|
Nenue@5
|
71 print('removing', self.info.questLogIndex, 'from watcher')
|
Nenue@5
|
72 RemoveQuestWatch(self.info.questLogIndex)
|
Nenue@0
|
73 end
|
Nenue@0
|
74
|
Nenue@0
|
75
|
Nenue@0
|
76 -----------------------------
|
Nenue@0
|
77 --- CHEEVS
|
Nenue@0
|
78 Cheevs.Select = function(self)
|
Nenue@0
|
79 end
|
Nenue@8
|
80 Cheevs.Remove = function(self)
|
Nenue@8
|
81 RemoveTrackedAchievement(self.info.cheevID)
|
Nenue@8
|
82 end
|
Nenue@9
|
83 Cheevs.OnMouseUp = function(self, button)
|
Nenue@9
|
84 Tracker.OnMouseUp(self, button)
|
Nenue@8
|
85 self:SetStyle('CheevNormal')
|
Nenue@8
|
86 end
|
Nenue@7
|
87 Cheevs.Link = function(self)
|
Nenue@8
|
88 local achievementLink = GetAchievementLink(self.info.cheevID);
|
Nenue@8
|
89 if ( achievementLink ) then
|
Nenue@8
|
90 ChatEdit_InsertLink(achievementLink);
|
Nenue@8
|
91 end
|
Nenue@7
|
92 end
|
Nenue@0
|
93
|
Nenue@0
|
94 Cheevs.Open = function(self)
|
Nenue@3
|
95 if ( not AchievementFrame ) then
|
Nenue@3
|
96 AchievementFrame_LoadUI();
|
Nenue@3
|
97 end
|
Nenue@3
|
98 if ( not AchievementFrame:IsShown() ) then
|
Nenue@3
|
99 AchievementFrame_ToggleAchievementFrame();
|
Nenue@3
|
100 end
|
Nenue@3
|
101 AchievementFrame_SelectAchievement(self.info.cheevID);
|
Nenue@0
|
102 end
|
Nenue@0
|
103
|
Nenue@1
|
104 ----------------------------------------------------------------------------------------
|
Nenue@1
|
105 --- frame template and scripts lifted from "QuestKing 2" by Barjack
|
Nenue@1
|
106 --- url: http://mods.curse.com/addons/wow/questking
|
Nenue@1
|
107 ----------------------------------------------------------------------------------------
|
Nenue@1
|
108 local usedButtons = mod.Quest.itemButtons
|
Nenue@1
|
109 local freeButtons = mod.Quest.freeButtons
|
Nenue@1
|
110 mod.SetItemButton = function(block, info)
|
Nenue@1
|
111 local itemInfo = info.specialItem
|
Nenue@1
|
112 if not itemInfo then
|
Nenue@1
|
113 return
|
Nenue@1
|
114 end
|
Nenue@1
|
115 --- .specialItem :: {link = link, charges = charges, icon = icon, start = start, duration = duration, enable = enable}
|
Nenue@1
|
116
|
Nenue@1
|
117
|
Nenue@1
|
118 local itemButton
|
Nenue@1
|
119 if not info.itemButton then
|
Nenue@1
|
120 if #freeButtons >= 1 then
|
Nenue@2
|
121 print(' |cFF00FFFFfound a free button')
|
Nenue@1
|
122 itemButton = freeButtons[#freeButtons]
|
Nenue@1
|
123 freeButtons[#freeButtons] = nil
|
Nenue@2
|
124 if itemButton.block then
|
Nenue@2
|
125 itemButton.block.itemButton = nil
|
Nenue@2
|
126 itemButton.block = nil
|
Nenue@2
|
127 end
|
Nenue@1
|
128 else
|
Nenue@1
|
129 local buttonIndex = mod.Quest.numButtons + #freeButtons + 1
|
Nenue@1
|
130 itemButton = CreateFrame('Button', 'VeneerQuestItemButton' .. buttonIndex, UIParent, 'VeneerItemButtonTemplate')
|
Nenue@1
|
131 itemButton.buttonIndex = buttonIndex
|
Nenue@6
|
132 itemButton:SetSize(itemButtonSize, itemButtonSize)
|
Nenue@6
|
133 itemButton:GetNormalTexture():SetSize(itemButtonSize * (5/3), itemButtonSize * (5/3))
|
Nenue@5
|
134 print(' |cFFFF4400starting new button', itemButton:GetName())
|
Nenue@1
|
135 end
|
Nenue@1
|
136 mod.Quest.numButtons = mod.Quest.numButtons + 1
|
Nenue@1
|
137 else
|
Nenue@1
|
138 itemButton = info.itemButton
|
Nenue@5
|
139 print(' |cFF00FF00found assigned button', itemButton:GetName())
|
Nenue@2
|
140
|
Nenue@1
|
141 end
|
Nenue@1
|
142 -- set values
|
Nenue@2
|
143
|
Nenue@5
|
144 info.itemButton = itemButton
|
Nenue@5
|
145 usedButtons[info.questID] = itemButton
|
Nenue@5
|
146 print(' |cFF8800FFassigning|r', itemButton:GetName(), 'to quest|cFF00FF00', info.questID, '|rat|cFFFFFF00', block:GetName(),'|r')
|
Nenue@2
|
147
|
Nenue@5
|
148 for k,v in pairs(usedButtons) do
|
Nenue@5
|
149 print('|cFFFF44DD'..k..'|r', v:GetName())
|
Nenue@5
|
150 end
|
Nenue@1
|
151
|
Nenue@1
|
152 itemButton:SetAttribute("type", "item")
|
Nenue@1
|
153 itemButton:SetAttribute("item", itemInfo.link)
|
Nenue@1
|
154
|
Nenue@2
|
155 itemButton.questID = info.questID
|
Nenue@1
|
156 itemButton.questLogIndex = info.questLogIndex
|
Nenue@1
|
157 itemButton.charges = itemInfo.charges
|
Nenue@1
|
158 itemButton.rangeTimer = -1
|
Nenue@1
|
159 itemButton.block = block
|
Nenue@1
|
160
|
Nenue@1
|
161 SetItemButtonTexture(itemButton, itemInfo.icon)
|
Nenue@1
|
162 SetItemButtonCount(itemButton, itemInfo.charges)
|
Nenue@1
|
163 Veneer_QuestObjectiveItem_UpdateCooldown(itemButton);
|
Nenue@1
|
164
|
Nenue@1
|
165 return itemButton
|
Nenue@1
|
166 end
|
Nenue@1
|
167 --- Clear an itemButton from the given block
|
Nenue@2
|
168 mod.FreeItemButtons = function(block)
|
Nenue@2
|
169
|
Nenue@2
|
170 if block.itemButton then
|
Nenue@2
|
171 local itemButton = block.itemButton
|
Nenue@5
|
172 if itemButton.questID ~= block.info.questID then
|
Nenue@5
|
173 block.itemButton = nil
|
Nenue@5
|
174 itemButton.block = mod.Quest.InfoBlock[itemButton.questID]
|
Nenue@5
|
175 else
|
Nenue@5
|
176 itemButton.block = nil
|
Nenue@5
|
177 itemButton:Hide()
|
Nenue@2
|
178
|
Nenue@5
|
179 usedButtons[itemButton.questID] = nil
|
Nenue@5
|
180 freeButtons[#freeButtons + 1] = itemButton
|
Nenue@5
|
181 mod.Quest.numButtons = mod.Quest.numButtons - 1
|
Nenue@5
|
182 print('|cFFFF0088released', itemButton:GetName(),'and', block:GetName())
|
Nenue@5
|
183 end
|
Nenue@1
|
184 end
|
Nenue@1
|
185 end
|
Nenue@1
|
186
|
Nenue@1
|
187 function Veneer_QuestObjectiveItem_OnUpdate (self, elapsed)
|
Nenue@1
|
188 -- Handle range indicator
|
Nenue@1
|
189 local rangeTimer = self.rangeTimer
|
Nenue@1
|
190 if (rangeTimer) then
|
Nenue@1
|
191 rangeTimer = rangeTimer - elapsed
|
Nenue@1
|
192 if (rangeTimer <= 0) then
|
Nenue@1
|
193 local link, item, charges, showItemWhenComplete = GetQuestLogSpecialItemInfo(self.questLogIndex)
|
Nenue@1
|
194 if ((not charges) or (charges ~= self.charges)) then
|
Nenue@2
|
195 mod.UpdateWrapper()
|
Nenue@1
|
196 return
|
Nenue@1
|
197 end
|
Nenue@1
|
198
|
Nenue@1
|
199 local count = self.HotKey
|
Nenue@1
|
200 local valid = IsQuestLogSpecialItemInRange(self.questLogIndex)
|
Nenue@1
|
201 if (valid == 0) then
|
Nenue@1
|
202 count:Show()
|
Nenue@1
|
203 count:SetVertexColor(1.0, 0.1, 0.1)
|
Nenue@1
|
204 elseif (valid == 1) then
|
Nenue@1
|
205 count:Show()
|
Nenue@1
|
206 count:SetVertexColor(0.6, 0.6, 0.6)
|
Nenue@1
|
207 else
|
Nenue@1
|
208 count:Hide()
|
Nenue@1
|
209 end
|
Nenue@1
|
210 rangeTimer = TOOLTIP_UPDATE_TIME
|
Nenue@1
|
211 end
|
Nenue@1
|
212
|
Nenue@1
|
213 self.rangeTimer = rangeTimer
|
Nenue@1
|
214 end
|
Nenue@1
|
215 end
|
Nenue@1
|
216
|
Nenue@1
|
217 function Veneer_QuestObjectiveItem_UpdateCooldown (itemButton)
|
Nenue@1
|
218 local start, duration, enable = GetQuestLogSpecialItemCooldown(itemButton.questLogIndex)
|
Nenue@1
|
219 if (start) then
|
Nenue@1
|
220 CooldownFrame_SetTimer(itemButton.Cooldown, start, duration, enable)
|
Nenue@1
|
221 if (duration > 0 and enable == 0) then
|
Nenue@1
|
222 SetItemButtonTextureVertexColor(itemButton, 0.4, 0.4, 0.4)
|
Nenue@1
|
223 else
|
Nenue@1
|
224 SetItemButtonTextureVertexColor(itemButton, 1, 1, 1)
|
Nenue@1
|
225 end
|
Nenue@1
|
226 end
|
Nenue@3
|
227 end
|
Nenue@3
|
228
|
Nenue@3
|
229 -----------------------------------------
|
Nenue@7
|
230 -- Criteria frames
|
Nenue@7
|
231
|
Nenue@7
|
232 --[[
|
Nenue@7
|
233 text = description,
|
Nenue@7
|
234 type = type,
|
Nenue@7
|
235 finished = completed,
|
Nenue@7
|
236 quantity = quantity,
|
Nenue@7
|
237 requiredQuantity = requiredQuantity,
|
Nenue@7
|
238 characterName = characterName,
|
Nenue@7
|
239 flags = flags,
|
Nenue@7
|
240 assetID = assetID,
|
Nenue@7
|
241 quantityString = quantityString,
|
Nenue@7
|
242 criteriaID = criteriaID,
|
Nenue@7
|
243 ]]
|
Nenue@7
|
244 local newWidgetID = 0
|
Nenue@7
|
245 mod.WidgetRegistry = {}
|
Nenue@7
|
246 local wr = mod.WidgetRegistry
|
Nenue@7
|
247
|
Nenue@7
|
248 --- Get a usable widget for the given achievement criteria set.
|
Nenue@7
|
249 -- Returns a frame object with dimensioning parameters needed to size the receiving tracker block
|
Nenue@7
|
250 mod.SetWidget = function(obj, info)
|
Nenue@8
|
251 local print = B.print('ObjectiveWidgets')
|
Nenue@7
|
252 local widgetType = obj.type
|
Nenue@7
|
253 local widget
|
Nenue@8
|
254 if wr[widgetType] and wr[widgetType].used[obj.criteriaID] then
|
Nenue@8
|
255 widget = wr[widgetType].used[obj.criteriaID]
|
Nenue@8
|
256 print('|cFF00FF00Updating ('..obj.criteriaID..')', widget)
|
Nenue@8
|
257 elseif not wr[widgetType] or #wr[widgetType].free == 0 then
|
Nenue@8
|
258 widget = CreateFrame('Frame', 'VeneerObjective' .. widgetType .. (wr[widgetType] and (wr[widgetType].lastn+1) or (1)), VeneerObjectiveScroll, 'VeneerObjectiveCriteria' .. widgetType)
|
Nenue@7
|
259
|
Nenue@8
|
260 print('|cFFFF0088Creating `'..widget:GetName()..'` id', wr[widgetType].lastn)
|
Nenue@8
|
261 else
|
Nenue@8
|
262 widget = tremove(wr[widgetType].free)
|
Nenue@8
|
263 print('|cFFFFFF00Acquiring released widget', widget:GetName())
|
Nenue@7
|
264 end
|
Nenue@7
|
265
|
Nenue@8
|
266 wr[widgetType].used[obj.criteriaID] = widget
|
Nenue@7
|
267 widget.info = obj
|
Nenue@7
|
268 widget.parentInfo = info
|
Nenue@7
|
269 mod.InitializeWidget(widget)
|
Nenue@7
|
270 return widget
|
Nenue@3
|
271 end
|
Nenue@3
|
272
|
Nenue@8
|
273 --- WidgetTemplate 'OnLoad'
|
Nenue@7
|
274 mod.RegisterWidget = function(frame)
|
Nenue@8
|
275 local print = B.print('ObjectiveWidgets')
|
Nenue@7
|
276 local widgetType = frame.widgetType
|
Nenue@7
|
277 if not wr[frame.widgetType] then
|
Nenue@7
|
278 print('|cFFFF4400[[WidgetTemplate]]|r', widgetType)
|
Nenue@8
|
279 wr[widgetType] = { lastn = 1, free = {}, used = {}, usedIndex = {}, freeIndex = {} }
|
Nenue@8
|
280 else
|
Nenue@8
|
281 print('|cFF0088FF+ [[WidgetTemplate]]r', widgetType, wr[widgetType].lastn)
|
Nenue@8
|
282 wr[widgetType].lastn = wr[widgetType].lastn + 1
|
Nenue@3
|
283 end
|
Nenue@7
|
284 end
|
Nenue@8
|
285
|
Nenue@8
|
286 --- WidgetTemplate 'OnShow'
|
Nenue@7
|
287 mod.InitializeWidget = setmetatable({}, {
|
Nenue@7
|
288 __call = function(t, frame)
|
Nenue@7
|
289 -- todo: config pull
|
Nenue@7
|
290 local maxWidth = 250
|
Nenue@3
|
291
|
Nenue@7
|
292 frame:SetWidth(maxWidth)
|
Nenue@7
|
293 mod.UpdateWidget[frame.widgetType](frame)
|
Nenue@7
|
294 frame:SetScript('OnEvent', mod.UpdateWidget[frame.widgetType])
|
Nenue@7
|
295 if frame.info.isCurrency then
|
Nenue@7
|
296 frame:RegisterEvent('CHAT_MSG_CURRENCY')
|
Nenue@7
|
297 frame:RegisterEvent('CURRENCY_LIST_UPDATE')
|
Nenue@7
|
298 end
|
Nenue@7
|
299 frame:RegisterEvent('TRACKED_ACHIEVEMENT_UPDATE')
|
Nenue@7
|
300 frame:RegisterEvent('TRACKED_ACHIEVEMENT_LIST_CHANGED')
|
Nenue@7
|
301 frame:RegisterEvent('CRITERIA_UPDATE')
|
Nenue@7
|
302 frame:RegisterEvent('CRITERIA_COMPLETE')
|
Nenue@7
|
303 frame:RegisterEvent('CRITERIA_EARNED')
|
Nenue@7
|
304
|
Nenue@7
|
305 return t[frame.widgetType](frame)
|
Nenue@7
|
306 end,
|
Nenue@7
|
307 })
|
Nenue@8
|
308
|
Nenue@8
|
309 --- WidgetTemplate 'OnEvent'
|
Nenue@7
|
310 mod.UpdateWidget = setmetatable({}, {
|
Nenue@7
|
311 __call = function(t, frame)
|
Nenue@7
|
312 if not frame.widgetType then
|
Nenue@7
|
313 error('Invalid widget template, needs .widgetType')
|
Nenue@7
|
314 return
|
Nenue@7
|
315 end
|
Nenue@7
|
316
|
Nenue@7
|
317 return t[frame.widgetType](frame)
|
Nenue@7
|
318 end
|
Nenue@7
|
319 })
|
Nenue@7
|
320
|
Nenue@8
|
321 --- WidgetTemplate 'OnHide'
|
Nenue@7
|
322 mod.ReleaseWidget = function(frame)
|
Nenue@8
|
323 local print = B.print('ObjectiveWidgets')
|
Nenue@7
|
324 local reg = wr[frame.widgetType]
|
Nenue@8
|
325 if reg and reg.used[frame.info.criteriaID] then
|
Nenue@8
|
326 reg.used[frame.info.criteriaID] = nil
|
Nenue@8
|
327 frame.info = nil
|
Nenue@8
|
328 frame.parentInfo = nil
|
Nenue@7
|
329 frame:UnregisterAllEvents()
|
Nenue@7
|
330 tinsert(reg.free, frame)
|
Nenue@8
|
331 print('|cFFBBBBBBreleased from service', frame:GetName())
|
Nenue@8
|
332 end
|
Nenue@8
|
333 end
|
Nenue@8
|
334
|
Nenue@8
|
335 --- RemoveTrackedAchievement post-hook
|
Nenue@8
|
336 mod.CleanWidgets = function()
|
Nenue@8
|
337 local print = B.print('ObjectiveWidgets')
|
Nenue@8
|
338 local tracked = {GetTrackedAchievements() }
|
Nenue@8
|
339 for type, reg in pairs(mod.WidgetRegistry) do
|
Nenue@8
|
340 print('collecting', type)
|
Nenue@8
|
341 for criteriaID, frame in pairs(reg.used) do
|
Nenue@8
|
342 local id = frame.info.cheevID
|
Nenue@8
|
343
|
Nenue@8
|
344 if id and not tContains(tracked, id) then
|
Nenue@8
|
345
|
Nenue@8
|
346 print(' untracked achievement', id, 'associated with', criteriaID, frame:GetName())
|
Nenue@8
|
347 frame:Hide()
|
Nenue@8
|
348 end
|
Nenue@8
|
349 end
|
Nenue@3
|
350 end
|
Nenue@3
|
351 end
|
Nenue@7
|
352
|
Nenue@7
|
353 mod.WidgetParams = {
|
Nenue@7
|
354 ['ProgressBar'] = {
|
Nenue@7
|
355 height = 20,
|
Nenue@7
|
356 caption = {},
|
Nenue@7
|
357 quantityString = {SetFontObject = _G.VeneerFontNormal}
|
Nenue@7
|
358 }
|
Nenue@7
|
359 }
|
Nenue@7
|
360
|
Nenue@7
|
361 mod.InitializeWidget.ProgressBar = function(self)
|
Nenue@8
|
362 local print = B.print('ObjectiveWidgets')
|
Nenue@7
|
363 local params = mod.WidgetParams[self.widgetType]
|
Nenue@7
|
364 self.height = params.height
|
Nenue@7
|
365 self:SetHeight(20)
|
Nenue@7
|
366 self.bg:SetHeight(20)
|
Nenue@9
|
367 self.fg:ClearAllPoints()
|
Nenue@9
|
368 self.fg:SetPoint('BOTTOMLEFT', self, 'BOTTOMLEFT', 2, 2)
|
Nenue@8
|
369 self.fg:SetHeight(16)
|
Nenue@7
|
370 self.quantityString:SetFontObject(params.quantityString.SetFontObject)
|
Nenue@7
|
371 self.quantityString:SetText(self.info.quantityString)
|
Nenue@3
|
372 end
|
Nenue@7
|
373
|
Nenue@7
|
374 mod.UpdateWidget.ProgressBar = function (self)
|
Nenue@8
|
375 local print = B.print('ObjectiveWidgets')
|
Nenue@7
|
376 local quantity, requiredQuantity = self.info.quantity, self.info.requiredQuantity
|
Nenue@8
|
377
|
Nenue@7
|
378 if self.info.finished then
|
Nenue@9
|
379 self.fg:SetWidth(self.bg:GetWidth() - 4)
|
Nenue@7
|
380 elseif quantity == 0 then
|
Nenue@7
|
381 self.fg:Hide()
|
Nenue@7
|
382 else
|
Nenue@7
|
383 self.fg:Show()
|
Nenue@9
|
384 self.fg:SetWidth((self.bg:GetWidth()-4) * (quantity / requiredQuantity))
|
Nenue@7
|
385 end
|
Nenue@8
|
386 end |