Quantcast

Improvementes in mission completion reporting

Alar of Daggerspine [03-23-15 - 16:34]
Improvementes in mission completion reporting

Signed-off-by: Alar of Daggerspine <alar@aspide.it>
Filename
MissionCache.lua
MissionCompletion.lua
Widgets.lua
diff --git a/MissionCache.lua b/MissionCache.lua
index fdb6a21..5ae6093 100644
--- a/MissionCache.lua
+++ b/MissionCache.lua
@@ -53,7 +53,10 @@ function addon:GetMissionData(missionID,key,default)
 		end
 	end
 	if not mission then
-		mission=ns.CompletedMissions[missionID]
+		mission=self:GetModule("MissionCompletion"):GetMission(missionID)
+		if mission then
+			mission.improvedDurationSeconds=mission.isMissionTimeImproved and mission.improvedDurationSeconds/2 or mission.improvedDurationSeconds
+		end
 	end
 	if (key==nil) then
 		return mission
diff --git a/MissionCompletion.lua b/MissionCompletion.lua
index 387dec5..e16195d 100644
--- a/MissionCompletion.lua
+++ b/MissionCompletion.lua
@@ -14,7 +14,6 @@ local GMF=GarrisonMissionFrame
 local GMFMissions=GarrisonMissionFrameMissions
 local G=C_Garrison
 local GARRISON_CURRENCY=GARRISON_CURRENCY
-ns.missionautocompleting=false
 local pairs=pairs
 local format=format
 local strsplit=strsplit
@@ -25,12 +24,11 @@ local module=addon:NewSubClass('MissionCompletion') --#Module
 function module:GenerateMissionCompleteList(title)
 	local w=AceGUI:Create("GCMCList")
 	w:SetTitle(title)
-	w:SetCallback("OnClose", function(self) self:Release() ns.missionautocompleting=nil end)
+	w:SetCallback("OnClose",function() w:Release() return module:MissionsCleanup() end)
 	return w
 end
 local missions={}
 local states={}
