Nick@113: -- Nick@113: -- Created by IntelliJ IDEA. Nick@113: -- User: Nick Nick@113: -- Date: 3/25/2017 Nick@113: -- Time: 7:07 PM Nick@113: -- To change this template use File | Settings | File Templates. Nick@113: -- Nick@113: Nick@113: local print = DEVIAN_WORKSPACE and function(...) print('VnWorldState', ...) end or nop Nick@113: Nick@113: local zoneEvents = { Nick@113: "ZONE_CHANGED_NEW_AREA", "ZONE_CHANGED_INDOORS", "ZONE_CHANGED" Nick@113: } Nick@113: local currencyEvents = { Nick@113: 'CURRENCY_DISPLAY_UPDATE', 'CHAT_MSG_CURRENCY' Nick@113: } Nick@113: local itemEvents = { Nick@113: 'CHAT_MSG_LOOT', 'BAG_UPDATE' Nick@113: } Nick@113: Nick@113: local blocks = { Nick@113: ["Ancient Mana"] = { Nick@113: currencyID = 1155, Nick@113: zones = { Nick@113: ['Suramar'] = true, Nick@113: ["Sashj'tar Ruins"] = true, Nick@113: ["Faronaar Ruins"] = true Nick@113: } Nick@113: }, Nick@113: ["Blood of Sargeras"] = { Nick@113: itemID = 124124, Nick@113: } Nick@113: } Nick@113: local items = {} Nick@113: Nick@113: Nick@113: VeneerWorldStateCurrencyMixin = { Blocks = {} } Nick@113: VeneerWorldStateCurrencyBlockMixin = {} Nick@113: local module = VeneerWorldStateCurrencyMixin Nick@113: local block = VeneerWorldStateCurrencyBlockMixin Nick@113: Nick@113: Nick@113: Nick@113: local function RegisterEvents (frame, events) Nick@113: for _, event in ipairs(events) do Nick@113: print('|cFFFF0088'..(frame.name or frame:GetName())..'|r', 'listening to', event) Nick@113: frame:RegisterEvent(event) Nick@113: end Nick@113: end Nick@113: Nick@113: function module:OnLoad () Nick@113: self:RegisterEvent("PLAYER_ENTERING_WORLD"); Nick@113: self:RegisterEvent('PLAYER_REGEN_ENABLED') Nick@113: self:RegisterEvent('PLAYER_REGEN_DISABLED') Nick@113: Nick@113: for name, info in pairs(blocks) do Nick@113: local frame = CreateFrame('Frame', nil, self, 'VeneerCurrencyTemplate') Nick@113: frame.name = name Nick@113: for k,v in pairs(info) do Nick@113: print(name, k, '=', v) Nick@113: frame[k] = v Nick@113: end Nick@113: Nick@113: local debug = function(...) Nick@113: print('|cFF0088FF<'..frame.name..'>|r', ...) Nick@113: end Nick@113: Nick@113: if info.itemID then Nick@113: local itemID = info.itemID Nick@113: items[itemID] = { Nick@113: count = 0, Nick@113: frame = frame Nick@113: } Nick@113: frame.Update = function(block) Nick@113: debug('Update [Item]') Nick@113: if items[itemID].count >= 1 then Nick@113: block.Icon:SetTexture(GetItemIcon(itemID)) Nick@113: block.Label:SetFormattedText("%d", items[itemID].count) Nick@113: return true Nick@113: end Nick@113: end Nick@113: RegisterEvents(self, itemEvents) Nick@113: elseif info.currencyID then Nick@113: local currencyID = info.currencyID Nick@113: frame.Update = function (block) Nick@113: debug('Update [Currency]') Nick@113: local name, earned, texture, earnedThisWeek, weeklyMax, totalMax = GetCurrencyInfo(currencyID) Nick@113: block.Icon:SetTexture(texture) Nick@113: block.Label:SetFormattedText("%d / %d", earned, totalMax) Nick@113: block:SetWidth(block.Icon:GetWidth() + block.Label:GetStringWidth() + 6) Nick@113: return true Nick@113: end Nick@113: Nick@113: RegisterEvents(frame, currencyEvents) Nick@113: end Nick@113: if info.zones then Nick@113: RegisterEvents(frame, zoneEvents) Nick@113: local zones = info.zones Nick@113: local of = frame.Update Nick@113: frame.Update = function(block) Nick@113: debug('Update [Zone]') Nick@113: local zone = self.zoneText Nick@113: local canShow = (zone and block.zones[zone]) and true or false Nick@113: if of then Nick@113: canShow = canShow and of(frame) Nick@113: end Nick@113: return canShow Nick@113: end Nick@113: end Nick@113: end Nick@113: end Nick@113: Nick@113: function module:OnEvent (event, arg) Nick@113: print(self:GetName(), 'OnEvent', event, arg) Nick@113: self:Update() Nick@113: end Nick@113: local toUpdate = {} Nick@113: local wipe = table.wipe Nick@113: function module:Update(isBatchUpdate) Nick@113: print(self:GetName(), 'Update()') Nick@113: if InCombatLockdown() then Nick@113: self:SetShown(false) Nick@113: return Nick@113: end Nick@113: Nick@113: Nick@113: for itemID in pairs(items) do Nick@113: items[itemID].count = 0 Nick@113: end Nick@113: self.zoneText = GetRealZoneText() Nick@113: local canShow = false Nick@113: Nick@113: for i = 0, NUM_BAG_SLOTS do Nick@113: local numSlots = GetContainerNumSlots(i) Nick@113: for j = 1, numSlots do Nick@113: local itemID = GetContainerItemID(i, j) Nick@113: local texture, count = GetContainerItemInfo(i,j) Nick@113: if items[itemID] then Nick@113: items[itemID].count = items[itemID].count + (count or 1) Nick@113: items[itemID].texture = texture Nick@113: print('tracked currency tally', items[itemID].count, '|T'..texture..':16:16|t') Nick@113: items[itemID].frame.Icon:SetTexture(texture) Nick@113: end Nick@113: end Nick@113: end Nick@113: Nick@113: for itemID, info in pairs(items) do Nick@113: end Nick@113: Nick@113: local lastBlock Nick@113: local totalWidth = 0 Nick@113: for _, block in ipairs(self.Blocks) do Nick@113: local blockIsShown = block:Update() or false Nick@113: block:SetShown(blockIsShown) Nick@113: canShow = canShow or blockIsShown Nick@113: Nick@113: Nick@113: if block:IsShown() then Nick@113: block:ClearAllPoints() Nick@113: if lastBlock then Nick@113: block:SetPoint('TOPLEFT', lastBlock, 'TOPRIGHT') Nick@113: else Nick@113: block:SetPoint('TOPLEFT', self, 'TOPLEFT') Nick@113: end Nick@113: lastBlock = block Nick@113: Nick@113: block:SetHeight(24) Nick@113: block:SetWidth(block.Icon:GetWidth() + block.Label:GetWidth()+4) Nick@113: totalWidth = totalWidth + block:GetWidth() Nick@113: end Nick@113: print(block:IsShown(), '|cFF0088FF'..block.name..'|r', block:GetSize()) Nick@113: Nick@113: end Nick@113: Nick@113: self:SetWidth(totalWidth) Nick@113: Nick@113: self.needsUpdate = nil Nick@113: print(self:IsShown(), '|cFF00FF88'..self:GetName()..'|r', self:GetSize()) Nick@113: self:SetShown(canShow) Nick@113: VeneerWorldState:Reanchor(true) Nick@113: end Nick@113: Nick@113: function module:OnUpdate() Nick@113: if self.needsUpdate then Nick@113: self:Update() Nick@113: end Nick@113: end Nick@113: Nick@113: function block:OnEvent(event, ...) Nick@113: print('|cFF0088FF<'..self.name..'>|r', 'OnEvent', event, ...) Nick@113: self:Update() Nick@113: end Nick@113: Nick@113: function block:Setup() Nick@113: Nick@113: end