Mercurial > wow > worldplan
comparison ClassPlan.lua @ 1:232617b8bcd5
New Order Hall mission tracker:
- record active missions and shipments across characters
author | Nenue |
---|---|
date | Thu, 13 Oct 2016 05:32:43 -0400 |
parents | |
children | b8a19781f79b |
comparison
equal
deleted
inserted
replaced
0:3830a592cb0f | 1:232617b8bcd5 |
---|---|
1 SLASH_CLASSPLAN1 = "/classplan" | |
2 SLASH_CLASSPLAN2 = "/cp" | |
3 SlashCmdList.CLASSPLAN = function(args) | |
4 if ClassOrderPlan:IsVisible() then | |
5 ClassOrderPlan:Hide() | |
6 else | |
7 ClassOrderPlan:Show() | |
8 DEFAULT_CHAT_FRAME:AddMessage('|cFF88FF00WorldPlan|r: Order Hall Panel') | |
9 end | |
10 end | |
11 | |
12 ClassOrderPlanCore = { | |
13 blocks = {}, | |
14 playerFirst = true, | |
15 timers = {} | |
16 } | |
17 ClassPlanBlockMixin = { | |
18 followers = {}, | |
19 blocks = {}, | |
20 } | |
21 local core, block = ClassOrderPlanCore, ClassPlanBlockMixin | |
22 local print = DEVIAN_WORKSPACE and function(...) print('ClassPlan', ...) end or nop | |
23 | |
24 function core:OnLoad () | |
25 self:RegisterUnitEvent('UNIT_PORTRAIT_UPDATE', 'player') | |
26 self:RegisterEvent('GARRISON_MISSION_STARTED') | |
27 self:RegisterEvent('GARRISON_MISSION_FINISHED') | |
28 self:RegisterEvent('PLAYER_LOGIN') | |
29 self:RegisterEvent('PLAYER_ENTERING_WORLD') | |
30 end | |
31 | |
32 | |
33 function core:OnEvent (event, ...) | |
34 if event == 'UNIT_PORTRAIT_UPDATE' then | |
35 SetPortraitTexture(self.portrait, 'player') | |
36 elseif event == 'PLAYER_LOGIN' then | |
37 if not self.initialized then | |
38 if IsLoggedIn() then | |
39 WorldPlanData.OrderHall = WorldPlanData.OrderHall or {} | |
40 self.data = WorldPlanData.OrderHall | |
41 | |
42 | |
43 local name, realm = UnitName('player') | |
44 realm = realm or GetRealmName() | |
45 self.profileKey = name .. '-' .. realm | |
46 if not self.data[self.profileKey] then | |
47 self.data[self.profileKey] = {} | |
48 end | |
49 self.profile = self.data[self.profileKey] | |
50 | |
51 self.initialized = true | |
52 print('initialized') | |
53 end | |
54 end | |
55 else | |
56 self:Refresh () | |
57 end | |
58 end | |
59 | |
60 function core:UpdateList() | |
61 self.sortedMissions = self.sortedMissions or {} | |
62 table.wipe(self.sortedMissions) | |
63 | |
64 for name, profile in pairs(self.data) do | |
65 local isMine = (profile == self.profile) | |
66 for index, data in pairs(profile.missions) do | |
67 | |
68 data.classColor = profile.classColor or {r = 0.7, g = 0.7, b =0.7} | |
69 | |
70 data.profileKey = name | |
71 data.isMine = (profile == self.profile) | |
72 tinsert(self.sortedMissions, data) | |
73 end | |
74 end | |
75 | |
76 for i, v in ipairs(self.sortedMissions) do | |
77 print(i, v.missionEndTime, v.name) | |
78 end | |
79 | |
80 | |
81 table.sort(self.sortedMissions, function(a,b) | |
82 local result = false | |
83 if not a or not b then | |
84 result = true | |
85 else | |
86 | |
87 if (a.isMine ~= b.isMine) and self.playerFirst then | |
88 result = a.isMine | |
89 else | |
90 if (not b.missionEndTime) or (not a.missionEndTime) then | |
91 print('missing article', b.missionEndTime, a.missionEndTime) | |
92 end | |
93 | |
94 result = ( b.missionEndTime > a.missionEndTime) | |
95 end | |
96 end | |
97 | |
98 print('cmp', (b and (b.missionEndTime .. ' ' .. tostring(b.isMine)) or '-'), '>', (a and (a.missionEndTime .. ' ' .. tostring(a.isMine)) or '-'), result, n) | |
99 return result | |
100 end) | |
101 self.isStale = nil | |
102 | |
103 local lastProfile | |
104 local numItems = #self.sortedMissions | |
105 for i, data in ipairs(self.sortedMissions) do | |
106 local block = self.blocks[i] | |
107 if not block then | |
108 block = CreateFrame('Frame', nil, self, 'ClassPlanBlock') | |
109 block:SetID(i) | |
110 self.numBlocks = (self.numBlocks or 0) + 1 | |
111 | |
112 if self.lastBlock then | |
113 block:SetPoint('TOPLEFT', self.lastBlock, 'BOTTOMLEFT', 0, 0) | |
114 else | |
115 block:SetPoint('TOPLEFT', self.portrait, 'TOPRIGHT', 0, 0) | |
116 end | |
117 self.lastBlock = block | |
118 self.blocks[i] = block | |
119 end | |
120 | |
121 local r,g,b = 1, 1, 1 | |
122 if data.isRare then | |
123 r,g,b = 0.1, 0.4, 1 | |
124 end | |
125 if data.isMine then | |
126 block.Icon:SetVertexColor(0,1,0,1) | |
127 else | |
128 block.Icon:SetVertexColor(1,1,1) | |
129 end | |
130 | |
131 | |
132 --block.missionData = data | |
133 block.missionID = data.missionID | |
134 block.missionEndTime = data.missionEndTime | |
135 block.Icon:SetAtlas(data.typeAtlas, false) | |
136 block.Label:SetText(data.name) | |
137 block.Label:SetTextColor(r, g, b) | |
138 | |
139 if lastProfile ~= data.profileKey then | |
140 block.Owner:SetText(data.profileKey) | |
141 block.Owner:SetTextColor(data.classColor.r, data.classColor.g, data.classColor.b) | |
142 else | |
143 block.Owner:SetText(nil) | |
144 end | |
145 block.Background:SetColorTexture(data.classColor.r, data.classColor.g, data.classColor.b, 0.5) | |
146 | |
147 block:Show() | |
148 lastProfile = data.profileKey | |
149 end | |
150 for i = numItems + 1, self.numBlocks do | |
151 if self.blocks[i] then | |
152 self.blocks[i]:Hide() | |
153 end | |
154 end | |
155 end | |
156 | |
157 function core:OnShow() | |
158 if self.isStale then | |
159 print('updating items on show') | |
160 self:UpdateList() | |
161 end | |
162 end | |
163 | |
164 function core:Refresh () | |
165 if not self.profile then | |
166 return | |
167 end | |
168 | |
169 self.items = C_Garrison.GetLandingPageItems(LE_GARRISON_TYPE_7_0) | |
170 | |
171 self.profile.missions = self.profile.missions or {} | |
172 | |
173 self.profile.classColor = RAID_CLASS_COLORS[select(2, UnitClass('player'))] | |
174 | |
175 | |
176 print('|cFF0088FFLocal Scoop|r:', self.profileKey) | |
177 if #self.items >= 1 then | |
178 table.wipe(self.profile.missions) | |
179 for index, data in ipairs(self.items) do | |
180 print('', data.name) | |
181 print(' |cFF00FF00', data.timeLeft .. '|r', date("%A %I:%m %p", data.missionEndTime)) | |
182 tinsert(self.profile.missions, data) | |
183 end | |
184 end | |
185 | |
186 if self:IsVisible() then | |
187 self:UpdateList() | |
188 else | |
189 print('items update pending') | |
190 self.isStale = true | |
191 end | |
192 end | |
193 | |
194 function block:OnUpdate() | |
195 if self.missionEndTime then | |
196 local timeLeft = self.missionEndTime - time() | |
197 if timeLeft < 0 then | |
198 self.TimeLeft:SetText('Complete!') | |
199 else | |
200 local days = floor(timeLeft/(24*3600)) | |
201 local hours = floor(mod(timeLeft, (24*3600)) / 3600) | |
202 local minutes = floor(mod(timeLeft, 3600) / 60) | |
203 local seconds = mod(timeLeft, 60) | |
204 self.TimeLeft:SetText( | |
205 ((days > 0) and (days .. ' d') or '') .. | |
206 ((hours > 0) and (' '.. hours .. ' hr') or '').. | |
207 ((minutes > 0) and (' ' .. minutes .. ' min' or '')) | |
208 , 1,1,1) | |
209 end | |
210 else | |
211 self.TimeLeft:SetText(self.missionEndTime) | |
212 end | |
213 end |