-local currentMission
 local rewards={
 	items={},
 	followerBase={},
@@ -56,6 +54,7 @@ local function startTimer(delay,event,...)
 	--@end-alpha@
 end
 function module:MissionsCleanup()
+	self:Events(false)
 	stopTimer()
 	GMF.MissionTab.MissionList.CompleteDialog:Hide()
 	GMF.MissionComplete:Hide()
@@ -65,24 +64,26 @@ function module:MissionsCleanup()
 	GarrisonMissionList_UpdateMissions()
 	-- Re-enable "view" button
 	GMFMissions.CompleteDialog.BorderFrame.ViewButton:SetEnabled(true)
-	ns.missionautocompleting=nil
 	GarrisonMissionFrame_SelectTab(1)
 	GarrisonMissionFrame_CheckCompleteMissions()
 end
-function module:OnInitialized(start)
-	self:RegisterEvent("GARRISON_MISSION_BONUS_ROLL_LOOT","MissionAutoComplete")
-	self:RegisterEvent("GARRISON_MISSION_BONUS_ROLL_COMPLETE","MissionAutoComplete")
-	self:RegisterEvent("GARRISON_MISSION_COMPLETE_RESPONSE","MissionAutoComplete")
-	self:RegisterEvent("GARRISON_FOLLOWER_XP_CHANGED","MissionAutoComplete")
+function module:Events(on)
+	if (on) then
+		self:RegisterEvent("GARRISON_MISSION_BONUS_ROLL_LOOT","MissionAutoComplete")
+		self:RegisterEvent("GARRISON_MISSION_BONUS_ROLL_COMPLETE","MissionAutoComplete")
+		self:RegisterEvent("GARRISON_MISSION_COMPLETE_RESPONSE","MissionAutoComplete")
+		self:RegisterEvent("GARRISON_FOLLOWER_XP_CHANGED","MissionAutoComplete")
+	else
+		self:UnregisterAllEvents()
+	end
 end
 function module:CloseReport()
-	if report then pcall(report.Close,report) end
+	if report then pcall(report.Close,report) report=nil end
 end
 function module:MissionComplete(this,button)
 	GMFMissions.CompleteDialog.BorderFrame.ViewButton:SetEnabled(false) -- Disabling standard Blizzard Completion
 	missions=G.GetCompleteMissions()
 	if (missions and #missions > 0) then
-		ns.missionautocompleting=true
 		report=self:GenerateMissionCompleteList("Missions' results")
 		--report:SetPoint("TOPLEFT",GMFMissions.CompleteDialog.BorderFrame)
 		--report:SetPoint("BOTTOMRIGHT",GMFMissions.CompleteDialog.BorderFrame)
@@ -90,7 +91,6 @@ function module:MissionComplete(this,button)
 		report:SetPoint("TOP",GMF)
 		report:SetPoint("BOTTOM",GMF)
 		report:SetWidth(500)
-		report:SetCallback("OnClose",function() return module:MissionsCleanup() end)
 		wipe(rewards.followerBase)
 		wipe(rewards.followerXP)
 		wipe(rewards.currencies)
@@ -103,14 +103,28 @@ function module:MissionComplete(this,button)
 				if v.itemID then GetItemInfo(v.itemID) end -- tickling server
 			end
 			local m=missions[i]
+--totalTimeString, totalTimeSeconds, isMissionTimeImproved, successChance, partyBuffs, isEnvMechanicCountered, xpBonus, materialMultiplier, goldMultiplier = C_Garrison.GetPartyMissionInfo(MISSION_PAGE_FRAME.missionInfo.missionID);
+
 			local _
-			_,_,_,m.successChance,_,_,m.xpBonus,m.resourceMultiplier,m.goldMultiplier=G.GetPartyMissionInfo(m.missionID)
+			_,_,m.isMissionTimeImproved,m.successChance,_,_,m.xpBonus,m.resourceMultiplier,m.goldMultiplier=G.GetPartyMissionInfo(m.missionID)
 		end
-		currentMission=tremove(missions)
-		ns.CompletedMissions[currentMission.missionID]=currentMission
+		self:Dump("Completed missions",missions)
+		report:SetUserData('missions',missions)
+		report:SetUserData('current',1)
+		self:Events(true)
 		self:MissionAutoComplete("INIT")
 	end
 end
+function module:GetMission(missionID)
+	local missions=report:GetUserData('missions')
+	if missions then
+		for i=1,#missions do
+			if missions[i].missionID==missionID then
+				return missions[i]
+			end
+		end
+	end
+end
 function module:MissionAutoComplete(event,ID,arg1,arg2,arg3,arg4)
 -- C_Garrison.MarkMissionComplete Mark mission as complete and prepare it for bonus roll, da chiamare solo in caso di successo
 -- C_Garrison.MissionBonusRoll
@@ -120,11 +134,9 @@ function module:MissionAutoComplete(event,ID,arg1,arg2,arg3,arg4)
 	if event=="LOOT" then
 		return self:MissionsPrintResults()
 	end
-
-	if (event =="LOOP" or event=="INIT") then
-		ID=currentMission and currentMission.missionID or "none"
-		arg1=currentMission and currentMission.state or "none"
-	end
+	local current=report:GetUserData('current')
+	local currentMission=report:GetUserData('missions')[current]
+	local missionID=currentMission and currentMission.missionID or 0
 	-- GARRISON_FOLLOWER_XP_CHANGED: followerID, xpGained, actualXp, newLevel, quality
 	if (event=="GARRISON_FOLLOWER_XP_CHANGED") then
 		if (arg1 > 0) then
@@ -134,8 +146,8 @@ function module:MissionAutoComplete(event,ID,arg1,arg2,arg3,arg4)
 		return
 	-- GARRISON_MISSION_BONUS_ROLL_LOOT: itemID
 	elseif (event=="GARRISON_MISSION_BONUS_ROLL_LOOT") then
-		if (currentMission) then
-			rewards.items[format("%d:%s",currentMission.missionID,ID)]=1
+		if (missionID) then
+			rewards.items[format("%d:%s",missionID,ID)]=1
 		else
 			rewards.items[format("%d:%s",0,ID)]=1
 		end
@@ -170,7 +182,7 @@ function module:MissionAutoComplete(event,ID,arg1,arg2,arg3,arg4)
 				currentMission.state=0
 				currentMission.goldMultiplier=currentMission.goldMultiplier or 1
 				currentMission.xp=select(2,G.GetMissionInfo(currentMission.missionID))
-				report:AddMissionButton(currentMission)
+				report:AddMissionButton(currentMission,currentMission.successChance)
 			end
 			if (step==0) then
 				--@alpha@
@@ -185,12 +197,10 @@ function module:MissionAutoComplete(event,ID,arg1,arg2,arg3,arg4)
 				G.MissionBonusRoll(currentMission.missionID)
 				startTimer(2)
 			elseif (step>=2) then
-				self:GetMissionResults(step==3)
+				self:GetMissionResults(step==3,currentMission)
 				self:RefreshFollowerStatus()
-				currentMission=tremove(missions)
-				if currentMission then
-					ns.CompletedMissions[currentMission.missionID]=currentMission
-				end
+				local current=report:GetUserData('current')
+				report:SetUserData('current',current+1)
 				startTimer()
 				return
 			end
@@ -201,7 +211,7 @@ function module:MissionAutoComplete(event,ID,arg1,arg2,arg3,arg4)
 		end
 	end
 end
-function module:GetMissionResults(success)
+function module:GetMissionResults(success,currentMission)
 	stopTimer()
 	if (success) then
 		report:AddMissionResult(currentMission.missionID,true)
@@ -225,7 +235,6 @@ function module:GetMissionResults(success)
 					rewards.currencies[v.currencyID].qt=rewards.currencies[v.currencyID].qt+v.quantity
 				end
 			elseif v.itemID then
-				GetItemInfo(v.itemID) -- Triggering the cache
 				rewards.items[format("%d:%s",currentMission.missionID,v.itemID)]=1
 			end
 		end
diff --git a/Widgets.lua b/Widgets.lua
index e0b1135..77151c8 100644
--- a/Widgets.lua
+++ b/Widgets.lua
@@ -50,16 +50,18 @@ local function GMCList()
 		b:SetCallback("OnClick",action)
 		obj:AddChild(b)
 	end
-	function m:AddMissionButton(mission)
-		local obj=self.scroll
-		local b=AceGUI:Create("GMCSlimMissionButton")
-		b:SetMission(mission,addon:GetParty(mission.missionID))
-		b:SetScale(0.7)
-		b:SetFullWidth(true)
-		self.missions[mission.missionID]=b
-		obj:AddChild(b)
-		b.frame.Spinner:Show()
-		b.frame.Spinner.Anim:Play()
+	function m:AddMissionButton(mission,perc)
+		if not self.missions[mission.missionID] then
+			local obj=self.scroll
+			local b=AceGUI:Create("GMCSlimMissionButton")
+			b:SetMission(mission,perc)
+			b:SetScale(0.7)
+			b:SetFullWidth(true)
+			self.missions[mission.missionID]=b
+			obj:AddChild(b)
+			b.frame.Spinner:Show()
+			b.frame.Spinner.Anim:Play()
+		end

 	end
 	function m:AddMissionResult(missionID,success)
@@ -329,11 +331,11 @@ local function GMCMissionButton()
 		function m:SetScale(s)
 			return self.frame:SetScale(s)
 		end
-		function m:SetMission(mission,party)
+		function m:SetMission(mission,perc)
 			self.frame.info=mission
 			self.frame.fromFollowerPage=true
 			self.frame:EnableMouse(true)
-			self.frame.party=party
+			self.frame.party=addon:GetParty(mission.missionID)
 			if self.type==Type1 then
 				addon:DrawSingleButton(false,self.frame,false,false)
 				self.frame:SetScript("OnEnter",GarrisonMissionButton_OnEnter)
@@ -344,8 +346,8 @@ local function GMCMissionButton()
 				self.frame:SetScript("OnLeave",nil)
 			end
 			if self.type==Type2 then
-				self.frame.Percent:SetFormattedText("%d%%",party.perc)
-				self.frame.Percent:SetTextColor(addon:GetDifficultyColors(party.perc))
+				self.frame.Percent:SetFormattedText("%d%%",perc)
+				self.frame.Percent:SetTextColor(addon:GetDifficultyColors(perc))
 				_G.AX=self.frame
 			end
 		end