From a91b528cde30882d719c9f889580a58f80148da8 Mon Sep 17 00:00:00 2001 From: Alar of Daggerspine Date: Thu, 16 Jul 2015 19:51:16 +0200 Subject: [PATCH] * *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 --- CHANGELOG.txt | 4 +++ FollowerCache.lua | 21 ++++++++++-- GarrisonCommander-Broker/ldb.lua | 29 ++++++++++------ GarrisonCommander.lua | 39 ++++++++++----------- MatchMaker.lua | 31 +++++++++++------ PartyCache.lua | 25 +++++++++----- ShipYard.lua | 70 ++++++++++++++++++++++++++++++++++++-- 7 files changed, 164 insertions(+), 55 deletions(-) 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 -- 1.7.9.5