Quantcast

* *2.6.7*

Alar of Daggerspine [07-16-15 - 17:51]
* *2.6.7*

Feature: Shipyard mission autofill!! See the success chance in map and
have your fleet automagically setup
Fix: Consolidate broker colours for buttons, Now, red, always means ypu
need to check it

Signed-off-by: Alar of Daggerspine <alar@aspide.it>
Filename
CHANGELOG.txt
FollowerCache.lua
GarrisonCommander-Broker/ldb.lua
GarrisonCommander.lua
MatchMaker.lua
PartyCache.lua
ShipYard.lua
diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index 83d9e2e..c332268 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -1,5 +1,9 @@
 *GarrisonCommander helps you when choosing the right follower for the right mission*

+* *2.6.7*
+Feature: Shipyard mission autofill!! See the success chance in map and have your fleet automagically setup
+Fix: Consolidate broker colours for buttons, Now, red, always means ypu need to check it
+
 * *2.6.6*
 Feature: Quick mission completion enabled for shipyard
 Feature: In Ship missions mission expire time added
diff --git a/FollowerCache.lua b/FollowerCache.lua
index 980bf3b..6aec808 100644
--- a/FollowerCache.lua
+++ b/FollowerCache.lua
@@ -22,6 +22,7 @@ local LE_FOLLOWER_TYPE_SHIPYARD_6_2=_G.LE_FOLLOWER_TYPE_SHIPYARD_6_2
 local maxrank=GARRISON_FOLLOWER_MAX_UPGRADE_QUALITY*1000+GARRISON_FOLLOWER_MAX_LEVEL
 local module=addon:NewSubClass('FollowerCache')
 local cache={} --#cache
+local followerTypes={}
 local EMPTY={}
 function module:OnInitialized()
 	self:RegisterEvent("GARRISON_FOLLOWER_REMOVED","OnEvent")
@@ -74,6 +75,7 @@ function cache:Refresh()
 	if next(self.cache) then return end
 	self:Wipe()
 	for _,follower in pairs(G.GetFollowers(self.type)) do
+		followerTypes[follower.followerID]=follower.followerTypeID
 		if follower.isCollected then
 			self:AddExtraData(follower)
 			self:AddAbilities(follower)
@@ -205,10 +207,13 @@ end

 -- Addon level proxies
 function addon:GetAnyData(followerType,...)
-	if followerType== LE_FOLLOWER_TYPE_GARRISON_6_0 then
-		return self:GetFollowerData(...)
-	else
+	if followerType==0 then
+		followerType=self:GetFollowerType(...)
+	end
+	if followerType== LE_FOLLOWER_TYPE_SHIPYARD_6_2 then
 		return self:GetShipData(...)
+	else
+		return self:GetFollowerData(...)
 	end
 end
 function addon:GetFollowerData(followerID,key,default)
@@ -229,6 +234,16 @@ end
 function addon:GetShipsIterator(func)
 	return module.shipCache:GetFollowersIterator(func)
 end
