annotate Modules/ArtifactPower.lua @ 115:8c94bee4fdfc

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