annotate Modules/ArtifactPower.lua @ 111:1196c2bad31c

- obtain World Quest AP via WorldPlan - artifact button text adjustments - removed from UISpecialFrames to fix hiding on map open
author Nick@Zahhak
date Tue, 21 Mar 2017 16:33:51 -0400
parents a41f6b74709a
children 7c77fde36287
rev   line source
Nenue@97 1 -- Veneer
Nenue@97 2 -- ArtifactPower.lua
Nenue@97 3 -- Created: 1/15/2017 11:44 PM
Nenue@97 4 -- %file-revision%
Nenue@97 5 --
Nenue@97 6
Nenue@97 7 local print = DEVIAN_WORKSPACE and function(...) print('VnAP', ...) end or nop
Nenue@97 8 VeneerArtifactPowerMixin = {
Nenue@99 9 numItems = 0,
Nenue@99 10 Tokens = {},
Nenue@101 11 cache = {},
Nenue@101 12 fishingCache = {},
Nenue@101 13 scanQueue = {},
Nenue@99 14 ItemButtons = {},
Nenue@97 15 anchorPoint = 'TOP',
Nenue@97 16 anchorFrom = 'TOP',
Nenue@97 17 }
Nenue@101 18 local defaultSettings = {
Nenue@101 19 firstUse = true,
Nenue@101 20 autoHide = true,
Nenue@101 21 }
Nenue@97 22 local ap = VeneerArtifactPowerMixin
Nenue@97 23 local BAGS_TO_SCAN = {BACKPACK_CONTAINER }
Nenue@97 24 local TOOLTIP_NAME = 'VeneerAPScanner'
Nenue@98 25 local POINT_COSTS = {
Nenue@98 26 100, 300, 325, 350, 375,
Nenue@98 27 400, 425, 450, 525, 625,
Nenue@98 28 750, 875, 1000, 6840, 8830,
Nenue@98 29 11280, 14400, 18620, 24000, 30600,
Nenue@98 30 39520, 50880, 64800, 82500, 105280,
Nenue@98 31 138650, 182780, 240870, 325520, 417560,
Nenue@98 32 546000, 718200, 946660, 1245840, 1635200,
Nenue@98 33 191500, 2010000, 2110000, 2215000, 2325000,
Nenue@98 34 2440000, 2560000, 2690000, 2825000, 2965000,
Nenue@98 35 3115000, 3270000, 3435000, 3605000, 3785000,
Nenue@98 36 3975000, 4175000, 4385000, 4605000
Nenue@98 37 }
Nick@111 38 local FISHING_MAX_TRAITS = 24
Nick@111 39 local WEAPON_MAX_TRAITS = 54
Nick@111 40 local BUTTON_SIZE = 48
Nenue@99 41 local FRAME_LIST = {'ContainerFrame1', 'BankFrame'}
Nenue@99 42 local BAG_FRAMES = {'ContainerFrame1'}
Nenue@99 43 local BANK_FRAMES = {'BankFrame'}
Nenue@99 44
Nenue@97 45 function ap:OnLoad()
Nenue@97 46 self:RegisterEvent('BAG_UPDATE') -- use to obtain bag IDs to scan
Nenue@97 47 self:RegisterEvent('BAG_UPDATE_DELAYED') -- use to trigger actual scan activity
Nenue@97 48 self:RegisterEvent('BANKFRAME_OPENED') -- determine when bank info is available
Nenue@97 49 self:RegisterEvent('BANKFRAME_CLOSED') -- " " "
Nenue@97 50 self:RegisterEvent('ARTIFACT_UPDATE') -- when artifact data has changed
Nenue@98 51 self:RegisterEvent('ARTIFACT_XP_UPDATE') -- when artifact xp has changed (but not necessarily data)
Nenue@97 52 self:RegisterEvent('PLAYER_REGEN_ENABLED')
Nenue@97 53 self:RegisterEvent('PLAYER_REGEN_DISABLED')
Nenue@99 54 self:RegisterEvent('PLAYER_ENTERING_WORLD')
Nick@108 55 self:RegisterEvent('ITEM_LOCK_CHANGED') -- use to clear bag slot cache data
Nick@108 56 Veneer:AddHandler(self, self.anchorPoint, 2)
Nenue@97 57 SLASH_VENEER_AP1 = "/vap"
Nenue@97 58 SLASH_VENEER_AP2 = "/veneerap"
Nenue@98 59 SlashCmdList.VENEER_AP = function(arg)
Nenue@98 60 if arg == 'fishing' then
Nenue@98 61 if VeneerData.ArtifactPower.EnableFishing then
Nenue@98 62 VeneerData.ArtifactPower.EnableFishing = nil
Nenue@98 63 else
Nenue@98 64 VeneerData.ArtifactPower.EnableFishing = true
Nenue@98 65 end
Nenue@98 66 self:Print('Show Underlight Angler:', (VeneerData.ArtifactPower.EnableFishing and 'ON' or 'OFF'))
Nenue@98 67 self:Update()
Nick@108 68 elseif arg == 'reset' then
Nick@108 69 if self.db then
Nick@108 70 table.wipe(self.db.cache)
Nick@108 71 table.wipe(self.db.fishingCache)
Nick@108 72 end
Nick@108 73 self:Print('Cache data reset.')
Nick@108 74 self:Update()
Nenue@98 75 else
Nenue@98 76 self:Show()
Nenue@98 77 end
Nenue@97 78 end
Nenue@97 79
Nenue@97 80 self.tooltip = CreateFrame('GameTooltip', TOOLTIP_NAME, self, 'GameTooltipTemplate')
Nenue@99 81
Nenue@97 82
Nenue@97 83 end
Nick@108 84 local ShortNumberString = function (value)
Nick@108 85 if value >= 100000 then
Nick@108 86 return tostring(floor(value/1000)) .. 'k'
Nick@108 87 elseif value >= 1000 then
Nick@108 88 return tostring(floor(value/100)/10) .. 'k'
Nick@108 89 else
Nick@108 90 return value
Nick@108 91 end
Nick@108 92 end
Nenue@97 93
Nenue@102 94
Nenue@102 95 local IsBagnonOpen = function()
Nenue@102 96 return ((BagnonFramebank and BagnonFramebank:IsShown()) or (BagnonFrameinventory and BagnonFrameinventory:IsShown()))
Nenue@102 97 end
Nenue@99 98 local addonCompatibility = {
Nenue@99 99 ['Bagnon'] = {
Nenue@99 100 BagFrames = {'BagnonFrameinventory'},
Nenue@99 101 BankFrames = {'BagnonFramebank'},
Nenue@102 102 FrameMethods = {
Nenue@103 103 ['Hide'] = IsBagnonOpen,
Nenue@103 104 ['Show'] = IsBagnonOpen
Nenue@102 105 },
Nenue@103 106 PostHooks = {},
Nenue@99 107 MethodClass = 'Bagnon',
Nenue@102 108 MethodHooks = {'BANK_OPENED', 'BANKFRAME_CLOSED'},
Nenue@102 109
Nenue@99 110 }
Nenue@97 111 }
Nenue@97 112
Nenue@103 113
Nenue@103 114
Nenue@103 115 local queued_hooks = {}
Nenue@103 116 local function CreateHook(...)
Nenue@103 117 if select('#', ...) >= 2 then
Nenue@103 118 tinsert(queued_hooks, {...})
Nenue@103 119 end
Nenue@103 120 if not InCombatLockdown() then
Nenue@103 121 local info = tremove(queued_hooks)
Nenue@103 122 while info do
Nick@111 123 --[[local oFunc = tremove(info, #info)
Nick@111 124 local args = info
Nick@111 125
Nick@111 126 local func = function(...)
Nick@111 127 print('|cFFFF0088Callback:|r', unpack(args))
Nick@111 128
Nick@111 129 oFunc(...)
Nick@111 130 end
Nick@111 131 print('hooking', unpack(info), oFunc, func)
Nick@111 132 hooksecurefunc(unpack(info), func)
Nick@111 133 --]]
Nenue@103 134 hooksecurefunc(unpack(info))
Nenue@103 135 info = tremove(queued_hooks)
Nenue@103 136 end
Nenue@103 137
Nenue@103 138 end
Nenue@103 139 end
Nenue@103 140
Nenue@102 141 local function AddFrameHooks(frame, args)
Nenue@102 142 for funcName, func in pairs(args.FrameMethods) do
Nenue@102 143 print('binding', frame:GetName(), funcName, 'to', tostring(func))
Nenue@103 144 CreateHook(frame, funcName, function()
Nick@111 145 print(frame:GetName(), funcName, 'hook')
Nenue@103 146 VeneerArtifactPower:TryToShow()
Nenue@103 147 end)
Nenue@102 148 end
Nenue@102 149 end
Nenue@102 150 local PENDING_HOOKS = {}
Nenue@102 151
Nenue@102 152 local function RegisterInventoryFrame(name, listType, args)
Nenue@102 153 print('register', name, 'as inventory frame type =', (listType == BAG_FRAMES) and 'bags' or 'bank')
Nenue@102 154 tinsert(FRAME_LIST, name)
Nenue@102 155 tinsert(listType, name)
Nenue@102 156 if _G[name] then
Nenue@102 157 AddFrameHooks(_G[name], args)
Nenue@102 158 else
Nenue@102 159 PENDING_HOOKS[name] = args
Nenue@102 160 end
Nenue@102 161 end
Nenue@102 162
Nenue@97 163 function ap:Setup()
Nenue@97 164 print(self:GetName()..':Setup()')
Nenue@97 165 local guid = UnitGUID('player')
Nenue@97 166 VeneerData.ArtifactPower = VeneerData.ArtifactPower or defaultSettings
Nenue@101 167 self.db = VeneerData.ArtifactPower
Nenue@101 168 self.db[guid] = self.db[guid] or {}
Nenue@101 169 self.db.cache = self.db.cache or {}
Nenue@101 170 self.db.fishingCache = self.db.fishingCache or {}
Nenue@101 171
Nenue@101 172 for i, data in pairs(self.cache) do
Nenue@101 173 -- bring in anything found before player data is active
Nenue@101 174 self.db.cache[i] = data
Nenue@101 175 end
Nenue@101 176 for i, data in pairs(self.fishingCache) do
Nenue@101 177 self.db.fishingCache[i] = data
Nenue@101 178 end
Nenue@101 179
Nenue@101 180
Nenue@101 181 self.profile = self.db[guid]
Nick@108 182 self.profile.cache = self.profile.cache or {}
Nick@108 183 self.profile.cache.bagItems = self.profile.cache.bagItems or {}
Nick@108 184 self.profile.cache.bags = self.profile.cache.bags or {}
Nick@108 185 self.profile.cache.fishing = self.profile.cache.fishing or {}
Nick@108 186 self.profile.cache.items = self.profile.cache.items or {}
Nenue@97 187 self.profile.bagslots = self.profile.bagslots or {}
Nenue@97 188 self.profile.artifacts = self.profile.artifacts or {}
Nenue@97 189 self.updateSummary = true
Nick@108 190 self.cache = self.profile.cache
Nenue@97 191
Nenue@101 192 VeneerArtifactPowerTimer:SetScript('OnUpdate', function()
Nenue@101 193 self:OnUpdate()
Nenue@101 194 end)
Nenue@101 195
Nenue@99 196 local DoTryToShow = function()
Nick@111 197
Nenue@99 198 self:TryToShow()
Nenue@99 199 end
Nenue@103 200 CreateHook("OpenBackpack", DoTryToShow)
Nenue@103 201 CreateHook("CloseBackpack", DoTryToShow)
Nenue@99 202
Nenue@97 203 -- Bagnon compatibility
Nenue@97 204 -- todo: ArkInventory, Elv, etc
Nenue@99 205 for addon, args in pairs(addonCompatibility) do
Nenue@99 206 if IsAddOnLoaded(addon) then
Nenue@102 207
Nenue@99 208 for _, name in ipairs(args.BagFrames) do
Nenue@102 209 RegisterInventoryFrame(name, BAG_FRAMES, args)
Nenue@99 210 end
Nenue@99 211 for _, name in ipairs(args.BankFrames) do
Nenue@102 212 RegisterInventoryFrame(name, BANK_FRAMES, args)
Nenue@99 213 end
Nenue@102 214
Nenue@102 215 -- should only specify non-secure functions in this table
Nenue@99 216 for _, name in ipairs(args.PostHooks) do
Nenue@99 217 local oFunc = _G[name]
Nenue@103 218 print('hook entry', name, tostring(oFunc))
Nenue@103 219 CreateHook(name, function(...)
Nenue@103 220 print('|cFFFF0088' .. name .. '|r', ..., 'original', tostring(oFunc))
Nenue@99 221 oFunc(...)
Nenue@99 222 self:TryToShow()
Nenue@103 223 end)
Nenue@99 224 end
Nenue@99 225 local frame = _G[args.MethodClass]
Nenue@99 226 if frame then
Nenue@103 227 print()
Nenue@99 228 for _, name in ipairs(args.MethodHooks) do
Nenue@103 229 CreateHook(frame, name, DoTryToShow)
Nenue@99 230 end
Nenue@97 231 end
Nenue@97 232 end
Nenue@97 233 end
Nenue@101 234
Nenue@101 235 if self.db.firstUse then
Nenue@101 236 self.db.firstUse = nil
Nenue@101 237
Nenue@101 238 end
Nenue@99 239 end
Nenue@97 240
Nenue@97 241 local UNDERLIGHT_ANGLER_ID = 133755
Nenue@97 242
Nick@111 243 function ap:ResetCache()
Nick@111 244 table.wipe(self.cache.items)
Nick@111 245 table.wipe(self.cache.fishing)
Nick@111 246 table.wipe(self.cache.bags)
Nick@111 247 table.wipe(self.cache.bagItems)
Nick@111 248 self:ScanAllBags()
Nick@111 249 end
Nick@111 250
Nenue@97 251 function ap:QueueBag(containerID)
Nenue@97 252 containerID = tonumber(containerID)
Nenue@97 253 if not containerID then
Nenue@97 254 return
Nenue@97 255 end
Nenue@97 256
Nenue@97 257 if not tContains(BAGS_TO_SCAN, containerID) then
Nenue@97 258 print(' queueing', containerID, type(containerID), #BAGS_TO_SCAN , 'in line')
Nenue@97 259 BAGS_TO_SCAN[#BAGS_TO_SCAN + 1] = containerID
Nenue@97 260 end
Nenue@97 261 end
Nenue@97 262
Nenue@99 263 function ap:Reanchor()
Nenue@99 264 if Veneer then
Nenue@99 265 Veneer:DynamicReanchor()
Nenue@99 266 end
Nenue@99 267 end
Nenue@99 268
Nenue@97 269 function ap:OnShow()
Nenue@99 270 print('|cFFFFFF00OnShow()|r')
Nenue@102 271
Nenue@102 272 for name, args in pairs(PENDING_HOOKS) do
Nenue@102 273 if _G[name] then
Nenue@102 274 AddFrameHooks(_G[name], args)
Nenue@102 275 PENDING_HOOKS[name] = nil
Nenue@102 276 end
Nenue@102 277 end
Nenue@102 278
Nenue@102 279
Nenue@97 280 self.enabled = true
Nenue@99 281 self:ScanAllBags()
Nenue@99 282 self:Reanchor()
Nenue@97 283 end
Nenue@97 284 function ap:OnHide()
Nick@111 285 print('|cFF88FF00OnHide()|r', debugstack())
Nenue@99 286 self:Reanchor()
Nenue@97 287 end
Nenue@97 288 function ap:OnEnter()
Nenue@97 289
Nenue@97 290 GameTooltip:SetOwner(self, 'ANCHOR_CURSOR')
Nenue@97 291
Nenue@99 292
Nenue@97 293 GameTooltip:AddLine(self.bagAP)
Nenue@97 294 GameTooltip:AddLine(self.bankAP)
Nenue@97 295
Nenue@97 296 end
Nenue@97 297
Nenue@99 298 function ap:TryToShow()
Nenue@99 299
Nenue@99 300 print('|cFFFFFF00TryToShow()')
Nenue@99 301
Nenue@99 302 if not InCombatLockdown() then
Nenue@99 303 for _, name in ipairs(FRAME_LIST) do
Nenue@103 304 print('test:', name, (_G[name] and _G[name]:IsShown()))
Nick@111 305 if _G[name] and _G[name]:IsVisible() then
Nenue@99 306 if self:IsShown() then
Nenue@99 307 self:Update()
Nenue@99 308 else
Nenue@99 309 self:Show()
Nenue@99 310 end
Nenue@99 311 return
Nenue@99 312 end
Nenue@99 313 end
Nenue@99 314 end
Nenue@99 315
Nick@111 316 print('failed tests')
Nenue@99 317 self:Hide()
Nenue@99 318 end
Nenue@99 319
Nenue@99 320
Nenue@97 321 function ap:OnEvent(event, ...)
Nenue@99 322 print('|cFF00FF88OnEvent()', event, ...)
Nenue@99 323 if event == 'PLAYER_ENTERING_WORLD' then
Nenue@99 324 self:TryToShow()
Nenue@99 325 elseif event == 'BAG_UPDATE' then
Nenue@97 326 local containerID = ...
Nick@108 327
Nick@108 328
Nenue@97 329 self:QueueBag(containerID)
Nick@108 330 elseif event == 'ITEM_LOCK_CHANGED' then
Nick@108 331
Nick@108 332 local containerID, slotID = ...
Nick@108 333
Nick@108 334 if self.cache.bags[containerID] and self.cache.bags[containerID][slotID] then
Nick@108 335 self.cache.bags[containerID][slotID] = nil
Nick@108 336 self.cache.fishing[containerID][slotID] = nil
Nick@108 337 end
Nick@108 338
Nick@108 339
Nenue@97 340 elseif event == 'PLAYER_BANKSLOTS_CHANGED' then
Nenue@99 341 self:ScanAllBags()
Nenue@97 342 elseif event == 'BAG_UPDATE_DELAYED' then
Nenue@99 343 if not self.firstHit then
Nenue@99 344 self.firstHit = true
Nenue@99 345 else
Nenue@99 346 self:ScanAllBags()
Nenue@99 347 end
Nenue@97 348 elseif event == 'BANKFRAME_OPENED' then
Nenue@97 349 self.bankAccess = true
Nenue@99 350 self:ScanAllBags()
Nenue@97 351 elseif event == 'BANKFRAME_CLOSED' then
Nenue@99 352 self.bankAccess = nil
Nenue@97 353 elseif event == 'ARTIFACT_UPDATE' then
Nenue@98 354 local newItem = ...
Nenue@98 355 if newItem then
Nenue@98 356 local itemID, _, name, texture, currentXP, pointsSpent = C_ArtifactUI:GetArtifactInfo()
Nenue@98 357 self:SetArtifact(itemID, name, texture, currentXP, pointsSpent)
Nenue@98 358 self:ScanAllBags(self.bankAccess)
Nenue@98 359 end
Nenue@98 360 elseif event == 'ARTIFACT_XP_UPDATE' then
Nenue@98 361 local itemID, _, name, texture, currentXP, pointsSpent = C_ArtifactUI:GetEquippedArtifactInfo()
Nenue@98 362 self:SetArtifact(itemID, name, texture, currentXP, pointsSpent)
Nenue@98 363 self:ScanAllBags(self.bankAccess)
Nenue@97 364 elseif event == 'PLAYER_REGEN_ENABLED' then
Nenue@103 365
Nenue@103 366 if self.queuedScan then
Nenue@103 367 self:ScanAllBags(self.backAccess)
Nenue@103 368 else
Nenue@103 369 self:TryToShow()
Nenue@97 370 end
Nenue@97 371
Nenue@103 372 if #queued_hooks >= 1 then
Nenue@103 373 CreateHook()
Nenue@103 374 end
Nenue@97 375 elseif event == 'PLAYER_REGEN_DISABLED' then
Nenue@97 376 self:Hide()
Nenue@97 377 end
Nenue@97 378 end
Nenue@97 379
Nenue@101 380 function ap:OnUpdate()
Nenue@101 381 if #self.scanQueue >= 1 then
Nenue@101 382 local scanInfo = tremove(self.scanQueue, 1)
Nick@111 383 end
Nick@111 384 if IsShiftKeyDown() then
Nick@111 385 self.Refresh:Show()
Nick@111 386 else
Nick@111 387 self.Refresh:Hide()
Nick@111 388 end
Nenue@101 389
Nenue@101 390 end
Nenue@101 391
Nenue@97 392 function ap:OnMouseDown()
Nenue@97 393 self.enabled = nil
Nenue@97 394 self:Hide()
Nenue@97 395 end
Nenue@97 396
Nenue@97 397 function ap:Update()
Nenue@97 398 if not self:IsShown() then
Nenue@99 399 print('|cFFFF4400Update()|r')
Nenue@97 400 return
Nenue@97 401 end
Nenue@97 402 print('|cFF00FFFFUpdate()|r')
Nenue@97 403
Nenue@97 404 local bankText, bagText
Nenue@101 405 if not self.profile.knowledgeMultiplier then
Nenue@101 406 bankText = '|cFF00FF00Shift-Right-Click an artifact weapon to start building data.'
Nenue@101 407 elseif not (self.bankAP and self.bagAP) then
Nenue@97 408 bankText = '|cFFFF0000Open bank frame to count all AP|r '
Nenue@97 409 else
Nick@111 410
Nick@111 411 if self.bagAP and (self.bagAP > 0) then
Nick@111 412 bankText = 'Inventory: |cFFFFFFFF' .. ShortNumberString(self.bagAP) .. '|r'
Nick@111 413 end
Nick@111 414 if self.bankAP and (self.bankAP > 0) then
Nick@111 415 bankText = (bankText and (bankText .. ' | ') or '') .. '|cFFFFFF00'..ShortNumberString(self.bankAP)..' banked|r'
Nick@111 416 end
Nick@111 417 if self.fishingAP and self.fishingAP > 0 then
Nick@111 418 bankText = (bankText and (bankText .. ' | ') or '') .. '|cFF0088FF' .. ShortNumberString(self.fishingAP) .. ' fishing|r'
Nick@111 419 end
Nick@111 420 end
Nick@111 421
Nick@111 422 self.worldQuestAP = 0
Nick@111 423 if WorldPlan then
Nick@111 424
Nick@111 425 if not self.worldPlanHooked then
Nick@111 426 WorldPlan:RegisterDataCallback(function()
Nick@111 427 self:Update()
Nick@111 428 end)
Nick@111 429 end
Nick@111 430
Nick@111 431
Nick@111 432 local showWQ
Nick@111 433 print('world plan is loaded')
Nick@111 434 local worldQuests = WorldPlan:GetQuestPins()
Nick@111 435 for index, pin in ipairs(worldQuests) do
Nick@111 436 if pin.dataLoaded and (pin.rewardType == WORLD_QUEST_REWARD_TYPE_FLAG_ARTIFACT_POWER) then
Nick@111 437 showWQ = true
Nick@111 438 print(pin.itemNumber)
Nick@111 439 self.worldQuestAP = self.worldQuestAP + pin.itemNumber
Nenue@98 440 end
Nenue@98 441 end
Nick@111 442
Nick@111 443 if showWQ then
Nick@111 444 bankText = (bankText and (bankText .. '\n') or '') .. '|cFFFFBB00World Quests:|r |cFFFFFFFF' .. ShortNumberString(self.worldQuestAP) .. ''
Nick@111 445 end
Nick@111 446
Nenue@99 447 end
Nenue@99 448
Nenue@97 449 self.SummaryHeader:SetText(bankText)
Nenue@97 450
Nenue@101 451 local numButtons = 0
Nick@111 452 local contentsHeight = 16 + self.SummaryHeader:GetHeight()
Nick@111 453 local contentsWidth = self.SummaryHeader:GetWidth() + 16
Nenue@101 454 if self.profile.knowledgeMultiplier then
Nenue@101 455 numButtons = self:UpdateArtifactButtons()
Nick@108 456
Nick@111 457 if numButtons ~= 0 then
Nick@111 458 contentsHeight = contentsHeight + 64
Nick@111 459 end
Nick@111 460
Nick@111 461 contentsWidth = max(contentsWidth, 64*numButtons + 4 * (numButtons+1))
Nick@108 462
Nick@108 463 local itemsWidth, itemsHeight = self:UpdateItemButtons()
Nick@108 464 contentsHeight = contentsHeight + itemsHeight
Nick@108 465 contentsWidth = max(contentsWidth, itemsWidth)
Nenue@101 466 end
Nenue@101 467
Nenue@101 468
Nick@111 469 if not self.hasArtifacts then
Nick@111 470 self:SetShown(false)
Nick@111 471 end
Nick@111 472
Nenue@101 473
Nick@108 474 self:SetWidth(contentsWidth)
Nick@108 475 self:SetHeight(contentsHeight)
Nenue@101 476 self:Reanchor()
Nenue@101 477 end
Nenue@101 478
Nenue@101 479 function ap:UpdateArtifactButtons()
Nenue@101 480
Nenue@97 481 -- Artifact icons, in no particular order
Nenue@99 482 self.equippedID = C_ArtifactUI.GetEquippedArtifactInfo()
Nick@111 483 self.canAddAP = nil
Nick@111 484 self.canAddFishingAP = nil
Nick@111 485 local hasArtifacts
Nenue@97 486 local numButtons = 0
Nenue@99 487 local lastFrame = self
Nenue@99 488 local fishingID, fishingData
Nenue@98 489 local index, button
Nenue@97 490 for itemID, artifact in pairs(self.profile.artifacts) do
Nenue@99 491 if (itemID == UNDERLIGHT_ANGLER_ID) then
Nenue@98 492 if VeneerData.ArtifactPower.EnableFishing then
Nenue@98 493 fishingID = itemID
Nenue@98 494 fishingData = artifact
Nenue@98 495 end
Nenue@97 496
Nick@111 497 if artifact.level < FISHING_MAX_TRAITS then
Nick@111 498 if itemID == self.equippedID then
Nick@111 499 self.canAddFishingAP = true
Nick@111 500 end
Nick@111 501 end
Nick@111 502
Nick@111 503
Nenue@98 504 else
Nick@111 505 if artifact.level < WEAPON_MAX_TRAITS then
Nick@111 506
Nick@111 507 if itemID == self.equippedID then
Nick@111 508 self.canAddAP = true
Nick@111 509 end
Nick@111 510 hasArtifacts = true
Nick@108 511 numButtons = numButtons + 1
Nick@108 512 button = self.Artifact[numButtons]
Nick@108 513 button.relativeFrame = lastFrame
Nick@111 514 lastFrame = button:SetButton(itemID, artifact, numButtons, (self.equippedID == itemID), nil)
Nick@108 515 end
Nenue@97 516 end
Nick@111 517 end
Nenue@97 518
Nenue@97 519
Nick@108 520 if fishingData and (self.fishingAP and self.fishingAP > 0) then
Nenue@98 521 numButtons = numButtons + 1
Nick@111 522 hasArtifacts = true
Nenue@99 523 local button = self.Artifact[numButtons]
Nenue@99 524 button.relativeFrame = lastFrame
Nick@111 525 button.isFishing = true
Nenue@99 526 button:SetButton(fishingID, fishingData, numButtons, self.equippedID == fishingID)
Nenue@98 527 end
Nenue@97 528
Nick@111 529 self.hasArtifacts = hasArtifacts
Nenue@99 530 for i = numButtons+ 1, #self.Artifact do
Nenue@97 531 print('hide', i)
Nenue@97 532 self.Artifact[i]:Hide()
Nenue@97 533 end
Nenue@97 534
Nick@111 535
Nenue@101 536 return numButtons
Nenue@97 537 end
Nenue@97 538
Nenue@99 539
Nenue@99 540 function ap:UpdateItemButtons()
Nenue@99 541 print('|cFF00FFFFUpdateItemButtons()|r')
Nick@111 542
Nick@111 543 local apType
Nick@111 544 if self.canAddFishingAP then
Nick@111 545 apType = true
Nick@111 546 elseif not self.canAddAP then
Nick@111 547 for index, button in ipairs(self.Tokens) do
Nick@111 548 button:Hide()
Nick@111 549 end
Nick@111 550 return 0, 0
Nick@111 551 end
Nick@111 552
Nick@111 553
Nenue@99 554 local lastFrame, upFrame
Nenue@99 555 local numButtons = 0
Nenue@101 556 local buttonsHeight = 0
Nick@108 557 local buttonsWidth = 0
Nick@111 558
Nenue@99 559 for index, button in ipairs(self.Tokens) do
Nick@111 560 if (button.numItems >= 1) and (button.isFishingAP == apType) then
Nenue@99 561 if button.itemName then
Nenue@99 562 self:SetItemAction(button)
Nenue@99 563 end
Nenue@99 564
Nenue@99 565 button:ClearAllPoints()
Nenue@99 566 numButtons = numButtons + 1
Nick@111 567 local col = mod(numButtons,8)
Nenue@99 568 print(index, button:GetID(), button.Icon:GetTexture())
Nenue@99 569 if numButtons == 1 then
Nenue@101 570 button:SetPoint('TOPLEFT', self, 'TOPLEFT', 4, -76)
Nenue@99 571 upFrame = button
Nenue@101 572 buttonsHeight = 52
Nenue@99 573 else
Nick@108 574 if col == 1 then
Nick@108 575 button:SetPoint('TOPLEFT', upFrame, 'BOTTOMLEFT', 0, -2)
Nick@108 576 upFrame = button
Nick@108 577 buttonsHeight = buttonsHeight + 52
Nick@108 578
Nick@108 579 else
Nick@108 580 button:SetPoint('TOPLEFT', lastFrame, 'TOPRIGHT', 2, 0)
Nick@108 581
Nick@108 582 end
Nenue@99 583 end
Nick@111 584
Nenue@99 585 button.Count:SetText(button.numItems)
Nenue@99 586 lastFrame = button
Nenue@99 587 button:Show()
Nenue@99 588 else
Nenue@99 589 button:Hide()
Nenue@99 590 end
Nick@111 591 buttonsWidth = min(numButtons, 8) * (BUTTON_SIZE)
Nick@111 592 end
Nick@111 593
Nick@111 594
Nick@111 595
Nick@111 596 if buttonsWidth ~= 0 then
Nick@111 597 buttonsWidth = buttonsWidth + 8+ ((min(numButtons, 8)-1)*2)
Nenue@99 598 end
Nenue@99 599
Nenue@101 600
Nenue@101 601
Nick@108 602 return buttonsWidth, buttonsHeight
Nenue@99 603 end
Nenue@99 604
Nenue@99 605 function ap:SetItemAction(button, name)
Nenue@99 606 name = name or self.itemName
Nenue@99 607 if InCombatLockdown() then
Nenue@99 608 self.itemName = name
Nenue@99 609 return
Nenue@99 610 else
Nenue@99 611 button:SetAttribute('*type*','item')
Nenue@99 612 button:SetAttribute('*item*', name)
Nenue@99 613 end
Nenue@99 614 end
Nenue@99 615
Nick@111 616 function ap:GetItemButton(itemID, texture, itemAP, fishing)
Nenue@99 617 print('|cFF00FFFFGetItemButton()|r', itemID, texture, itemAP)
Nenue@99 618 local button = self.ItemButtons[itemID]
Nenue@101 619
Nenue@99 620 if not button then
Nenue@99 621 button = CreateFrame('Button', 'VeneerAPToken'..itemID, self, 'VeneerItemButton')
Nenue@101 622 button.baseAP = itemAP
Nenue@101 623
Nenue@99 624 button:SetPushedTexture([[Interface\Buttons\UI-Quickslot-Depress]])
Nenue@99 625 button:SetHighlightTexture([[Interface\Buttons\ButtonHilight-Square]],"ADD")
Nenue@99 626 button:SetID(itemID)
Nenue@99 627 button.numItems = 0
Nenue@99 628 button.Icon:SetTexture(texture)
Nenue@99 629 button:RegisterForClicks("AnyUp")
Nick@111 630 button.isFishingAP = fishing
Nenue@99 631 self:SetItemAction(button, GetItemInfo(itemID))
Nenue@99 632
Nenue@99 633 print(' created')
Nenue@99 634 self.ItemButtons[itemID] = button
Nenue@99 635 self.numItems = self.numItems + 1
Nenue@99 636 end
Nenue@99 637
Nick@108 638 local itemAPtext = itemAP
Nenue@101 639 if itemAPtext >= 100000 then
Nenue@101 640 itemAPtext = floor(itemAPtext/1000) .. 'k'
Nenue@101 641 elseif itemAPtext >= 1000 then
Nenue@101 642 itemAPtext = (floor(itemAPtext/100)/10 ) .. 'k'
Nenue@101 643 end
Nenue@101 644 button.Label:SetText(itemAPtext)
Nenue@101 645
Nenue@99 646 button.numItems = button.numItems + 1
Nenue@99 647 return button
Nenue@99 648 end
Nenue@99 649
Nenue@101 650 function ap:GetItemAP(itemID, itemLink, bagData)
Nick@108 651 if not self.cache.items[itemID] then
Nenue@101 652
Nick@111 653 print('doing tooltip scan', itemLink, itemID)
Nenue@101 654 self.tooltip:SetOwner(self, 'ANCHOR_NONE')
Nenue@101 655 self.tooltip:SetHyperlink(itemLink)
Nenue@101 656 self.tooltip:Show()
Nenue@101 657 local numLines = self.tooltip:NumLines()
Nenue@101 658 if numLines >= 3 then
Nenue@101 659 for i = 3, numLines do
Nenue@101 660 local text = _G[TOOLTIP_NAME .. 'TextLeft'.. i]:GetText()
Nick@111 661 if text then
Nick@111 662
Nick@111 663 text = text:lower():gsub(',', '')
Nick@111 664 if text:match('equipped artifact') then
Nick@111 665 print(itemLink, '-', tonumber(text))
Nick@111 666 local itemAP = text:match('%d+')
Nick@111 667 if itemAP then
Nick@111 668 itemAP = itemAP
Nick@111 669 self.cache.items[itemID] = tonumber(itemAP)
Nick@111 670 end
Nick@111 671 end
Nick@111 672 if text:match('fishing artifact') then
Nick@111 673 local fishingAP = text:match("%d+")
Nick@111 674 fishingAP = fishingAP
Nick@111 675 print(itemLink, 'fishing', tonumber(text))
Nick@111 676 if fishingAP then
Nick@111 677 self.cache.items[itemID] = tonumber(fishingAP)
Nick@111 678 self.cache.fishing[itemID] = true
Nick@111 679 end
Nenue@101 680 end
Nenue@101 681 end
Nenue@101 682 end
Nenue@101 683 else
Nenue@101 684
Nick@108 685 self.cache.items[itemID] = 0
Nenue@101 686 end
Nenue@101 687 end
Nick@108 688 return self.cache.items[itemID], self.cache.fishing[itemID]
Nenue@101 689 end
Nenue@101 690
Nenue@103 691 function ap:SetArtifact(itemID, name, texture, currentXP, pointsSpent)
Nenue@103 692 print('|cFF00FF00SetArtifact()|r')
Nenue@103 693 if not self.profile then
Nenue@103 694 return
Nenue@103 695 end
Nenue@103 696 local artifacts = self.profile.artifacts
Nenue@103 697
Nenue@103 698 local multi = C_ArtifactUI.GetArtifactKnowledgeMultiplier()
Nick@108 699 if multi and (self.profile.knowledgeMultiplier ~= multi) then
Nick@108 700 table.wipe(self.cache.items)
Nick@108 701 table.wipe(self.cache.fishing)
Nick@108 702 end
Nick@108 703
Nenue@103 704 self.profile.knowledgeMultiplier = multi or self.profile.knowledgeMultiplier
Nenue@103 705 print('multiplier:', multi)
Nenue@103 706
Nenue@103 707 if itemID then
Nenue@103 708
Nenue@103 709 self.currentEquipped = itemID
Nenue@103 710
Nenue@103 711 artifacts[itemID] = artifacts[itemID] or {}
Nenue@103 712 table.wipe(artifacts[itemID])
Nenue@103 713 local artifact = artifacts[itemID]
Nenue@103 714
Nenue@103 715 artifact.name = name
Nenue@103 716 artifact.texture = texture
Nenue@103 717 artifact.currentXP = currentXP
Nenue@103 718 artifact.level = pointsSpent
Nenue@103 719 local cost = C_ArtifactUI.GetCostForPointAtRank(pointsSpent)
Nick@108 720 artifact.currentCost = cost
Nenue@103 721
Nenue@103 722 local pointsAvailable = pointsSpent
Nenue@103 723 local actualCost = cost
Nenue@103 724 local actualXP = currentXP
Nenue@103 725 while actualXP >= actualCost do
Nenue@103 726 pointsAvailable = pointsAvailable + 1
Nenue@103 727 actualXP = actualXP - actualCost
Nenue@103 728 print(pointsAvailable, '-', actualCost, '=', actualXP)
Nenue@103 729 actualCost = C_ArtifactUI.GetCostForPointAtRank(pointsAvailable)
Nenue@103 730 end
Nenue@103 731 print('updating', itemID, name, currentXP, pointsSpent, pointsAvailable, actualXP)
Nenue@103 732 artifact.actualXP = actualXP
Nenue@103 733 artifact.actualLevel = pointsAvailable
Nenue@103 734 artifact.actualCost = actualCost
Nenue@103 735
Nenue@103 736 end
Nenue@103 737 end
Nenue@103 738
Nenue@97 739 function ap:ScanBag(id)
Nenue@97 740 print('|cFF00FFFFScanBag()|r', id, IsBagOpen(id), GetContainerNumSlots(id))
Nenue@97 741 local numSlots = GetContainerNumSlots(id)
Nenue@97 742 local requiresUpdate
Nenue@97 743 if numSlots == 0 then
Nenue@97 744 return nil
Nenue@97 745 end
Nenue@97 746
Nenue@97 747
Nenue@97 748 self.profile.bagslots[id] = self.profile.bagslots[id] or {}
Nenue@97 749 table.wipe(self.profile.bagslots[id])
Nenue@97 750 local bagData = self.profile.bagslots[id]
Nenue@97 751 bagData.totalAP = 0
Nenue@99 752 bagData.fishingAP = 0
Nenue@99 753 bagData.items = bagData.items or {}
Nenue@99 754 table.wipe(bagData.items)
Nick@111 755 local c = self.cache
Nenue@99 756
Nick@111 757 c.bagItems[id] = c.bagItems[id] or {}
Nick@111 758 c.bags[id] = c.bags[id] or {}
Nick@111 759 c.fishing[id] = c.fishing[id] or {}
Nick@108 760
Nenue@97 761 for slotID = 1, numSlots do
Nenue@97 762 local texture, count, locked, quality, readable, lootable, link = GetContainerItemInfo(id, slotID)
Nenue@101 763 if link then
Nenue@101 764 local itemID = GetContainerItemID(id, slotID)
Nenue@101 765 local name, _, quality, iLevel, reqLevel, class, subclass = GetItemInfo(link)
Nenue@97 766
Nick@111 767 if class == 'Consumable' or subclass == 'Cooking' then
Nenue@102 768 --print(GetItemInfo(link))
Nick@108 769 local itemAP, isFishingAP
Nick@111 770 if c.bags[id][slotID] and (c.bagItems[id][slotID] == itemID) then
Nick@111 771 --print('cached slot', id, slotID, name)
Nick@111 772 itemAP = c.bags[id][slotID]
Nick@111 773 isFishingAP = c.fishing[id] and c.fishing[id][slotID]
Nick@108 774 else
Nick@108 775 itemAP, isFishingAP = self:GetItemAP(itemID, link)
Nick@111 776 c.bagItems[id][slotID] = itemID
Nick@111 777 c.bags[id][slotID] = itemAP
Nick@111 778 c.fishing[id][slotID] = isFishingAP
Nick@108 779 end
Nick@108 780
Nick@108 781
Nenue@102 782 --print(itemAP, isFishingAP)
Nenue@102 783 if itemAP and (itemAP > 0) then
Nick@111 784 local itemButton = self:GetItemButton(itemID, texture, itemAP, isFishingAP)
Nenue@102 785
Nenue@101 786 if isFishingAP then
Nenue@101 787 bagData.fishingItems = (bagData.fishingItems or 0) + 1
Nenue@101 788 bagData.fishingAP = (bagData.fishingAP or 0) + itemAP
Nenue@101 789 else
Nick@108 790 itemAP = itemAP
Nenue@101 791 bagData.numItems = (bagData.numItems or 0) + 1
Nenue@101 792 bagData.totalAP = (bagData.totalAP or 0) + itemAP
Nenue@101 793 end
Nenue@101 794 bagData.items[itemID] = (bagData.items[itemID] or 0) + 1
Nenue@101 795 end
Nenue@101 796 elseif self.profile.artifacts[itemID] then
Nick@111 797 --print('artifact weapon', itemID, link, id, slotID)
Nenue@101 798 self.profile.artifacts[itemID].containerID = id
Nenue@101 799 self.profile.artifacts[itemID].slotID = slotID
Nick@111 800 else
Nick@111 801 --print('skipping', class, subclass, link)
Nenue@101 802 end
Nenue@99 803
Nenue@97 804 end
Nenue@97 805
Nenue@97 806 end
Nenue@97 807
Nenue@97 808 end
Nenue@97 809
Nenue@98 810 local BAG_SLOTS = {0, 1, 2, 3, 4 }
Nenue@98 811 local BANK_SLOTS = {-1, 5, 6,7, 8, 9, 10, 11, 12}
Nenue@99 812 local ItemCounts = {}
Nenue@99 813 function ap:ScanAllBags()
Nenue@99 814 if InCombatLockdown() then
Nenue@99 815 self.queuedScan = true
Nenue@99 816 return
Nenue@99 817 end
Nenue@101 818 if not self.profile.knowledgeMultiplier then
Nenue@101 819 print('need to get knowledge level')
Nenue@101 820 return
Nenue@101 821 end
Nenue@101 822
Nenue@99 823 self.queuedScan = nil
Nenue@98 824
Nenue@101 825 print('|cFFFF0088ScanAllBags()|r', self.profile.knowledgeMultiplier)
Nenue@97 826
Nenue@99 827 for _, button in ipairs(self.Tokens) do
Nenue@99 828 button.numItems = 0
Nenue@99 829 end
Nenue@99 830
Nenue@99 831
Nenue@98 832 for _, bagID in ipairs(BAG_SLOTS) do
Nenue@98 833 self:ScanBag(bagID)
Nenue@97 834 end
Nenue@97 835
Nenue@99 836 if self.bankAccess then
Nenue@98 837 for _, bagID in ipairs(BANK_SLOTS) do
Nenue@98 838 self:ScanBag(bagID)
Nenue@98 839 end
Nenue@98 840 end
Nenue@98 841
Nenue@98 842 self.bankAP = 0
Nenue@98 843 self.bagAP = 0
Nenue@99 844 self.fishingAP = 0
Nenue@99 845
Nenue@99 846 table.wipe(ItemCounts)
Nenue@98 847 for id, bagData in pairs(self.profile.bagslots) do
Nick@111 848 print(id, GetBagName(id), bagData.totalAP, bagData.fishingAP)
Nenue@98 849 id = tonumber(id)
Nenue@98 850 if bagData.totalAP then
Nenue@98 851 if (id == BANK_CONTAINER) or (id >= 5) then
Nenue@98 852 self.bankAP = self.bankAP + bagData.totalAP
Nenue@98 853 else
Nenue@98 854 self.bagAP = self.bagAP + bagData.totalAP
Nenue@97 855 end
Nenue@98 856 end
Nenue@99 857 if bagData.fishingAP then
Nenue@99 858 self.fishingAP = self.fishingAP + bagData.fishingAP
Nenue@99 859 end
Nenue@97 860
Nenue@97 861 end
Nenue@98 862 self.lastUpdate = GetTime()
Nenue@103 863 self.queuedScan = nil
Nenue@99 864 self:TryToShow()
Nenue@97 865 end
Nenue@97 866
Nenue@97 867 VeneerArtifactButtonMixin = {}
Nenue@98 868
Nick@111 869 function VeneerArtifactButtonMixin:SetButton(itemID, artifact, index, equipped, fishing)
Nenue@99 870 print(itemID, index)
Nenue@98 871 print(artifact.name, artifact.texture, artifact.currentXP)
Nenue@98 872 self:SetID(itemID)
Nick@108 873 if not artifact.currentCost then
Nick@108 874 artifact.currentCost = artifact.cost
Nick@108 875 end
Nick@108 876
Nenue@98 877 for k,v in pairs(artifact) do
Nenue@98 878 --print('::',k,v)
Nenue@98 879 self[k] = v
Nenue@98 880 end
Nenue@98 881
Nick@111 882 self.isFishing = fishing
Nenue@98 883 -- this can change between artifact parses
Nenue@98 884 local potentialPoints = self.actualLevel
Nenue@99 885 local totalAP = (itemID ~= UNDERLIGHT_ANGLER_ID) and ((self:GetParent().bankAP or 0) + (self:GetParent().bagAP or 0)) or (self:GetParent().fishingAP or 0)
Nenue@99 886 print(totalAP)
Nenue@98 887 local potentialXP = self.actualXP + totalAP
Nenue@99 888
Nenue@98 889 self.potentialXP = potentialXP
Nenue@98 890 local potentialCost = C_ArtifactUI.GetCostForPointAtRank(potentialPoints)
Nenue@98 891 while potentialXP >= potentialCost do
Nenue@98 892 potentialXP = potentialXP - potentialCost
Nenue@98 893 potentialPoints = potentialPoints + 1
Nenue@98 894 print('inc estimate', potentialXP, potentialPoints)
Nenue@98 895 potentialCost = C_ArtifactUI.GetCostForPointAtRank(potentialPoints)
Nenue@98 896 end
Nenue@98 897 self.potentialCost = potentialCost
Nenue@98 898 self.potentialLevel = potentialPoints
Nenue@98 899 self.potentialAdjustedXP = potentialXP
Nenue@98 900
Nick@108 901 self.maxCost = self.currentCost
Nick@108 902 for i = self.level + 1, #POINT_COSTS do
Nick@108 903 self.maxCost = self.maxCost + POINT_COSTS[i]
Nick@108 904 end
Nenue@98 905
Nenue@99 906 if index ~= 1 then
Nenue@99 907 self:ClearAllPoints()
Nenue@99 908 self:SetPoint('TOPLEFT', self.relativeFrame, 'TOPRIGHT', 4, 0)
Nenue@99 909 else
Nenue@99 910 self:ClearAllPoints()
Nenue@99 911 self:SetPoint('TOPLEFT', self.relativeFrame, 'TOPLEFT', 4, -4)
Nenue@99 912 end
Nenue@98 913
Nenue@99 914 self.isEquipped = equipped
Nenue@98 915 self:Update()
Nenue@98 916 self:Show()
Nenue@98 917 return self
Nenue@98 918 end
Nenue@98 919
Nenue@97 920 function VeneerArtifactButtonMixin:Update()
Nenue@99 921 local r, g, b = 1, 1, 1
Nenue@99 922 local lR, lG, lB = 1, 1, 0
Nenue@99 923 local levelText = self.level
Nick@111 924 local xpValue = ShortNumberString(self.currentXP)
Nick@108 925 local costValue = self.currentCost
Nenue@97 926 if self.actualLevel ~= self.level then
Nenue@99 927 levelText, r,g,b = self.actualLevel, 0,1,0
Nick@111 928 xpValue, costValue, lR, lG, lB = ShortNumberString(self.potentialXP) .. '\n' .. ShortNumberString(self.potentialCost-self.potentialXP), self.actualCost, 0, 1, 0
Nenue@99 929 elseif self.potentialLevel ~= self.level then
Nenue@99 930 levelText, r, g, b = self.potentialLevel, 0,1,1
Nick@111 931 xpValue, costValue, lR, lG, lB = ShortNumberString(self.potentialXP) .. '\n' .. ShortNumberString(self.potentialCost-self.potentialXP), self.potentialCost, 0,1,1
Nick@111 932 else
Nick@111 933 xpValue, lR, lG, lB = ShortNumberString(self.actualXP) .. '\n|cFFFFFF00' .. ShortNumberString(self.actualCost-self.actualXP)..'|r', 1, 1, 1
Nenue@97 934 end
Nenue@97 935
Nenue@99 936 self.Level:SetText(levelText)
Nenue@99 937 self.Level:SetTextColor(r, g, b)
Nick@111 938 self.CurrentXP:SetText( xpValue)
Nenue@99 939 self.CurrentXP:SetTextColor(lR, lG, lB)
Nenue@99 940
Nenue@97 941 if self.isEquipped then
Nenue@97 942 self:SetNormalTexture([[Interface\Buttons\ButtonHilight-Square]])
Nenue@97 943 self:GetNormalTexture():SetBlendMode('ADD')
Nenue@97 944 self:GetNormalTexture():SetVertexColor(0,1,0)
Nenue@97 945 else
Nenue@97 946 self:SetNormalTexture(nil, 'ADD')
Nenue@97 947 end
Nenue@97 948
Nick@108 949 local currentProgress = (self.currentXP < self.currentCost) and (self.currentXP / self.currentCost) or 1
Nenue@98 950 if self.level <= 53 then
Nenue@98 951 self.CurrentProgress.animateFrom = self.CurrentProgress:GetHeight() or 1
Nenue@98 952 self.CurrentProgress.animateTo = currentProgress * self:GetHeight()
Nenue@98 953 self.CurrentProgress:Show()
Nenue@101 954 self.ProgressLine:Show()
Nenue@98 955 else
Nenue@98 956 self.CurrentProgress:Hide()
Nenue@101 957 self.ProgressLine:Hide()
Nenue@98 958 end
Nenue@99 959
Nenue@98 960 if self.potentialXP > self.currentXP then
Nenue@99 961 local projectedProgress = (self.potentialAdjustedXP < self.potentialCost) and (self.potentialXP / self.potentialCost) or 1
Nenue@98 962 if (projectedProgress > currentProgress) then
Nenue@98 963 self.AdjustedProgress:SetPoint('BOTTOM', self.CurrentProgress, 'TOP')
Nenue@98 964 projectedProgress = projectedProgress - currentProgress
Nenue@98 965 else
Nenue@98 966 self.AdjustedProgress:SetPoint('BOTTOM', self, 'BOTTOM')
Nenue@98 967 end
Nenue@99 968 print('show potential', currentProgress, projectedProgress)
Nenue@98 969 self.AdjustedProgress.animateFrom = self.AdjustedProgress:GetHeight() or 1
Nenue@98 970 self.AdjustedProgress.animateTo = projectedProgress * self:GetHeight()
Nenue@101 971 self.AdjustedLine:Show()
Nenue@98 972 self.AdjustedProgress:Show()
Nenue@98 973 else
Nenue@98 974 self.AdjustedProgress:Hide()
Nenue@101 975 self.AdjustedLine:Hide()
Nenue@98 976 end
Nenue@97 977 self.Icon:SetTexture(self.texture)
Nenue@97 978 self:SetSize(64,64)
Nenue@97 979 end
Nenue@97 980
Nenue@98 981
Nenue@98 982 function VeneerArtifactButtonMixin:AnimateProgress(region)
Nenue@98 983 local cTime = GetTime()
Nenue@98 984 if not region.animateStart then
Nenue@98 985 region.animateStart = cTime
Nenue@98 986 end
Nenue@98 987 local progressTo, progressFrom = region.animateTo, region.animateFrom
Nenue@98 988 local elapsed = cTime - region.animateStart
Nenue@98 989 if elapsed >= .5 then
Nenue@98 990 region:SetHeight(progressTo)
Nenue@98 991 region.animateTo = nil
Nenue@98 992 region.animateStart = nil
Nenue@98 993 region.animateFrom = nil
Nenue@98 994 else
Nenue@98 995 local progress = elapsed / .5
Nenue@98 996 local height = (progressFrom + (progressTo - progressFrom) * progress)
Nenue@98 997 --print(self:GetName(), progressTo, progressFrom, (progressTo - progressFrom), ceil(progress*10)/10, ceil(height))
Nenue@98 998 region:SetHeight(height)
Nenue@98 999 end
Nenue@98 1000 end
Nenue@98 1001
Nenue@98 1002 function VeneerArtifactButtonMixin:OnUpdate(sinceLast)
Nenue@98 1003 if self.CurrentProgress.animateTo then
Nenue@98 1004 self:AnimateProgress(self.CurrentProgress)
Nenue@98 1005 end
Nenue@98 1006
Nenue@98 1007 if self.AdjustedProgress.animateTo then
Nenue@98 1008 self:AnimateProgress(self.AdjustedProgress)
Nenue@98 1009 end
Nenue@98 1010 end
Nenue@98 1011
Nenue@97 1012 function VeneerArtifactButtonMixin:OnEnter()
Nenue@97 1013 GameTooltip:SetOwner(self, 'ANCHOR_CURSOR')
Nenue@97 1014 GameTooltip:SetText(self.name)
Nick@108 1015 GameTooltip:AddLine(ShortNumberString(self.currentXP) .. ' / '..ShortNumberString(self.currentCost), 1, 1, 0)
Nenue@98 1016 if self.potentialXP > self.currentXP then
Nick@108 1017 GameTooltip:AddLine(ShortNumberString(self.potentialXP) .. ' potential XP', 0, 1, 1)
Nenue@99 1018 if self.potentialAdjustedXP ~= self.potentialXP then
Nick@108 1019 GameTooltip:AddLine(ShortNumberString(self.potentialAdjustedXP) .. ' / ' .. ShortNumberString(self.potentialCost).. ' after', 0, 1, 0)
Nenue@98 1020 end
Nenue@97 1021 end
Nenue@99 1022 if self.actualLevel ~= self.level then
Nick@108 1023 GameTooltip:AddLine(ShortNumberString(self.actualLevel - self.level) .. ' points unlocked', 0, 1, 1)
Nick@108 1024 end
Nick@108 1025 if self.currentXP < self.currentCost then
Nick@108 1026 GameTooltip:AddLine(ShortNumberString(self.currentCost - self.currentXP) .. ' needed')
Nenue@99 1027 end
Nenue@99 1028
Nenue@97 1029 GameTooltip:Show()
Nenue@97 1030 end
Nenue@97 1031 function VeneerArtifactButtonMixin:OnLeave()
Nenue@97 1032 if GameTooltip:IsOwned(self) then
Nenue@97 1033 GameTooltip:Hide()
Nenue@97 1034 end
Nenue@97 1035 end
Nick@108 1036 function VeneerArtifactButtonMixin:OnHide()
Nick@108 1037
Nick@108 1038 if GameTooltip:IsOwned(self) then
Nick@108 1039 GameTooltip:Hide()
Nick@108 1040 end
Nick@108 1041 end
Nenue@97 1042
Nenue@97 1043 function VeneerArtifactButtonMixin:OnClick(button, down)
Nenue@97 1044 if self.isEquipped then
Nenue@97 1045 SocketInventoryItem(16)
Nenue@97 1046 else
Nick@108 1047 if IsShiftKeyDown() then
Nenue@97 1048 SocketContainerItem(self.containerID, self.slotID)
Nick@108 1049 else
Nick@108 1050
Nick@108 1051 end
Nenue@97 1052 end
Nenue@97 1053 end