+function addon:GetAnyIterator(followerType,func)
+	if followerType==LE_FOLLOWER_TYPE_GARRISON_6_0 then
+		return self:GetFollowersIterator(func)
+	else
+		return self:GetShipsIterator(func)
+	end
+end
+function addon:GetFollowerType(followerID)
+	return followerTypes[followerID] or 0
+end

 --[=[
 local function keyToIndex(key)
diff --git a/GarrisonCommander-Broker/ldb.lua b/GarrisonCommander-Broker/ldb.lua
index 08004fb..d33a0cd 100644
--- a/GarrisonCommander-Broker/ldb.lua
+++ b/GarrisonCommander-Broker/ldb.lua
@@ -214,7 +214,7 @@ function addon:CountCaches()
 	local now=time()
 	local expired=400*600 -- 1 risorsa ogni 10 minuti, per fullare servono 500 * 600 secondi
 	for p,j in pairs(self.db.realm.caches) do
-		local expired=(addon.db.realm.cachesize[p] or 500)*0.9 /600
+		local expired=(addon.db.realm.cachesize[p] or 500)*0.9 *600
 		if j>0 then
 			tot=tot+1
 			if j+expired < now then
@@ -227,11 +227,11 @@ end
 function addon:CountEmpty()
 	local tot=0
 	local missing=0
-	local expire=time()+3600*24
+	local expire=time()+3600*12
 	for p,j in pairs(self.db.realm.orders) do
-		for s,_ in pairs(j) do
+		for s,w in pairs(j) do
 			tot=tot+1
-			if not j[s] or j[s] < expire then missing=missing+1 end
+			if not w or w < expire then missing=missing+1 end
 		end
 	end
 	return missing,tot
@@ -447,7 +447,7 @@ cacheobj=LibStub:GetLibrary("LibDataBroker-1.1"):NewDataObject("GC-Cache", {
 function farmobj:Update()
 	local n,t=addon:CountMissing()
 	if (t>0) then
-		local c=addon:ColorToString(addon:Gradient((t-n)/t))
+		local c=addon:ColorToString(addon:Gradient(n/t))
 		farmobj.text=format("|cff%s%d|r/|cff%s%d|r",c,t-n,C.Green.c,t)
 	else
 		farmobj.text=NONE
@@ -456,7 +456,7 @@ end
 function cacheobj:Update()
 	local n,t=addon:CountCaches()
 	if (t>0) then
-		local c=addon:ColorToString(addon:Gradient((t-n)/t))
+		local c=addon:ColorToString(addon:Gradient(n/t))
 		cacheobj.text=format("|cff%s%d|r/|cff%s%d|r",c,t-n,C.Green.c,t)
 	else
 		cacheobj.text=NONE
@@ -542,7 +542,7 @@ end
 function workobj:Update()
 	local n,t=addon:CountEmpty()
 	if (t>0) then
-		local c=addon:ColorToString(addon:Gradient((t-n)/t))
+		local c=addon:ColorToString(addon:Gradient((n)/t))
 		workobj.text=format("|cff%s%d|r/|cff%s%d|r",c,t-n,C.Green.c,t)
 	else
 		workobj.text=NONE
@@ -551,17 +551,26 @@ function workobj:Update()
 end
 function workobj:OnTooltipShow()
 	self:AddLine(CAPACITANCE_WORK_ORDERS)
+	local now=time()
+	local normal=24*3600
+	local short=12*3600
+	local long=48*3600
 	for k,v in kpairs(addon.db.realm.orders) do
 		if (k==ns.me) then
 			self:AddLine(k,C.Green())
 		else
 			self:AddLine(k,C.Orange())
 		end
+
 		for s,d in kpairs(v) do
-			local delta=d-time()
+			local delta=d-now
 			if (delta >0) then
-				local hours=delta/(3600*48)
-				self:AddDoubleLine(s,SecondsToTime(delta),nil,nil,nil,addon:Gradient(hours))
+				local gradient=1
+				if delta > long then gradient=0
+				elseif delta > normal then  gradient=0.25
+				elseif delta >short then gradient=0.5
+				end
+				self:AddDoubleLine(s,SecondsToTime(delta),nil,nil,nil,addon:Gradient(gradient))
 			else
 				self:AddDoubleLine(s,EMPTY,nil,nil,nil,C:Red())
 			end
diff --git a/GarrisonCommander.lua b/GarrisonCommander.lua
index 161667b..c4d0de6 100644
--- a/GarrisonCommander.lua
+++ b/GarrisonCommander.lua
@@ -905,7 +905,6 @@ end
 function addon:EventGARRISON_MISSION_COMPLETE_RESPONSE(event,missionID,completed,rewards)
 	dbcache.history[missionID][time()]={result=100,success=rewards}
 	dbcache.seen[missionID]=nil
-	dbcache.seen[missionID]=nil
 end
 -----------------------------------------------------
 -- Coroutines data and clock management
@@ -1929,6 +1928,9 @@ end
 local GARRISON_MISSION_AVAILABILITY1=GARRISON_MISSION_AVAILABILITY..'\n %s'
 local GARRISON_MISSION_AVAILABILITY2=GARRISON_MISSION_ENVIRONMENT:sub(1,10)..GARRISON_MISSION_AVAILABILITY..':|r %s'
 local GARRISON_MISSION_ID=GARRISON_MISSION_ENVIRONMENT:sub(1,10)..'MissionID:|r |cffffffff%s|r'
+local fakeinfo={followerID=false}
+local fakeframe={}
+
 function addon:FillMissionPage(missionInfo)
 	if type(missionInfo)=="number" then missionInfo=self:GetMissionData(missionInfo) end
 	if not missionInfo then return end
@@ -1953,41 +1955,36 @@ if not stage.missionid then
 --@end-debug@
 	if( IsControlKeyDown()) then self:Print("Shift key, ignoring mission prefill") return end
 	if (self:GetBoolean("NOFILL")) then return end
-	if missionType==LE_FOLLOWER_TYPE_SHIPYARD_6_2 then
-		print("SHip Mission",missionInfo)
-		return
-	end
 	local missionID=missionInfo.missionID
 --@debug@
 	print("UpdateMissionPage for",missionID,missionInfo.name,missionInfo.numFollowers)
 --@end-debug@
 	holdEvents()
-	if ns.toc < 60200 then
-		GarrisonMissionPage_ClearParty()
-	else
-		GMF:ClearParty()
-	end
+	local main=missionInfo.followerTypeID==LE_FOLLOWER_TYPE_GARRISON_6_0 and GMF or GSF
+	local missionpage=main.MissionTab.MissionPage
+
+	main:ClearParty()
 	local party=self:GetParty(missionID)
 	if (party) then
 		local members=party.members
 		for i=1,missionInfo.numFollowers do
+			local followerframe=missionpage.Followers[i]
 			local followerID=members[i]
 			if (followerID) then
-					local rc,error=pcall(GarrisonMissionPage_AddFollower,followerID)
-					if (not rc) then
-						print("fillmissinopage",error)
-					end
+				main:AssignFollowerToMission(followerframe,self:GetAnyData(missionInfo.followerTypeID,followerID))
+				--	local rc,error=pcall(GarrisonMissionPage_AddFollower,followerID)
+				--	if (not rc) then
+				--		print("fillmissinopage",error)
+				--	end
 			end
 		end
-	end
-	if ns.toc < 60200 then
-		GarrisonMissionPage_UpdateParty()
 	else
-		GMF:UpdateMissionParty(GMF.MissionTab.MissionPage.Followers)
-		GMF:UpdateMissionData(GMF.MissionTab.MissionPage)
-		--self:Dump(GMF.MissionTab.MissionPage.Followers,"Selected followers")
-		--GarrisonMissionPage_UpdateEmptyString()
+		print("No martini no party")
 	end
+	main:UpdateMissionParty(main.MissionTab.MissionPage.Followers)
+	main:UpdateMissionData(main.MissionTab.MissionPage)
+	--self:Dump(GMF.MissionTab.MissionPage.Followers,"Selected followers")
+	--GarrisonMissionPage_UpdateEmptyString()
 	releaseEvents()
 end
 local firstcall=true
diff --git a/MatchMaker.lua b/MatchMaker.lua
index e07d7bc..af43b9f 100644
--- a/MatchMaker.lua
+++ b/MatchMaker.lua
@@ -156,9 +156,9 @@ local function AddMoreFollowers(self,mission,scores,justdo)
 		end
 	end
 end
-local function MatchMaker(self,missionID,party,includeBusy,onlyBest)
-	local mission=self:GetMissionData(missionID)
-	local class=self:GetMissionData(missionID,'class')
+local function MatchMaker(self,mission,party,includeBusy,onlyBest)
+	local class=mission.class
+	local missionID=mission.missionID
 	local filterOut=filters[class] or filters.other
 	filters.skipMaxed=self:GetBoolean("IGP")
 	if (includeBusy==nil) then
@@ -185,7 +185,7 @@ local function MatchMaker(self,missionID,party,includeBusy,onlyBest)
 	end
 	--]]
 	local minchance=floor(currentCap/mission.numFollowers)-mission.numFollowers*mission.numFollowers
-	for _,followerID in self:GetFollowersIterator() do
+	for _,followerID in self:GetAnyIterator(mission.followerTypeID) do
 		if self:IsFollowerAvailableForMission(followerID,filters.skipBusy) then
 			if P:AddFollower(followerID) then
 				local score,chance=self:FollowerScore(mission,followerID)
@@ -209,7 +209,7 @@ local function MatchMaker(self,missionID,party,includeBusy,onlyBest)
 			scroller:addRow("Cap Res Cha Xp T Vra Ran")
 			for i=1,#scores do
 				local score,followerID=strsplit('@',scores[i])
-				local t=score .. " " .. addon:GetFollowerData(followerID,'fullname') .. " " .. tostring(G.GetFollowerStatus(followerID))
+				local t=score .. " " .. addon:GetAnyData(mission.followerTypeID,followerID,'fullname') .. " " .. tostring(G.GetFollowerStatus(followerID))
 				scroller:addRow(t)
 			end
 		else
@@ -268,10 +268,13 @@ local function MatchMaker(self,missionID,party,includeBusy,onlyBest)
 	--del(buffed)
 end
 function addon:MCMatchMaker(missionID,party,skipEpic,cap)
+	local mission=type(missionID)=="table" and missionID or self:GetMissionData(missionID)
+	missionID=mission.missionID
+	if (not party) then party=addon:GetParty(missionID) end
 	useCap=true
 	currentCap=cap
 	print("Using cap data:",useCap,currentCap)
-	MatchMaker(self,missionID,party,false)
+	MatchMaker(self,mission,party,false)
 	if (skipEpic) then
 		if (self:GetMissionData(missionID,'class')=='xp') then
 			for i=1,#party.members do
@@ -283,18 +286,24 @@ function addon:MCMatchMaker(missionID,party,skipEpic,cap)
 			wipe(party.members)
 		end
 	end
+	return party.perc
 end
 function addon:MatchMaker(missionID,party,includeBusy)
-	if (not party) then party=self:GetParty(missionID) end
+	local mission=type(missionID)=="table" and missionID or self:GetMissionData(missionID)
+	missionID=mission.missionID
+	if (not party) then party=addon:GetParty(missionID) end
 	useCap=self:GetBoolean("MAXRES")
 	currentCap= self:GetNumber("MAXRESCHANCE")
-	MatchMaker(self,missionID,party,includeBusy)
+	MatchMaker(self,mission,party,includeBusy)
+	return party.perc
 end
 function addon:TestMission(missionID,includeBusy)
+	local mission=type(missionID)=="table" and missionID or self:GetMissionData(missionID)
+	missionID=mission.missionID
 	dbg=true
 	local party=new()
 	party.members=new()
-	self:MatchMaker(missionID,party,includeBusy)
+	self:MatchMaker(mission,party,includeBusy)
 --@debug@
 	DevTools_Dump(party)
 --@end-debug@
@@ -304,10 +313,12 @@ function addon:TestMission(missionID,includeBusy)
 	dbg=false
 end
 function addon:MCTestMission(missionID,includeBusy,chance)
+	local mission=type(missionID)=="table" and missionID or self:GetMissionData(missionID)
+	missionID=mission.missionID
 	dbg=true
 	local party=new()
 	party.members=new()
-	self:MCMatchMaker(missionID,party,includeBusy,true,chance)
+	self:MCMatchMaker(mission,party,includeBusy,true,chance)
 --@debug@
 	DevTools_Dump(party)
 --@end-debug@
diff --git a/PartyCache.lua b/PartyCache.lua
index 43e724b..059ff44 100644
--- a/PartyCache.lua
+++ b/PartyCache.lua
@@ -112,12 +112,6 @@ function party:AddFollower(followerID)
 		if (rc and code) then
 			tinsert(members,followerID)
 			return true
---@debug@
-		else
-			print("Unable to add",followerID, G.GetFollowerName(followerID),"to",ID,code,self:IsIn(followerID),G.GetFollowerStatus(followerID))
-			print(members[1],members[2],members[3])
-			print(debugstack(1,6,0))
---@end-debug@
 		end
 	end
 end
@@ -141,7 +135,18 @@ function party:StoreFollowers(table)
 	return #table
 end
 local function fsort(a,b)
-	return addon:GetFollowerData(a,"rank")>addon:GetFollowerData(b,"rank")
+	--return addon:GetFollowerData(a,"rank")>addon:GetFollowerData(b,"rank")
+	local rank1=addon:GetAnyData(0,a,"rank")
+	local rank2=addon:GetAnyData(0,b,"rank")
+	if tonumber(rank1) and tonumber(rank2) then
+		return rank1 < rank2
+	else
+		print(a,rank1)
+		print(b,rank2)
+		print(G.GetFollowerName(a))
+		print(G.GetFollowerName(b))
+		return 0
+	end
 end
 function party:Close(desttable)
 	local perc
@@ -201,8 +206,10 @@ function addon:GetParty(missionID,key,default)
 		--Running Mission, taking followers from mission data
 		local followers=self:GetMissionData(missionID,'followers')
 		addPartyMissionInfo(party,missionID)
-		for i=1,#followers do
-			party.members[i]=followers[i]
+		if followers then
+			for i=1,#followers do
+				party.members[i]=followers[i]
+			end
 		end
 	end
 	if key then
diff --git a/ShipYard.lua b/ShipYard.lua
index 0af1581..6f52f6a 100644
--- a/ShipYard.lua
+++ b/ShipYard.lua
@@ -34,6 +34,7 @@ function module:OnInitialize()
 	print("ShipYard Loaded")
 	self:SafeSecureHook("GarrisonShipyardMapMission_SetTooltip")
 	self:SafeSecureHook("GarrisonShipyardMap_UpdateMissions")
+	self:SafeSecureHook("GarrisonShipyardMap_SetupBonus")
 	self:SafeHookScript(GSF,"OnShow","Setup",true)
 	self:SafeHookScript(GSF.MissionTab.MissionList.CompleteDialog,"OnShow",function(... ) sprint("CompleteDialog",...) end,true)
 	self:SafeHookScript(GSF.MissionTab,"OnShow",function(... ) sprint("MissionTab",...) end,true)
@@ -42,9 +43,40 @@ function module:OnInitialize()
 	--GarrisonShipyardMapMission1
 --@end-debug@
 end
+---
+--Invoked on every mission display, only for available missions
+--
+local i=0
+function module:HookedGarrisonShipyardMap_SetupBonus(missionList,frame,mission)
+	if not GSF:IsShown() then return end
+	print(frame:GetWidth(),mission)
+	addon:AddExtraData(mission)
+	local perc=addon:MatchMaker(mission)
+	local addendum=frame.GcAddendum
+	if not addendum then
+		if mission.inProgress then return end
+		i=i+1
+		addendum=CreateFrame("Frame",nil,frame)
+		addendum:SetPoint("TOPLEFT",frame,"TOPLEFT",64,-10)
+		addendum:SetWidth(100)
+		addendum:SetHeight(70)
+		addendum.chance=addendum:CreateFontString(nil,"OVERLAY","GameFontHighlightMedium")
+		addendum.chance:SetPoint("TOPLEFT")
+		addendum.expire=addendum:CreateFontString(nil,"OVERLAY","GameFontHighlightSmall")
+		addendum.expire:SetPoint("TOPLEFT",addendum.chance,"BOTTOMLEFT")
+		--addendum.duration=addendum:CreateFontString(nil,"OVERLAY","GameFontHighlightSmall")
+		--addendum.duration:SetPoint("TOPLEFT",addendum.expire,"BOTTOMLEFT")
+		frame.GcAddendum=addendum
+	end
+	if mission.inProgress then addendum:Hide() return end
+	addendum:Show()
+	addendum.chance:SetFormattedText("%d%%",perc)
+	addendum.chance:SetTextColor(self:GetDifficultyColors(perc))
+	addendum.expire:SetText(mission.class)
+	--addendum.duration:SetText(mission.duration)
+end
 function module:HookedGarrisonShipyardMap_UpdateMissions()
 	local self = GarrisonShipyardFrame.MissionTab.MissionList
-	print("Could manage",#self.missions)
 end
 function module:HookedGSF_OnClickMission(this,missionInfo)
 	self:FillMissionPage(missionInfo)
@@ -66,6 +98,7 @@ function module:HookedGarrisonFollowerButton_UpdateCounters(gsf,frame,follower,s
 --@end-debug@
 end

+
 function module:Setup(this,...)
 	print("Doing one time initialization for",this:GetName(),...)
 	self:SafeHookScript(GSF,"OnShow","OnShow",true)
@@ -92,7 +125,7 @@ end
 function module:OpenLastTab()
 print("Should restore tab")
 end
---[[
+--[[ Follower
 displayHeight = 0.25
 followerTypeID = 2
 iLevel = 600
@@ -115,4 +148,37 @@ displayID = 63894
 scale = 110
 levelXP = 40000
 --]]
+--[[ Mission
+followerTypeID = 2
+description = Hellscream has posted a sub near the Horde's main base on Ashran. Take that sub out. Alliance, that means you, too. Factional hatreds have no place here.
+cost = 150
+adjustedPosX = 798
+duration = 8 hr
+adjustedPosY = -246
+durationSeconds = 28800
+state = -2
+inProgress=false
+typePrefix = ShipMissionIcon-Treasure
+typeAtlas = ShipMissionIcon-Treasure-Mission
+offerTimeRemaining = 19 days 1 hr
+level = 100
+offeredGarrMissionTextureID = 0
+offerEndTime = 1681052.25
+mapPosY = -246
+type = Ship-Treasure
+name = Warspear Fishing
+iLevel = 0
+numRewards = 1
+rewards = [table: 000000004D079210]
+hasBonusEffect = false
+numFollowers = 2
+costCurrencyTypesID = 1101
+followers = [table: 000000004D0791C0]
+missionID = 563
+canStart = false
+location = [ph]
+isRare = false
+mapPosX = 798
+locPrefix = GarrMissionLocation-TannanSea
+--]]
 --view mission button GSF.MissionTab.MissionList.CompleteDialog.BorderFrame.ViewButton
\ No newline at end of file