diff ClassPlanShipments.lua @ 40:589c444d4837

WowAce/Curseforge migration push
author Nenue
date Sun, 25 Dec 2016 13:04:57 -0500
parents 26dfa661daa7
children b29b35cb8539
line wrap: on
line diff
--- a/ClassPlanShipments.lua	Fri Nov 04 02:54:32 2016 -0400
+++ b/ClassPlanShipments.lua	Sun Dec 25 13:04:57 2016 -0500
@@ -0,0 +1,329 @@
+local _, db = ...
+
+local wipe, tinsert, ipairs, select = table.wipe, table.insert, ipairs, select
+local UnitClass = UnitClass
+local time, max, min = time, max, min
+local print = DEVIAN_WORKSPACE and function(...) print('ClassPlan', ...) end or nop
+
+
+local CG_GetBuildings = C_Garrison.GetBuildings
+local CG_GetFollowerShipments = C_Garrison.GetFollowerShipments
+local CG_GetLooseShipments = C_Garrison.GetLooseShipments
+local CG_GetTalentTrees = C_Garrison.GetTalentTrees
+local CG_GetCompleteTalent = C_Garrison.GetCompleteTalent
+local CG_GetLandingPageShipmentInfo = C_Garrison.GetLandingPageShipmentInfo
+local CG_GetLandingPageShipmentInfoByContainerID = C_Garrison.GetLandingPageShipmentInfoByContainerID
+
+local AK_NOTES, RECRUIT_MAJOR, RECRUIT_MINOR, OH_TALENT, NOMI = 2, 4, 8, 16, 32
+
+local FollowerTypes = {
+  ['Pathfinders'] = true,
+  ['Acolytes'] = true,
+}
+local ShipmentOrder = {
+  [AK_NOTES] = 2,
+  [RECRUIT_MAJOR] = 3,
+  [RECRUIT_MINOR] = 4,
+  [NOMI] = 5,
+  [OH_TALENT] = 6,
+}
+local SortKey = 'shipmentType'
+local SortTable = ShipmentOrder
+
+local ShipmentList = {
+  templateName = 'ClassPlanShipmentEntry',
+  listKey = {'shipments'},
+  listTitle = {'Work Orders'},
+  events = {
+    'GARRISON_MISSION_LIST_UPDATE',
+    'GARRISON_LANDINGPAGE_SHIPMENTS',
+    'GARRISON_TALENT_UPDATE',
+    "GARRISON_TALENT_COMPLETE",
+    "GARRISON_SHIPMENT_RECEIVED",
+    'GARRISON_FOLLOWER_LIST_UPDATE',
+    'SHIPMENT_CRAFTER_INFO',
+    'ITEM_PUSH'},
+}
+
+local ShipmentEntry = {}
+
+function ShipmentList:Reanchor()
+  print('|cFF00FFFF'..self:GetName()..':Reanchor|r')
+  self:SetPoint('TOPLEFT', ClassOrderPlan.BackgroundInset, 'TOPLEFT')
+  self:SetPoint('BOTTOMRIGHT', -ClassOrderPlan.BackgroundInset:GetWidth()/2, 0)
+end
+
+do
+  local ShipmentsInfo = {}
+  local AddShipmentInfo = function(shipmentType, name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString, itemName, itemIcon, itemQuality, itemID, followerID)
+    -- early login queries may return empty tables, causing the sorter to compare nil
+    if not creationTime then
+      return
+    end
+    --print(shipmentType, name, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString)
+    tinsert(ShipmentsInfo,
+      {
+        shipmentType = shipmentType,
+        name = name,
+        icon = texture,
+        shipmentCapacity = shipmentCapacity,
+        shipmentsReady = shipmentsReady,
+        shipmentsTotal = shipmentsTotal,
+        creationTime = creationTime,
+        duration = duration,
+        timeleftString = timeleftString,
+        itemName = itemName,
+        itemIcon = itemIcon,
+        itemQuality = itemQuality,
+        itemID = itemID,
+        followerID = followerID,
+      })
+    print('  ', name, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration)
+  end
+  function ShipmentList:GetPlayerData ()
+    local profileList = self:GetParent().profile.shipments
+    wipe(ShipmentsInfo)
+
+    local garrisonType = LE_GARRISON_TYPE_7_0
+    local buildings = CG_GetBuildings(garrisonType);
+    local shipmentIndex = 0
+    --print('Buildings:')
+    for i = 1, #buildings do
+      local name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString, itemName, itemIcon, itemQuality, itemID = CG_GetLandingPageShipmentInfo(i);
+      AddShipmentInfo(RECRUIT_MAJOR, name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString, itemName, itemIcon, itemQuality, itemID)
+    end
+
+    --print('Follower:')
+    local followerShipments = CG_GetFollowerShipments(garrisonType);
+    for i = 1, #followerShipments do
+      local name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString, _, _, _, _, followerID = CG_GetLandingPageShipmentInfoByContainerID(followerShipments[i]);
+      AddShipmentInfo(RECRUIT_MINOR, name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString, nil, nil, nil, nil, followerID)
+    end
+
+    --print('Loose:')
+    local looseShipments = CG_GetLooseShipments(garrisonType)
+    for i = 1, #looseShipments do
+      local name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString = CG_GetLandingPageShipmentInfoByContainerID(looseShipments[i]);
+      AddShipmentInfo(AK_NOTES, name, texture, shipmentCapacity, shipmentsReady, shipmentsTotal, creationTime, duration, timeleftString)
+    end
+
+    local talentTrees = CG_GetTalentTrees(garrisonType, select(3, UnitClass("player")));
+    -- this is a talent that has completed, but has not been seen in the talent UI yet.
+    local completeTalentID = CG_GetCompleteTalent(garrisonType);
+    --print('Talents:')
+    if (talentTrees) then
+      for treeIndex, tree in ipairs(talentTrees) do
+        for talentIndex, talent in ipairs(tree) do
+          local showTalent = false;
+          if (talent.isBeingResearched) or (talent.id == completeTalentID) then
+            AddShipmentInfo(OH_TALENT, talent.name, talent.icon, 1, (talent.isBeingResearched and 0 or 1), 1, talent.researchStartTime, talent.researchDuration, talent.timeleftString)
+          end
+        end
+      end
+    end
+
+    wipe(profileList)
+    for index, data in ipairs(ShipmentsInfo) do
+      --DEFAULT_CHAT_FRAME:AddMessage(data.shipmentType ..' '.. tostring(data.name) ..' '.. tostring(data.creationTime) ..' '.. tostring(data.duration))
+      tinsert(profileList, data)
+    end
+    self.isStale = true
+    return true
+  end
+end
+-- Update shipment flags data
+local SetActualShipmentTime = function(self)
+
+  if self.isComplete then
+    return nil, nil
+  end
+
+  local timestamp = time()
+  local timeLeft = self.creationTime + self.duration - timestamp
+  local duration = self.duration * (self.fullDuration and (self.shipmentsTotal - self.shipmentsReady) or 1)
+  local justFinished = false
+  while (self.shipmentsReady < self.shipmentsTotal) and (timeLeft <= 0) do
+    if not self.originalReady then
+      self.originalReady = self.shipmentsReady
+      self.originalCreationTime = self.creationTime
+    end
+
+    self.shipmentsReady = self.shipmentsReady + 1
+    self.creationTime = self.creationTime + self.duration
+    timeLeft = timeLeft + self.duration
+    print('|cFF00FF88  pre-parse "'..self.name..'"|r', 'timeLeft:', timeLeft, 'shipments:', self.shipmentsReady, self.shipmentsTotal)
+  end
+
+  if (timeLeft <= 0) and (not self.isBeingResearched) then
+    self.isComplete = true
+    self.isStale = true
+  end
+
+  local expires = (self.originalCreationTime or self.creationTime) + duration
+  return expires, duration
+end
+
+function ShipmentList:OnEvent(event, ...)
+  if (event == 'SHIPMENT_CRAFTER_INFO' or event == 'ITEM_PUSH' or event == 'GARRISON_FOLLOWER_LIST_UPDATE') then
+    C_Garrison.RequestLandingPageShipmentInfo()
+  elseif event == 'SHIPMENT_UPDATE' then
+    local shipmentStarted = ...
+    if shipmentStarted then
+      C_Garrison.RequestLandingPageShipmentInfo()
+    end
+  elseif event == 'GARRISON_LANDINGPAGE_SHIPMENTS' then
+    --WorldPlan:print("New shipments data received.")
+    self:RefreshData()
+  else
+    ClassPlanHandlerBase.OnEvent(self, event, ...)
+  end
+end
+
+
+function ShipmentList:OnGetItem (data)
+  if data.shipmentsTotal then
+    local expires = SetActualShipmentTime(data)
+    if expires and (expires > time()) then
+      self:ScheduleUpdate(expires)
+    end
+  end
+
+  if data.shipmentType == 255 or type(data.shipmentType == 'string') then
+    if data.name == 'Artifact Research Notes' then
+      data.shipmentType = AK_NOTES
+    elseif string.match(data.name, 'Recipes') then
+      data.shipmentType = NOMI
+    elseif FollowerTypes[data.name] then
+      data.shipmentType = RECRUIT_MINOR
+    else
+      data.shipmentType = OH_TALENT
+    end
+  end
+
+
+end
+
+function ShipmentList:OnHeaderClick()
+  -- flip sort table and key, push a sort and refresh
+end
+
+
+ShipmentList.SortHandler = function(a, b)
+  if a[SortKey]  then
+    if b[SortKey] then
+      return SortTable[a[SortKey]] < SortTable[b[SortKey]]
+    else
+      return true
+    end
+  else
+    if b.isComplete ~= a.isComplete then
+      return a.isComplete and true or false
+    else
+      if a.profileKey ~= b.profileKey then
+        return a.profileKey < b.profileKey
+      else
+        if a.shipmentsReady and b.shipmentsReady then
+          return (a.shipmentsReady) > (b.shipmentsReady)
+        elseif a.shipmentsReady or b.shipmentsReady then
+          return (a.shipmentsReady) or true or false
+        else
+
+          if (a.creationTime ~= b.creationTime) then
+            return (a.creationTime) < (b.creationTime)
+          else
+            return (a.name) < (b.name)
+          end
+        end
+
+      end
+    end
+  end
+end
+
+function ShipmentList:OnLoad()
+end
+function  ShipmentList:OnShow()
+  print('|cFF00FF88'..self:GetName()..':OnShow()|r')
+end
+
+function ShipmentEntry:OnLoad()
+  ClassPlanMissionEntryMixin.OnLoad(self)
+end
+
+
+function ShipmentEntry:Update()
+  --print('  |cFF00FF88"'.. self.name..'":Update()|r')
+  self.Icon:SetTexture(self.icon)
+  self.Count:SetText(self.shipmentsReady ..'/'.. self.shipmentsTotal)
+
+  -- flag as complete
+  local itemType = db.ClassPlanTypes.inProgress
+  if ( self.shipmentsReady >= self.shipmentsTotal ) and (not self.isBeingResearched) then
+    self.Swipe:SetCooldownUNIX(0, 0);
+    itemType = db.ClassPlanTypes.complete
+  else
+    if (self.shipmentsReady >= 1) and (self.shipmentsReady < self.shipmentsTotal) then
+      itemType = db.ClassPlanTypes.shipmentsReady
+    end
+    self.Swipe:SetCooldownUNIX(self.creationTime or 0 , self.duration or 0);
+  end
+  self.Background:SetColorTexture(unpack(itemType.backgroundColor))
+
+  SetActualShipmentTime(self)
+  self.throttle = 2
+end
+
+
+
+function ShipmentEntry:OnUpdate(sinceLast)
+  self.throttle = (self.throttle or 1) + sinceLast
+  if self.throttle >= 1 then
+    self.throttle = self.throttle - 1
+  else
+    return
+  end
+
+  if (self.shipmentsReady and self.shipmentsTotal) and (self.shipmentsReady < self.shipmentsTotal) then
+    local expires, duration = SetActualShipmentTime(self)
+    if self.isComplete then
+      self.TimeLeft:SetText('Complete!')
+      self.TimeLeft:SetTextColor(0,1,1)
+    elseif self.shipmentsReady >= 1 then
+      self:SetTimeLeft(expires, duration)
+      self.TimeLeft:SetTextColor(1,1,0)
+    else
+      self:SetTimeLeft(expires, duration)
+      self.TimeLeft:SetTextColor(1,1,1)
+    end
+  elseif self.isBeingResearched then
+    self:SetTimeLeft(self.researchStartTime + self.researchDuration - time(), self.researchDuration)
+    self.TimeLeft:SetTextColor(1,1,1)
+  else
+    self.TimeLeft:SetText('Complete!')
+    self.TimeLeft:SetTextColor(0,1,0)
+  end
+end
+
+function ShipmentEntry:OnEnter()
+  if ( self.shipmentsReady and self.shipmentsTotal ) then
+    GameTooltip:SetOwner(self, 'ANCHOR_LEFT')
+    GameTooltip:AddLine(self.Owner:GetText(), self.Owner:GetTextColor())
+    GameTooltip:AddLine(self.shipmentsReady .. ' of '.. self.shipmentsTotal)
+    GameTooltip:Show()
+  end
+end
+
+
+function ShipmentEntry:OnLeave()
+  if GameTooltip:IsOwned(self) then
+    GameTooltip:Hide()
+  end
+end
+
+function ShipmentEntry:OnClick(button)
+  self.fullDuration = not self.fullDuration
+  self:Update()
+end
+
+ClassPlanShipmentHandler = CreateFromMixins(ClassPlanHandlerBase, ShipmentList)
+ClassPlanShipmentEntryMixin = CreateFromMixins(ClassPlanEntryBase, ShipmentEntry)
\ No newline at end of file