From 3e7d82746cb8ada361b00e01de3184bb650351fd Mon Sep 17 00:00:00 2001 From: Alar of Daggerspine Date: Sat, 14 Feb 2015 00:58:25 +0100 Subject: [PATCH] Reimplemented mission cache to use less memory Signed-off-by: Alar of Daggerspine --- MissionCache.lua | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/MissionCache.lua b/MissionCache.lua index e69de29..b771bb2 100644 --- a/MissionCache.lua +++ b/MissionCache.lua @@ -0,0 +1,105 @@ +local me,ns=... +local addon=ns.addon --#addon +local holdEvents,releaseEvents=addon.holdEvents,addon.releaseEvents +local xprint=ns.xprint +local xdump=ns.xdump +--upvalue +local G=C_Garrison +local GMF=GarrisonMissionFrame +local GMFMissions=GarrisonMissionFrameMissions +local type=type +local select=select +local pairs=pairs +local tonumber=tonumber +local tinser=tinsert +local GARRISON_CURRENCY=GARRISON_CURRENCY +local Mbase = GMF.MissionTab.MissionList +-- self=Mbase +-- C_Garrison.GetInProgressMissions(self.inProgressMissions); +-- C_Garrison.GetAvailableMissions(self.availableMissions); +local missionIndex={} +local AddExtraData +local function keyToIndex(key) + local idx=missionIndex[key] + if (idx and idx <= #Mbase.availableMissions) then + if Mbase.availableMissions[idx].missionID==key then + return idx + else + idx=nil + end + end + wipe(missionIndex) + for i=1,#Mbase.availableMissions do + missionIndex[Mbase.availableMissions[i].missionID]=i + if Mbase.availableMissions[i].missionID==key then + return i + end + end +end +function addon:GetMissionData(missionID,key) + local idx=keyToIndex(missionID) + xprint("Mission",missionID," is ",idx,"of",#Mbase.availableMissions) + local mission=Mbase.availableMissions[idx] + if (key==nil) then + return mission + end + if (type(mission[key])~='nil') then + return mission[key] + end + if (key=='rank') then + mission.rank=mission.level < 100 and mission.level or mission.iLevel + return mission.rank + elseif(key=='basePerc') then + mission.basePerc=select(4,G.GetPartyMissionInfo(missionID)) + return mission.basePerc + else + AddExtraData(mission) + return mission[key] + end +end +function AddExtraData(mission) + local _ + _,mission.xp,mission.type,mission.typeDesc,mission.typeIcon,mission.locPrefix,_,mission.enemies=G.GetMissionInfo(mission.missionID) + mission.rank=mission.level < 100 and mission.level or mission.iLevel + mission.xpBonus=0 + mission.resources=0 + mission.gold=0 + mission.followerUpgrade=0 + mission.itemLevel=0 + for k,v in pairs(mission.rewards) do + if (v.followerXP) then mission.xpBonus=mission.xpBonus+v.followerXP end + if (v.currencyID and v.currencyID==GARRISON_CURRENCY) then mission.resources=v.quantity end + if (v.currencyID and v.currencyID==0) then mission.gold =mission.gold+v.quantity/10000 end + if (v.itemID) then + if (v.itemID~=120205) then + local itemName, itemLink, itemRarity, itemLevel, itemMinLevel, itemType, itemSubType, itemStackCount,itemEquipLoc, itemTexture, itemSellPrice = GetItemInfo(v.itemID) + if (itemName) then + if (itemLevel > 1 ) then + mission.itemLevel=itemLevel + else + mission.followerUpgrade=itemRarity + end + end + end + end + end + mission.totalXp=(tonumber(mission.xp) or 0) + (tonumber(mission.xpBonus) or 0) + mission.globalXp=mission.totalXp*mission.numFollowers + if (mission.resources==0 and mission.gold==0 and mission.itemLevel==0 and mission.followerUpgrade==0) then + mission.xpOnly=true + else + mission.xpOnly=false + end + mission.slots={} + local slots=mission.slots + + for i=1,#mission.enemies do + local mechanics=mission.enemies[i].mechanics + for i,mechanic in pairs(mechanics) do + tinsert(slots,mechanic) + end + end + if (type) then + tinsert(slots,{name=TYPE,key=mission.type,icon=mission.typeIcon}) + end +end -- 1.7.9.5