Mercurial > wow > worldplan
comparison ClassPlan.lua @ 6:48001b6a9496
shipment/missions list refresh should commit all result sets
| author | Nenue |
|---|---|
| date | Fri, 21 Oct 2016 18:10:53 -0400 |
| parents | 4e1883842abf |
| children | 802abb8a10ea |
comparison
equal
deleted
inserted
replaced
| 5:4e1883842abf | 6:48001b6a9496 |
|---|---|
| 24 timers = {}, | 24 timers = {}, |
| 25 shipments = {}, | 25 shipments = {}, |
| 26 playerFirst = false, | 26 playerFirst = false, |
| 27 prototypes = {} | 27 prototypes = {} |
| 28 } | 28 } |
| 29 ClassPlanBlockMixin = { | 29 ClassPlanMissionMixin = { |
| 30 templateName = 'ClassPlanBlock', | 30 templateName = 'ClassPlanMissionEntry', |
| 31 events = {'GARRISON_MISSION_LIST_UPDATE', 'GARRISON_MISSION_STARTED', 'GARRISON_MISSION_FINISHED'},} | 31 events = {'GARRISON_MISSION_LIST_UPDATE', 'GARRISON_MISSION_STARTED', 'GARRISON_MISSION_FINISHED'},} |
| 32 ClassPlanShipmentMixin = { | 32 ClassPlanShipmentMixin = { |
| 33 templateName = 'ClassPlanShipment', | 33 templateName = 'ClassPlanShipmentEntry', |
| 34 parent = false, | 34 parent = false, |
| 35 point = 'TOPRIGHT', | 35 point = 'TOPRIGHT', |
| 36 relativePoint ='TOPRIGHT', | 36 relativePoint ='TOPRIGHT', |
| 37 events = {'GARRISON_LANDINGPAGE_SHIPMENTS', 'GARRISON_TALENT_UPDATE', "GARRISON_TALENT_COMPLETE", "GARRISON_SHIPMENT_RECEIVED"}, | 37 events = {'GARRISON_LANDINGPAGE_SHIPMENTS', 'GARRISON_TALENT_UPDATE', "GARRISON_TALENT_COMPLETE", "GARRISON_SHIPMENT_RECEIVED"}, |
| 38 } | 38 } |
| 39 setmetatable(ClassPlanShipmentMixin, {__index = ClassPlanBlockMixin}) | 39 setmetatable(ClassPlanShipmentMixin, {__index = ClassPlanMissionMixin}) |
| 40 local core, MissionsHandler, ShipmentsHandler = ClassOrderPlanCore, ClassPlanBlockMixin, ClassPlanShipmentMixin | 40 local core, MissionsHandler, ShipmentsHandler = ClassOrderPlanCore, ClassPlanMissionMixin, ClassPlanShipmentMixin |
| 41 local print = DEVIAN_WORKSPACE and function(...) print('ClassPlan', ...) end or nop | 41 local print = DEVIAN_WORKSPACE and function(...) print('ClassPlan', ...) end or nop |
| 42 | 42 |
| 43 local GetTimeLeftString = function(timeLeft) | 43 local GetTimeLeftString = function(timeLeft) |
| 44 local days = floor(timeLeft/(24*3600)) | 44 local days = floor(timeLeft/(24*3600)) |
| 45 local hours = floor(mod(timeLeft, (24*3600)) / 3600) | 45 local hours = floor(mod(timeLeft, (24*3600)) / 3600) |
| 46 local minutes = floor(mod(timeLeft, 3600) / 60) | 46 local minutes = floor(mod(timeLeft, 3600) / 60) |
| 47 local seconds = mod(timeLeft, 60) | 47 local seconds = mod(timeLeft, 60) |
| 48 if days >= 1 then | 48 if days >= 1 then |
| 49 return (days .. 'd' .. ' ') .. ((hours > 0) and (hours .. 'h ') or '') | 49 return (days .. 'd' .. ' ') .. ((hours > 0) and (hours .. 'h') or '') |
| 50 else | 50 else |
| 51 return ((hours > 0) and (hours .. 'h ') or '') .. ((minutes > 0) and (minutes .. ' min') or '') | 51 return ((hours > 0) and (hours .. 'h') or '') .. ((minutes > 0) and (' ' ..minutes .. ' min') or '') |
| 52 end | 52 end |
| 53 end | 53 end |
| 54 | 54 |
| 55 MissionsHandler.GetPlayerData = function(self) | 55 MissionsHandler.GetPlayerData = function(self) |
| 56 if not self.profile then | 56 if not self.profile then |
| 99 | 99 |
| 100 ShipmentsHandler.OnGetItem = function(data) | 100 ShipmentsHandler.OnGetItem = function(data) |
| 101 if data.shipmentsTotal then | 101 if data.shipmentsTotal then |
| 102 local timeLeft = data.creationTime + data.duration - GI_currentTime | 102 local timeLeft = data.creationTime + data.duration - GI_currentTime |
| 103 if (timeLeft <= 0) and (data.shipmentsReady < data.shipmentsTotal) then | 103 if (timeLeft <= 0) and (data.shipmentsReady < data.shipmentsTotal) then |
| 104 local numOrders = -1*floor(timeLeft/data.duration) | 104 local numOrders = min(-1*floor(timeLeft/data.duration), (data.shipmentsTotal - data.shipmentsReady)) |
| 105 | 105 |
| 106 data.originalCreationTime = data.creationTime | 106 if not data.originalCreationTime then |
| 107 data.originalShipmentsReady = data.shipmentsReady | 107 data.originalCreationTime = data.creationTime |
| 108 data.originalShipmentsReady = data.shipmentsReady | |
| 109 end | |
| 108 | 110 |
| 109 data.creationTime = data.creationTime + numOrders*data.duration | 111 data.creationTime = data.creationTime + numOrders*data.duration |
| 110 data.shipmentsReady = data.shipmentsReady + numOrders | 112 data.shipmentsReady = data.shipmentsReady + numOrders |
| 111 print(data.profileKey, 'shipment "'.. data.name..'" reconciling', numOrders, 'lapsed orders. -->', data.creationTime, data.shipmentsReady) | 113 print(data.profileKey, 'shipment "'.. data.name..'" reconciling', numOrders, 'lapsed orders. -->', data.creationTime, data.shipmentsReady) |
| 112 end | 114 end |
| 121 else | 123 else |
| 122 return (a.creationTime) < (b.creationTime) | 124 return (a.creationTime) < (b.creationTime) |
| 123 end | 125 end |
| 124 end | 126 end |
| 125 | 127 |
| 126 local AddShipmentInfo = function(self, shipmentType, name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString, itemName, itemIcon, itemQuality, itemID, followerID) | 128 local ShipmentsInfo = {} |
| 129 local AddShipmentInfo = function(shipmentType, name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString, itemName, itemIcon, itemQuality, itemID, followerID) | |
| 127 -- early login queries may return empty tables, causing the sorter to compare nil | 130 -- early login queries may return empty tables, causing the sorter to compare nil |
| 128 if not creationTime then | 131 if not creationTime then |
| 129 return | 132 return |
| 130 end | 133 end |
| 131 print(shipmentType, name, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString) | 134 print(shipmentType, name, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString) |
| 132 tinsert(self.shipments, | 135 tinsert(ShipmentsInfo, |
| 133 { | 136 { |
| 134 shipmentType = shipmentType, | 137 shipmentType = shipmentType, |
| 135 name = name, | 138 name = name, |
| 136 icon = texture, | 139 icon = texture, |
| 137 shipmentCapacity = shipmentCapacity, | 140 shipmentCapacity = shipmentCapacity, |
| 149 end | 152 end |
| 150 ShipmentsHandler.GetPlayerData = function (self) | 153 ShipmentsHandler.GetPlayerData = function (self) |
| 151 if not self.profile then | 154 if not self.profile then |
| 152 return | 155 return |
| 153 end | 156 end |
| 154 wipe(self.shipments) | 157 wipe(ShipmentsInfo) |
| 155 | 158 |
| 156 | 159 |
| 157 local garrisonType = LE_GARRISON_TYPE_7_0 | 160 local garrisonType = LE_GARRISON_TYPE_7_0 |
| 158 local buildings = C_Garrison.GetBuildings(garrisonType); | 161 local buildings = C_Garrison.GetBuildings(garrisonType); |
| 159 local shipmentIndex = 0 | 162 local shipmentIndex = 0 |
| 160 --print('Buildings:') | 163 --print('Buildings:') |
| 161 for i = 1, #buildings do | 164 for i = 1, #buildings do |
| 162 local name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString, itemName, itemIcon, itemQuality, itemID = C_Garrison.GetLandingPageShipmentInfo(buildingID); | 165 local name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString, itemName, itemIcon, itemQuality, itemID = C_Garrison.GetLandingPageShipmentInfo(buildingID); |
| 163 AddShipmentInfo(self, 'Building', name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString, itemName, itemIcon, itemQuality, itemID) | 166 AddShipmentInfo('Building', name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString, itemName, itemIcon, itemQuality, itemID) |
| 164 end | 167 end |
| 165 | 168 |
| 166 --print('Follower:') | 169 --print('Follower:') |
| 167 local followerShipments = C_Garrison.GetFollowerShipments(garrisonType); | 170 local followerShipments = C_Garrison.GetFollowerShipments(garrisonType); |
| 168 for i = 1, #followerShipments do | 171 for i = 1, #followerShipments do |
| 169 local name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString, _, _, _, _, followerID = C_Garrison.GetLandingPageShipmentInfoByContainerID(followerShipments[i]); | 172 local name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString, _, _, _, _, followerID = C_Garrison.GetLandingPageShipmentInfoByContainerID(followerShipments[i]); |
| 170 AddShipmentInfo(self, 'Follower', name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString, nil, nil, nil, nil, followerID) | 173 AddShipmentInfo('Follower', name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString, nil, nil, nil, nil, followerID) |
| 171 end | 174 end |
| 172 | 175 |
| 173 --print('Loose:') | 176 --print('Loose:') |
| 174 local looseShipments = C_Garrison.GetLooseShipments(garrisonType) | 177 local looseShipments = C_Garrison.GetLooseShipments(garrisonType) |
| 175 for i = 1, #looseShipments do | 178 for i = 1, #looseShipments do |
| 176 local name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString = C_Garrison.GetLandingPageShipmentInfoByContainerID(looseShipments[i]); | 179 local name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString = C_Garrison.GetLandingPageShipmentInfoByContainerID(looseShipments[i]); |
| 177 AddShipmentInfo(self, 'Follower', name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString) | 180 AddShipmentInfo('Misc', name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString) |
| 178 end | 181 end |
| 179 | 182 |
| 180 local talentTrees = C_Garrison.GetTalentTrees(garrisonType, select(3, UnitClass("player"))); | 183 local talentTrees = C_Garrison.GetTalentTrees(garrisonType, select(3, UnitClass("player"))); |
| 181 -- this is a talent that has completed, but has not been seen in the talent UI yet. | 184 -- this is a talent that has completed, but has not been seen in the talent UI yet. |
| 182 local completeTalentID = C_Garrison.GetCompleteTalent(garrisonType); | 185 local completeTalentID = C_Garrison.GetCompleteTalent(garrisonType); |
| 184 if (talentTrees) then | 187 if (talentTrees) then |
| 185 for treeIndex, tree in ipairs(talentTrees) do | 188 for treeIndex, tree in ipairs(talentTrees) do |
| 186 for talentIndex, talent in ipairs(tree) do | 189 for talentIndex, talent in ipairs(tree) do |
| 187 local showTalent = false; | 190 local showTalent = false; |
| 188 if (talent.isBeingResearched) or (talent.id == completeTalentID) then | 191 if (talent.isBeingResearched) or (talent.id == completeTalentID) then |
| 189 AddShipmentInfo(self, 'Talent', talent.name, talent.icon, 1, (talent.isBeingResearched and 0 or 1), 1, talent.researchStartTime, talent.researchDuration, talent.timeleftString) | 192 AddShipmentInfo('Talent', talent.name, talent.icon, 1, (talent.isBeingResearched and 0 or 1), 1, talent.researchStartTime, talent.researchDuration, talent.timeleftString) |
| 190 end | 193 end |
| 191 end | 194 end |
| 192 end | 195 end |
| 193 end | 196 end |
| 194 | 197 |
| 195 self.profile.shipments = self.profile.shipments or {} | 198 self.profile.shipments = self.profile.shipments or {} |
| 196 if #self.shipments >= 1 then | 199 wipe(self.profile.shipments) |
| 197 wipe(self.profile.shipments) | 200 for index, data in ipairs(ShipmentsInfo) do |
| 198 for index, data in ipairs(self.shipments) do | 201 --DEFAULT_CHAT_FRAME:AddMessage(data.shipmentType ..' '.. tostring(data.name) ..' '.. tostring(data.creationTime) ..' '.. tostring(data.duration)) |
| 199 | 202 tinsert(self.profile.shipments, data) |
| 200 --DEFAULT_CHAT_FRAME:AddMessage(data.shipmentType ..' '.. tostring(data.name) ..' '.. tostring(data.creationTime) ..' '.. tostring(data.duration)) | 203 end |
| 201 tinsert(self.profile.shipments, data) | 204 self.isStale = true |
| 202 end | |
| 203 self.isStale = true | |
| 204 end | |
| 205 | 205 |
| 206 if self:IsVisible() then | 206 if self:IsVisible() then |
| 207 self:Refresh() | 207 self:Refresh() |
| 208 end | 208 end |
| 209 end | 209 end |
| 320 end | 320 end |
| 321 | 321 |
| 322 function core:OnEvent (event, ...) | 322 function core:OnEvent (event, ...) |
| 323 print(event) | 323 print(event) |
| 324 if event == 'PLAYER_REGEN_DISABLED' then | 324 if event == 'PLAYER_REGEN_DISABLED' then |
| 325 self:SetShown(false) | 325 if self:IsVisible() then |
| 326 self.combatHide = true | |
| 327 self:SetShown(false) | |
| 328 end | |
| 329 | |
| 326 elseif event == 'PLAYER_REGEN_ENABLED' then | 330 elseif event == 'PLAYER_REGEN_ENABLED' then |
| 327 self:SetShown(true) | 331 if self.combatHide == true then |
| 332 self.combatHide = nil | |
| 333 self:SetShown(true) | |
| 334 end | |
| 328 elseif event == 'PLAYER_LOGIN' then | 335 elseif event == 'PLAYER_LOGIN' then |
| 329 if not self.initialized then | 336 if not self.initialized then |
| 330 self:Setup() | 337 self:Setup() |
| 331 end | 338 end |
| 332 elseif self.initialized and self.events[event] then | 339 elseif self.initialized and self.events[event] then |
| 506 function MissionsHandler:OnComplete() | 513 function MissionsHandler:OnComplete() |
| 507 print('flagging complete', self.name) | 514 print('flagging complete', self.name) |
| 508 self:Refresh() | 515 self:Refresh() |
| 509 end | 516 end |
| 510 | 517 |
| 511 function MissionsHandler:OnUpdate() | 518 function MissionsHandler:OnUpdate(sinceLast) |
| 512 if self.isComplete then | 519 if self.isComplete then |
| 513 return | 520 return |
| 514 end | 521 end |
| 522 self.throttle = (self.throttle or .5) + sinceLast | |
| 523 if self.throttle >= .5 then | |
| 524 self.throttle = self.throttle - .5 | |
| 525 else | |
| 526 return | |
| 527 end | |
| 528 | |
| 515 | 529 |
| 516 if self.missionEndTime then | 530 if self.missionEndTime then |
| 517 local timeLeft = self.missionEndTime - time() | 531 local timeLeft = self.missionEndTime - time() |
| 518 if timeLeft < 0 then | 532 if timeLeft < 0 then |
| 519 self:OnComplete() | 533 self:OnComplete() |
| 523 if timeLeft > 3600 then | 537 if timeLeft > 3600 then |
| 524 self.TimeLeft:SetTextColor(1,1,1) | 538 self.TimeLeft:SetTextColor(1,1,1) |
| 525 else | 539 else |
| 526 self.TimeLeft:SetTextColor(1,1,0) | 540 self.TimeLeft:SetTextColor(1,1,0) |
| 527 end | 541 end |
| 528 | 542 end |
| 529 end | 543 |
| 544 if not self.isComplete then | |
| 545 local progress = (self.missionEndTime - time()) / self.durationSeconds | |
| 546 local w = self.ProgressBG:GetWidth() | |
| 547 if progress >= 1 then | |
| 548 self.ProgressBar:SetWidth(w) | |
| 549 else | |
| 550 self.ProgressBar:SetWidth(w - (progress * w)) | |
| 551 end | |
| 552 | |
| 553 self.ProgressBG:Show() | |
| 554 self.ProgressBar:Show() | |
| 555 else | |
| 556 self.ProgressBG:Hide() | |
| 557 self.ProgressBar:Hide() | |
| 558 end | |
| 559 | |
| 530 else | 560 else |
| 531 self.TimeLeft:SetText(self.missionEndTime) | 561 self.TimeLeft:SetText(self.missionEndTime) |
| 532 end | 562 end |
| 533 end | 563 end |
| 534 | 564 |
| 549 self.Icon:SetTexture(self.rewards[1].icon or GetItemIcon(self.rewards[1].itemID)) | 579 self.Icon:SetTexture(self.rewards[1].icon or GetItemIcon(self.rewards[1].itemID)) |
| 550 self.rewardInfo = self.rewards[1] | 580 self.rewardInfo = self.rewards[1] |
| 551 else | 581 else |
| 552 self.Icon:SetAtlas(self.typeAtlas, false) | 582 self.Icon:SetAtlas(self.typeAtlas, false) |
| 553 end | 583 end |
| 584 | |
| 585 | |
| 554 end | 586 end |
| 555 | 587 |
| 556 | 588 |
| 557 function MissionsHandler:OnEnter() | 589 function MissionsHandler:OnEnter() |
| 558 if self.rewardInfo and self.rewardInfo.itemID then | 590 if self.rewardInfo and self.rewardInfo.itemID then |
| 600 self.Count:SetText(self.shipmentsReady) | 632 self.Count:SetText(self.shipmentsReady) |
| 601 self.Done:SetShown(self.shipmentsReady and (self.shipmentsReady >= 1)) | 633 self.Done:SetShown(self.shipmentsReady and (self.shipmentsReady >= 1)) |
| 602 | 634 |
| 603 | 635 |
| 604 -- flag as complete | 636 -- flag as complete |
| 605 if ( self.shipmentsReady == self.shipmentsTotal ) and (not self.isBeingResearched) then | 637 if ( self.shipmentsReady >= self.shipmentsTotal ) and (not self.isBeingResearched) then |
| 606 self.Swipe:SetCooldownUNIX(0, 0); | 638 self.Swipe:SetCooldownUNIX(0, 0); |
| 607 self.Done:Show(); | 639 self.Done:Show(); |
| 608 self.isComplete = true | 640 self.isComplete = true |
| 609 else | 641 else |
| 610 self.Swipe:SetCooldownUNIX(self.creationTime or 0 , self.duration or 0); | 642 self.Swipe:SetCooldownUNIX(self.creationTime or 0 , self.duration or 0); |
| 614 self.Background:SetAlpha(hasPickups and 1 or 0.1) | 646 self.Background:SetAlpha(hasPickups and 1 or 0.1) |
| 615 end | 647 end |
| 616 local time = time | 648 local time = time |
| 617 function ShipmentsHandler:OnUpdate() | 649 function ShipmentsHandler:OnUpdate() |
| 618 | 650 |
| 619 if (self.shipmentsReady and self.shipmentsTotal) and (self.shipmentsReady ~= self.shipmentsTotal) then | 651 if (self.shipmentsReady and self.shipmentsTotal) and (self.shipmentsReady < self.shipmentsTotal) then |
| 620 local timeLeft = self.creationTime + self.duration - time() | 652 local timeLeft = self.creationTime + self.duration - time() |
| 621 self.TimeLeft:SetText('Next: '.. GetTimeLeftString(timeLeft) .. ' |cFFFFFF00'..self.shipmentsTotal..' orders|r') | 653 if self.shipmentsReady >= 1 then |
| 622 elseif self.isStale then | 654 self.TimeLeft:SetText(GetTimeLeftString(timeLeft)) |
| 623 self.TimeLeft:SetText('|cFFFF0000Needs refresh|r') | 655 self.TimeLeft:SetTextColor(0,1,0) |
| 656 else | |
| 657 self.TimeLeft:SetText(GetTimeLeftString(timeLeft)) | |
| 658 self.TimeLeft:SetTextColor(1,1,1) | |
| 659 end | |
| 660 if (timeLeft < 0) then | |
| 661 if self.shipmentsReady < self.shipmentsTotal then | |
| 662 self.shipmentsReady = self.shipmentsReady + 1 | |
| 663 self.creationTime = self.creationTime + self.duration | |
| 664 -- text will be set on next update | |
| 665 end | |
| 666 end | |
| 667 | |
| 624 elseif self.isBeingResearched then | 668 elseif self.isBeingResearched then |
| 625 self.TimeLeft:SetText(GetTimeLeftString(self.researchStartTime + self.researchDuration - time())) | 669 self.TimeLeft:SetText(GetTimeLeftString(self.researchStartTime + self.researchDuration - time())) |
| 670 self.TimeLeft:SetTextColor(1,1,0) | |
| 626 else | 671 else |
| 627 self.TimeLeft:SetText('Complete!') | 672 self.TimeLeft:SetText('Complete!') |
| 673 self.TimeLeft:SetTextColor(0,1,0) | |
| 628 end | 674 end |
| 629 | 675 |
| 630 end | 676 end |
| 631 | 677 |
| 632 function ShipmentsHandler:OnEnter() | 678 function ShipmentsHandler:OnEnter() |
