From 656e0e1682909a8e445cca80fd56802d4c27fe95 Mon Sep 17 00:00:00 2001 From: Alar of Daggerspine Date: Wed, 22 Jul 2015 02:33:28 +0200 Subject: [PATCH] New batch of bugfixes Signed-off-by: Alar of Daggerspine --- CHANGELOG.txt | 6 + GarrisonCommander.lua | 475 +++++++++++++++++++------------------------------ GarrisonCommander.xml | 8 +- Init.lua | 6 +- MissionCache.lua | 149 ++++------------ MissionCompletion.lua | 3 + MissionControl.lua | 8 +- ShipYard.lua | 45 +++-- Widgets.lua | 3 + 9 files changed, 265 insertions(+), 438 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 20de16e..b543cb1 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,5 +1,11 @@ *GarrisonCommander helps you when choosing the right follower for the right mission* +* *2.6.9* +Fix: Restored GarrisonMissionManager compatibility, sorry guys +Feature: Shipyard map enhanced with success chance. Chance is show as a number, and the border around it says if you have oil enough (green good, red not enough) +Feature: Enhanced Shipyard map tooltip + + * *2.6.8* Fix: Works even if some naval mission onclick is hijacked diff --git a/GarrisonCommander.lua b/GarrisonCommander.lua index d6e3887..2072705 100644 --- a/GarrisonCommander.lua +++ b/GarrisonCommander.lua @@ -12,6 +12,9 @@ local wipe=wipe local format=format local tostring=tostring local collectgarbage=collectgarbage +--@debug@ +local collectgarbage=function() end +--@end-debug@ local GMM=false local MP=false local MPGoodGuy=false @@ -99,20 +102,19 @@ local MISSING=ADDON_MISSING local NOT_COLLECTED=NOT_COLLECTED -- not collected local GMF=GMF local GSF=GSF -local GMFFollowerPage=GMF.FollowerTab -local GMFFollowers=GarrisonMissionFrameFollowers -local GMFMissionPage=GMF.MissionTab.MissionPage -local GMFMissionPageFollowers = GMFMissionPage.Followers -local GMFMissions=GarrisonMissionFrameMissions -local GMFRewardPage=GMF.MissionComplete -local GMFRewardSplash=GMFMissions.CompleteDialog -local GMFMissionsListScrollFrameScrollChild=GarrisonMissionFrameMissionsListScrollFrameScrollChild -local GMFMissionsListScrollFrame=GarrisonMissionFrameMissionsListScrollFrame -local GMFFollowersListScrollFrameScrollChild=GarrisonMissionFrameFollowersListScrollFrameScrollChild -local GMFFollowersListScrollFrame=GarrisonMissionFrameFollowersListScrollFrame -local GMFMissionListButtons=GMF.MissionTab.MissionList.listScroll.buttons -local GarrisonFollowerTooltip=GarrisonFollowerTooltip -local GarrisonMissionFrameMissionsListScrollFrame=GarrisonMissionFrameMissionsListScrollFrame +-- Frames shortcut +local GMFRewardPage= GMF.MissionComplete +local GMFMissions= GMF.MissionTab.MissionList +local GMFRewardSplash= GMF.MissionTab.MissionList.CompleteDialog +local GMFMissionsListScrollFrame= GMF.MissionTab.MissionList.listScroll +local GMFMissionListButtons= GMF.MissionTab.MissionList.listScroll.buttons +local GMFMissionsListScrollFrameScrollChild= GMF.MissionTab.MissionList.listScroll.scrollChild +local GMFFollowers= GMF.FollowerTab.followerList +local GMFMissionFrameFollowers= GMF.FollowerTab.followerList +local GMFFollowersListScrollFrame= GMF.FollowerTab.followerList.listScroll +local GMFFollowersListScrollFrameScrollChild= GMF.FollowerTab.followerList.listScroll.scrollChild +local GMFMissionPage= GMF.MissionTab.MissionPage +--dictionary local IGNORE_UNAIVALABLE_FOLLOWERS=IGNORE.. ' ' .. UNAVAILABLE local IGNORE_UNAIVALABLE_FOLLOWERS_DETAIL= GARRISON_FOLLOWER_ON_MISSION ..',' .. GARRISON_FOLLOWER_WORKING .. ' ' .. GARRISON_FOLLOWERS .. '. ' .. GARRISON_FOLLOWER_INACTIVE .. " are always ignored" local PARTY=PARTY -- "Party" @@ -129,7 +131,6 @@ local MAXMISSIONS=8 local MINPERC=20 local BUSY_MESSAGE_FORMAT=L["Only first %1$d missions with over %2$d%% chance of success are shown"] local BUSY_MESSAGE=format(BUSY_MESSAGE_FORMAT,MAXMISSIONS,MINPERC) --- to be rmoved in 60200 local LE_FOLLOWER_TYPE_GARRISON_6_0=_G.LE_FOLLOWER_TYPE_GARRISON_6_0 local LE_FOLLOWER_TYPE_SHIPYARD_6_2=_G.LE_FOLLOWER_TYPE_SHIPYARD_6_2 @@ -205,8 +206,7 @@ local t2={ local followersCache={} local followersCacheIndex={} local dirty=false -local cache -local dbcache +local chardb local db local n=setmetatable({},{ __index = function(t,k) @@ -358,33 +358,41 @@ function addon.Garrison_SortMissions_Class(missionsList) table.sort(missionsList, sorters.Class); end function addon:ApplyMSORT(value) - if (not origGarrison_SortMissions) then - origGarrison_SortMissions=Garrison_SortMissions - end local func=self[value] if (type(func)=="function") then Garrison_SortMissions=self[value] else - --@debug@ -print("Could not found ",value," in addon") + print("Could not found ",value," in addon") --@end-debug@ - Garrison_SortMissions=origGarrison_SortMissions end self:RefreshMissions() end function addon:OnInitialized() - for _,b in ipairs(GMFMissionsListScrollFrame.buttons) do +--@debug@ +print("Initialize") +--@end-debug@ + self:SafeRegisterEvent("GARRISON_MISSION_COMPLETE_RESPONSE") + self:SafeRegisterEvent("GARRISON_MISSION_NPC_CLOSED") + self:SafeRegisterEvent("GARRISON_MISSION_NPC_OPENED") + self:SafeRegisterEvent("GARRISON_MISSION_STARTED") + for _,b in ipairs(GMF.MissionTab.MissionList.listScroll.buttons) do local scale=0.8 local f,h,s=b.Title:GetFont() b.Title:SetFont(f,h*scale,s) local f,h,s=b.Summary:GetFont() b.Summary:SetFont(f,h*scale,s) + addon:SafeRawHookScript(b,"OnEnter","ScriptGarrisonMissionButton_OnEnter") + addon:SafeSecureHookScript(b,"OnClick","ScriptGarrisonMissionButton_OnClick") end self:CreatePrivateDb() db=self.db.global - self:SafeHookScript("GarrisonMissionFrame","OnShow","SetUp",true) + db.seen=nil -- Removed in 2.6.9 + db.abilities=nil -- Removed in 2.6.9 + db.lifespan=nil -- Removed in 2.6.9 + db.traits=nil -- Removed in 2.6.9 + dbGAC.namespaces.missionscache=nil -- Removed in 2.6.9 self:AddLabel("Appearance") self:AddToggle("MOVEPANEL",true,L["Unlock Panel"],L["Makes main mission panel movable"]) self:AddToggle("BIGSCREEN",true,L["Use big screen"],L["Disabling this will give you the interface from 1.1.8, given or taken. Need to reload interface"]) @@ -435,7 +443,7 @@ function addon:OnInitialized() assert("stringa"==nil or true) assert(pcall(format,"%03d %03d",tonumber(1/0) or 1,tonumber(0/0) or 2)) --@end-debug@ - + --self:SafeSecureHookScript("GarrisonMissionFrame","OnShow","Setup") return true end function addon:showdata(fullargs,action,missionid) @@ -483,7 +491,6 @@ function addon:ApplyMAXRES(value) self:RefreshMissions() end function addon:ApplyCKMP(value) - if (HD) then self:Clock() end if (MasterPlanMissionList) then if (value) then MasterPlanMissionList:Hide() @@ -504,7 +511,7 @@ function addon:ApplyTRC(value) end function addon:ApplyBIGSCREEN(value) if (value) then - wipe(dbcache.ignored) -- we no longer have an interface to change this settings + wipe(chardb.ignored) -- we no longer have an interface to change this settings end self:Popup(L["Must reload interface to apply"],0, function(this) @@ -526,8 +533,8 @@ function addon:ApplyMINPERC(value) end function addon:IsIgnored(followerID,missionID) - if (dbcache.ignored[missionID][followerID]) then return true end - if (dbcache.totallyignored[followerID]) then return true end + if (chardb.ignored[missionID][followerID]) then return true end + if (chardb.totallyignored[followerID]) then return true end end function addon:GetAllCounters(missionID,threat,table) wipe(table) @@ -662,7 +669,7 @@ function addon:AddFollowersToTooltip(missionID,followerTypeID) local perc=party.perc local q=self:GetDifficultyColor(perc) GameTooltip:AddDoubleLine(GARRISON_MISSION_SUCCESS,format(GARRISON_MISSION_PERCENT_CHANCE,perc),nil,nil,nil,q.r,q.g,q.b) - for _,i in pairs (dbcache.ignored[missionID]) do + for _,i in pairs (chardb.ignored[missionID]) do GameTooltip:AddLine(L["You have ignored followers"],C.Orange()) break; end @@ -681,9 +688,9 @@ function addon:AddFollowersToTooltip(missionID,followerTypeID) GameTooltip:AddLine(L["Mission time reduced!"],C.Green()) end - if (dbcache.history[missionID]) then + if (chardb.history[missionID]) then local tot,success=0,0 - for d,r in pairs(dbcache.history[missionID]) do + for d,r in pairs(chardb.history[missionID]) do tot,success=tot+1,success + (r.success and 1 or 0) end if (tot > 0) then @@ -742,7 +749,6 @@ end function addon:SetDbDefaults(default) default.global=default.global or {} default.global["*"]={} - default.global.lifespan={["*"]=0} end function addon:CreatePrivateDb() self.privatedb=self:RegisterDatabase( @@ -796,20 +802,8 @@ function addon:CreatePrivateDb() } }, true) - self.private=self:RegisterDatabase( - "GACPrivateVolatile", - { - profile={ - missions={} - } - } - , - true) - dbcache=self.privatedb.profile - cache=self.private.profile - dbcache.seen=nil -- Removed in 2.6.9 - cache.running=nil - cache.runningIndex=nil + chardb=self.privatedb.profile + end function addon:SetClean() dirty=false @@ -823,7 +817,6 @@ function addon:HasSalvageYard() end function addon:WipeMission(missionID) - cache.missions[missionID]=nil counters[missionID]=nil parties[missionID]=nil --collectgarbage("step") @@ -832,11 +825,22 @@ end --- --@param #string event GARRISON_MISSION_NPC_OPENED -- Fires after GarrisonMissionFrame OnShow. Pretty useless - +local firstone=true function addon:EventGARRISON_MISSION_NPC_OPENED(event,...) - if (GCF) then GCF:Show() end +--@debug@ +print("NPC OPENED") +--@end-debug@ if (GCF) then GCF:Show() end + if firstone then + firstone=nil + self:Setup() + else + self:ScriptGarrisonMissionFrame_OnShow() + end end function addon:EventGARRISON_MISSION_NPC_CLOSED(event,...) +--@debug@ +print("NPC CLOSED") +--@end-debug@ if (GCF) then self:RemoveMenu() GCF:Hide() @@ -856,7 +860,7 @@ function addon:EventGARRISON_MISSION_STARTED(event,missionID,...) -- Shipyard return end - wipe(dbcache.ignored[missionID]) + wipe(chardb.ignored[missionID]) local party=self:GetParty(missionID) wipe(party.members) -- I remove preset party, so PartyCache will refill it with the ones from the actual mission end @@ -881,7 +885,7 @@ end --GARRISON_MISSION_BONUS_ROLL_LOOY missionID nil -- function addon:EventGARRISON_MISSION_COMPLETE_RESPONSE(event,missionID,completed,rewards) - dbcache.history[missionID][time()]={result=100,success=rewards} + chardb.history[missionID][time()]={result=100,success=rewards} end ----------------------------------------------------- -- Coroutines data and clock management @@ -894,53 +898,6 @@ local coroutines={ paused=false }, } - -local MPShown=nil --- Keeping it as a nice example of coroutine management.. but not using it anymore -function addon:Clock() - if (GMFMissions.showInProgress) then - --collectgarbage("collect") --while I fix it.... - else - --collectgarbage("step",100) - end - dbcache.lastseen=time() - if (not MP or MPGoodGuy) then return end - MPShown=not self:GetBoolean("CKMP") - local children={GMFMissions:GetChildren()} - for i=1,#children do - local child=children[i] - if (child:GetObjectType()=="ScrollFrame") then - if (child:GetName() ~= "GarrisonMissionFrameMissionsListScrollFrame") then - if (MPShown) then child:Show() else child:Hide() end - end - if (child:GetName() == "GarrisonMissionFrameMissionsListScrollFrame") then - if (MPShown) then child:Hide() else child:Show() end - end - end - end - if (MPShown) then - GarrisonMissionFrameMissionsListScrollFrame:Hide() - else - GarrisonMissionFrameMissionsListScrollFrame:Show() - GarrisonMissionFrameMissionsListScrollFrame:SetParent(GMFMissions) - end ---@debug@ - for k,d in pairs(coroutines) do - local co=coroutines[k] - if (not co.func) then - co.func=self["Generate"..k.."Periodic"](self) - if (type(co.func) ~="function") then - co.func=function() end - end - end - co.elapsed=co.elapsed+1 - if not co.paused and co.elapsed > co.interval then - co.elapsed=0 - co.paused=co.func(self) - end - end ---@end-debug@ -end function addon:ActivateButton(button,OnClick,Tooltiptext,persistent) button:SetScript("OnClick",function(...) self[OnClick](self,...) end ) if (Tooltiptext) then @@ -1242,20 +1199,6 @@ function addon:Options() GCF:SetScript("OnDragStart",function(frame)if (self:GetBoolean("MOVEPANEL")) then frame:StartMoving() end end) GCF:SetScript("OnDragStop",function(frame) frame:StopMovingOrSizing() end) if (ns.bigscreen) then - --MinimizeButton - -- It's not working well, now I dont have time to fix it - if (false) then - local h=CreateFrame("Button",nil,base,"UIPanelCloseButton") - h:SetFrameLevel(999) - h:SetNormalTexture("Interface\\BUTTONS\\UI-Panel-CollapseButton-Up") - h:SetPushedTexture("Interface\\BUTTONS\\UI-Panel-CollapseButton-Down") - h:SetHeight(32) - h:SetWidth(32) - h.Toggle=GMF - h:SetPoint("TOPRIGHT") - self:ActivateButton(h,"Shrink",L["Click to toggle Garrison Mission Frame"]) - GCF.gcHIDE=h - end -- Mission list on follower panels local ml=CreateFrame("Frame","GCFMissions",GMFFollowers,"GarrisonCommanderFollowerMissionList") ml:SetPoint("TOPLEFT",GMFFollowers,"TOPRIGHT") @@ -1294,58 +1237,36 @@ function addon:IsRewardPage() end function addon:IsMissionPage() - return GMF:IsShown() and GMFMissionPage:IsShown() and GMFFollowers:IsShown() + return GMF:IsShown() and GMFMissionPage:IsShown() end --- function addon:HookedGarrisonFollowerTooltipTemplate_SetGarrisonFollower(...) - local h=GarrisonFollowerTooltip:GetHeight() - local ft=GarrisonFollowerTooltip.ft - if (not ft) then - local backdrop = { - bgFile="Interface\\TutorialFrame\\TutorialFrameBackground", - edgeFile="Interface\\Tooltips\\UI-Tooltip-Border", - tile=true, - tileSize=16, - edgeSize=16, - insets={bottom=3,left=3,right=3,top=3} - } - ft=CreateFrame("Frame",nil,GarrisonFollowerTooltip) - ft:SetBackdrop(backdrop) - ft:SetBackdropColor(1,1,1,1) - local fs=ft:CreateFontString(nil, "BACKGROUND", "GameFontNormal") - GarrisonFollowerTooltip.ft=ft - fs:SetWidth(0) - fs:SetHeight(0) - fs:SetText(L["Left Click to see available missions"].."\n"..L["Right click to open ignore menu"]) - fs:SetTextColor(C.Green()) - ft:SetPoint("TOPLEFT",GarrisonFollowerTooltip,"BOTTOMLEFT",5,5) - ft:SetPoint("TOPRIGHT",GarrisonFollowerTooltip,"BOTTOMRIGHT",-5,5) - ft:SetHeight(45) - fs:SetAllPoints() - end - if (self:IsMissionPage()) then - ft:Hide() - else - ft:Show() + if not self:IsMissionPage() then + local g=GameTooltip + g:SetOwner(GarrisonFollowerTooltip, "ANCHOR_NONE") + g:SetPoint("TOPLEFT",GarrisonFollowerTooltip,"BOTTOMLEFT") + g:AddLine(L["Left Click to see available missions"],C.Green()) + g:AddLine(L["Left Click to see available missions"],C.Green()) + g:SetWidth(GarrisonFollowerTooltip:GetWidth()) + g:Show() end end function addon:HookedGarrisonFollowerButton_UpdateCounters(...) - if ns.toc < 60200 then - return self:RenderFollowerPageFollowerButton(...) - else - return self:RenderFollowerPageFollowerButton(select(2,...)) - end + return self:RenderFollowerPageFollowerButton(select(2,...)) end function addon:RenderFollowerPageFollowerButton(frame,follower,showCounters) - --self:Trace(frame:GetName()) - if not frame.GCIt then - frame.GCIt=frame:CreateFontString(nil,"ARTWORK","GameFontHighlightSmall") - frame.GCIt:SetPoint("BOTTOMLEFT",frame.Name,"TOPLEFT",0,2) + + if not frame.GCWep then + frame.GCWep=frame:CreateFontString(nil,"ARTWORK","GameFontHighlightSmall") + frame.GCWep:SetPoint("BOTTOMLEFT",frame.Name,"TOPLEFT",0,2) + frame.GCArm=frame:CreateFontString(nil,"ARTWORK","GameFontHighlightSmall") + frame.GCArm:SetPoint("TOPLEFT",frame.GCWep,"TOPRIGHT") frame.GCXp=frame:CreateFontString(nil,"ARTWORK","GameFontHighlightSmall") end if not frame.isCollected then frame.GCXp:Hide() - frame.GCIt:Hide() + frame.GCWep:Hide() + frame.GCArm:Hide() return end if self:GetToggle("IXP") then @@ -1358,18 +1279,26 @@ function addon:RenderFollowerPageFollowerButton(frame,follower,showCounters) end if self:GetToggle("ILV") then if (follower.level >= GARRISON_FOLLOWER_MAX_LEVEL) then - local c1=ITEM_QUALITY_COLORS[follower.weaponQuality or 1] - local c2=ITEM_QUALITY_COLORS[follower.armorQuality or 1] - frame.GCIt:SetFormattedText("W:%s%3d|r A:%s%3d|r",c1.hex,self:GetFollowerData(follower.followerID,"weaponItemLevel",600),c2.hex,self:GetFollowerData(follower.followerID,"armorItemLevel",600)) - frame.GCIt:Show() - frame.GCXp:SetPoint("LEFT",frame.GCIt,"RIGHT",2,0) + local c1=ITEM_QUALITY_COLORS[self:GetFollowerData(follower.followerID,"weaponQuality" ,1)] + local c2=ITEM_QUALITY_COLORS[self:GetFollowerData(follower.followerID,"armorQuality" ,1)] + frame.GCWep:SetFormattedText("W:%3d",self:GetFollowerData(follower.followerID,"weaponItemLevel",600)) + frame.GCArm:SetFormattedText("A:%3d",self:GetFollowerData(follower.followerID,"armorItemLevel",600)) + frame.GCWep:SetTextColor(c1.r,c1.g,c1.b) + frame.GCArm:SetTextColor(c2.r,c2.g,c2.b) + frame.GCWep:Show() + frame.GCArm:Show() + frame.GCXp:SetPoint("LEFT",frame.GCArm,"RIGHT",2,0) else - frame.GCIt:Hide() + frame.GCWep:Hide() + frame.GCArm:Hide() frame.GCXp:SetPoint("LEFT",frame.Name,"LEFT",0,20) end end end function addon:HookedGarrisonFollowerListButton_OnClick(frame,button) +--@debug@ +print("Click") +--@end-debug@ if (frame.info.isCollected) then if (button=="LeftButton") then if (ns.bigscreen and frame and frame.info and frame.info.followerID) then @@ -1506,10 +1435,11 @@ print(this.frame,this.frame:GetName()) if (PanelTemplates_GetSelectedTab(GMF) ~= 1) then addon:OpenMissionsTab() end - addon:OnClick_GarrisonMissionButton(this.frame,"Leftup") + addon:ScriptGarrisonMissionButton_OnClick(this.frame,"Leftup") lastTab=2 end function addon:RenderFollowerPageMissionList(frame,followerID,force) + print(ns.bigscreen,GMFFollowers:IsShown()) if not ns.bigscreen then return end if not GMFFollowers:IsShown() then return end if (not ml) then @@ -1569,25 +1499,23 @@ print(this.frame,this.frame:GetName()) end --- --Initial one time setup -function addon:SetUp(...) - ns.CompletedMissions={} +function addon:Setup(...) +--@debug@ +print("Setup") +--@end-debug@ --@alpha@ if (not db.alfa.v220) then self:Popup(L["You are using an Alpha version of Garrison Commander. Please post bugs on Curse if you find them"],10) db.alfa.v220=true end --@end-alpha@ - SIZEV=GMF:GetHeight() self:CheckMP() self:CheckGMM() self:Options() - --GMC=self:GMCBuildPanel(ns.bigscreen) local tabMC=CreateFrame("CheckButton",nil,GMF,"SpellBookSkillLineTabTemplate") GMF.tabMC=tabMC tabMC.tooltip="Open Garrison Commander Mission Control" - --tab:SetNormalTexture("World\\Dungeon\\Challenge\\clockRunes.blp") - --tab:SetNormalTexture("Interface\\Timer\\Challenges-Logo.blp") tabMC:SetNormalTexture("Interface\\ICONS\\ACHIEVEMENT_GUILDPERK_WORKINGOVERTIME.blp") self:MarkAsNew(tabMC,'MissionControl','New in 2.2.0! Try automatic mission management!') tabMC:Show() @@ -1618,13 +1546,17 @@ function addon:SetUp(...) bt:SetPoint("CENTER",0,-50) bt.missionType=LE_FOLLOWER_TYPE_GARRISON_6_0 addon:ActivateButton(bt,"MissionComplete",L["Complete all missions without confirmation"]) - return self:StartUp() + self:SafeSecureHookScript("GarrisonMissionFrame","OnShow") + self:Trigger("MSORT") + local parties=self:GetParties() + if #parties==0 then + self:OnAllGarrisonMissions(function(missionID) addon:MatchMaker(missionID) end) + end + return self:ScriptGarrisonMissionFrame_OnShow() --collectgarbage("step",10) --/Interface/FriendsFrame/UI-Toast-FriendOnlineIcon end -function addon:MissionComplete(...) - return self:GetModule("MissionCompletion"):MissionComplete(...) -end + function addon:AddMenu() local menu,size=self:CreateOptionsLayer(MP and 'CKMP' or nil,'BIGSCREEN','IGM','IGP','NOFILL','MSORT','MAXRES','USEFUL') --@debug@ @@ -1659,9 +1591,9 @@ end -- Additional setup -- This method is called every time garrison mission panel is open because -- when it closes, I remove most of used hooks -function addon:StartUp(...) +function addon:ScriptGarrisonMissionFrame_OnShow(...) --@debug@ - print("Starting up") + print("GMF OnShow") --@end-debug@ self:GrowPanel() self:Unhook(GMF,"OnShow") @@ -1696,12 +1628,6 @@ function addon:StartUp(...) if (GMFMissions.CompleteDialog:IsShown()) then self:RaiseCompleteDialog() end - -- Hooking mission buttons on click - for i=1,#GMFMissionListButtons do - local b=GMFMissionListButtons[i] - self:SafeHookScript(b,"OnClick","OnClick_GarrisonMissionButton",true) - end - --self:ScheduleRepeatingTimer("Clock",1) self:RefreshFollowerStatus() self:Trigger("MSORT") self:Trigger("CKMP") @@ -1727,23 +1653,15 @@ function addon:MarkAsNew(obj,key,message) end function addon:PermanentEvents() - self:SafeRegisterEvent("GARRISON_MISSION_COMPLETE_RESPONSE") - self:SafeRegisterEvent("GARRISON_MISSION_NPC_CLOSED") - self:SafeRegisterEvent("GARRISON_MISSION_NPC_OPENED") - self:SafeRegisterEvent("GARRISON_MISSION_STARTED") -- Follower button enhancement in follower list self:SafeSecureHook("GarrisonFollowerButton_UpdateCounters") end function addon:checkHandler(handler) assert (type(handler)=='function' or type(self[handler])=='function',format("Unable to validate hander '%s'",tostring(handler))) end - -function addon:SafeRegisterEvent(event) - local handler="Event"..event +function addon:SafeRegisterEvent(event,handler) + handler=handler or "Event"..event self:checkHandler(handler) - --@debug@ - print("Registered event",event,"to",handler) - --@end-debug@ return self:RegisterEvent(event,handler) end function addon:SafeRawHook(object,method,handler) @@ -1759,9 +1677,6 @@ function addon:SafeHook(object,method,handler,hookType) end handler=handler or "Hooked"..method self:checkHandler(handler) - --@debug@ - print(hookType or "","Hooked",method,"to",handler) - --@end-debug@ if hookType=="post" or hookType=="secure" then self:SecureHook(object,method,handler) elseif hookType=="raw" then @@ -1788,7 +1703,7 @@ function addon:SafeHookScript(frame,method,handler,hookType) end if (frame) then if not handler then - handler='Script'..name..method + handler=format('Script%s_%s',name,method) elseif type(handler)=="boolean" then --@debug@ do @@ -1805,9 +1720,6 @@ function addon:SafeHookScript(frame,method,handler,hookType) if hookType and type(hookType)=="boolean" then hookType="post" end --This allow to change a method, for example to substitute an one time init with the standard routine if (self:IsHooked(frame,method)) then self:Unhook(frame,method) end - --@debug@ - print(hookType or "","Hooked Script",method,"on frame",name,"to",handler) - --@end-debug@ if hookType=="post" or hookType=="secure" then self:SecureHookScript(frame,method,handler) elseif (hookType=="raw") then @@ -1855,7 +1767,6 @@ function addon:CleanUp() --@debug@ print("Cleaning up") --@end-debug@ - wipe(ns.CompletedMissions) self:RemoveMenu() if (GarrisonFollowerTooltip.fs) then GarrisonFollowerTooltip.fs:Hide() @@ -1898,11 +1809,6 @@ function addon:GetFollowerStatus(followerID,withTime,colored) return colored and C(AVAILABLE,"Green") or AVAILABLE end end -function addon:RemoveFromAllMissions(followerID) - for i=1,#cache.missions do - pcall(G.RemoveFollowerFromMission,followerID,cache.missions[i]) - end -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' @@ -1910,6 +1816,9 @@ local fakeinfo={followerID=false} local fakeframe={} function addon:FillMissionPage(missionInfo) + --@debug@ + print("FillMissionPage",missionInfo) + --@end-debug@ if type(missionInfo)=="number" then missionInfo=self:GetMissionData(missionInfo) end if not missionInfo then return end local missionType=missionInfo.followerTypeID @@ -1925,7 +1834,7 @@ function addon:FillMissionPage(missionInfo) stage.expires:SetFormattedText(GARRISON_MISSION_AVAILABILITY2,missionInfo.offerTimeRemaining or "") stage.expires:SetTextColor(self:GetAgeColor(missionInfo.offerEndTime)) else - stage.expires=MissionSeen -- In order to anchor missionId + stage.expires=stage.MissionSeen -- In order to anchor missionId end --@debug@ if not stage.missionid then @@ -2209,11 +2118,7 @@ do self:OpenFollowersTab() GMF.selectedFollower=followerID if (GMF.FollowerTab) then - if (ns.toc <60200) then - GarrisonFollowerPage_ShowFollower(GMF.FollowerTab,followerID) - else - GMFFollowers:ShowFollower(followerID) - end + GMFFollowers:ShowFollower(followerID) end else menu[1].text=frame.info.name @@ -2221,7 +2126,7 @@ do menu[2].arg2=followerID --menu[3].arg2=followerID local i=3 - for k,r in pairs(dbcache.ignored[missionID]) do + for k,r in pairs(chardb.ignored[missionID]) do if (r) then i=i+1 local v=menu[i] or {} @@ -2235,7 +2140,7 @@ do v.isTitle=nil menu[i]=v else - dbcache.ignored[missionID][k]=nil + chardb.ignored[missionID][k]=nil end end if (i>3) then @@ -2259,19 +2164,19 @@ do end function addon:IgnoreFollower(table,missionID,followerID,flag) if (missionID==0) then - dbcache.totallyignored[followerID]=true + chardb.totallyignored[followerID]=true else - dbcache.ignored[missionID][followerID]=true + chardb.ignored[missionID][followerID]=true end -- full ignore disabled for now - dbcache.totallyignored[followerID]=nil + chardb.totallyignored[followerID]=nil self:RefreshMissions(missionID) end function addon:UnignoreFollower(table,missionID,followerID,flag) if (followerID=='all') then - wipe(dbcache.ignored[missionID]) + wipe(chardb.ignored[missionID]) else - dbcache.ignored[missionID][followerID]=nil + chardb.ignored[missionID][followerID]=nil end self:RefreshMissions(missionID) end @@ -2289,11 +2194,7 @@ function addon:OpenLastTab() GMF.MissionTab:Show() end end - if ns.toc <60200 then - GarrisonMissionFrame_SelectTab(lastTab) - else - GMF:SelectTab(lastTab) - end + GMF:SelectTab(lastTab) else return self:OpenMissionsTab() end @@ -2328,26 +2229,17 @@ function addon:OnClick_GarrisonMissionFrame_MissionComplete_NextMissionButton(th self:RefreshFollowerStatus() end end -function addon:OnClick_GarrisonMissionButton(tab,button) - local frame = tab:GetParent():GetParent():GetParent():GetParent():GetParent(); - ---@debug@ -print(frame:GetName()) ---@end-debug@ +function addon:ScriptGarrisonMissionButton_OnClick(tab,button) + print("click",tab,tab.info) lastTab=1 if (GMF.MissionTab.MissionList.showInProgress) then return end if (type(tab.info)~="table") then return end if (tab.fromFollowerPage) then - if (#tab.info.followers>0) then - return - end self:OpenMissionsTab() - self:FillMissionPage(tab.info) - else - self:FillMissionPage(tab.info) end + self:FillMissionPage(tab.info) end function addon:OnClick_GCMissionButton(frame,button) if (button=="RightButton") then @@ -2365,34 +2257,34 @@ end addon.SetUp=addon.ExperimentalSetUp --]] -function over.StolenGarrisonMissionPageFollowerFrame_OnEnter(self) - if not self.info then +function addon:HookedGarrisonMissionPageFollowerFrame_OnEnter(frame) + if not frame.info then return; end GarrisonFollowerTooltip:ClearAllPoints(); - GarrisonFollowerTooltip:SetPoint("TOPLEFT", self, "BOTTOMRIGHT"); - GarrisonFollowerTooltip_Show(self.info.garrFollowerID, - self.info.isCollected, - C_Garrison.GetFollowerQuality(self.info.followerID), - C_Garrison.GetFollowerLevel(self.info.followerID), - C_Garrison.GetFollowerXP(self.info.followerID), - C_Garrison.GetFollowerLevelXP(self.info.followerID), - C_Garrison.GetFollowerItemLevelAverage(self.info.followerID), - C_Garrison.GetFollowerAbilityAtIndex(self.info.followerID, 1), - C_Garrison.GetFollowerAbilityAtIndex(self.info.followerID, 2), - C_Garrison.GetFollowerAbilityAtIndex(self.info.followerID, 3), - C_Garrison.GetFollowerAbilityAtIndex(self.info.followerID, 4), - C_Garrison.GetFollowerTraitAtIndex(self.info.followerID, 1), - C_Garrison.GetFollowerTraitAtIndex(self.info.followerID, 2), - C_Garrison.GetFollowerTraitAtIndex(self.info.followerID, 3), - C_Garrison.GetFollowerTraitAtIndex(self.info.followerID, 4), + GarrisonFollowerTooltip:SetPoint("TOPLEFT", frame, "BOTTOMRIGHT"); + GarrisonFollowerTooltip_Show(frame.info.garrFollowerID, + frame.info.isCollected, + C_Garrison.GetFollowerQuality(frame.info.followerID), + C_Garrison.GetFollowerLevel(frame.info.followerID), + C_Garrison.GetFollowerXP(frame.info.followerID), + C_Garrison.GetFollowerLevelXP(frame.info.followerID), + C_Garrison.GetFollowerItemLevelAverage(frame.info.followerID), + C_Garrison.GetFollowerAbilityAtIndex(frame.info.followerID, 1), + C_Garrison.GetFollowerAbilityAtIndex(frame.info.followerID, 2), + C_Garrison.GetFollowerAbilityAtIndex(frame.info.followerID, 3), + C_Garrison.GetFollowerAbilityAtIndex(frame.info.followerID, 4), + C_Garrison.GetFollowerTraitAtIndex(frame.info.followerID, 1), + C_Garrison.GetFollowerTraitAtIndex(frame.info.followerID, 2), + C_Garrison.GetFollowerTraitAtIndex(frame.info.followerID, 3), + C_Garrison.GetFollowerTraitAtIndex(frame.info.followerID, 4), true, - C_Garrison.GetFollowerBiasForMission(self.missionID, self.info.followerID) < 0.0 + C_Garrison.GetFollowerBiasForMission(frame.missionID, frame.info.followerID) < 0.0 ); end -function over.GarrisonMissionFrame_SetFollowerPortrait(portraitFrame, followerInfo, forMissionPage) +function deleteGarrisonMissionFrame_SetFollowerPortrait(portraitFrame, followerInfo, forMissionPage) local color = ITEM_QUALITY_COLORS[followerInfo.quality]; portraitFrame.PortraitRingQuality:SetVertexColor(color.r, color.g, color.b); portraitFrame.LevelBorder:SetVertexColor(color.r, color.g, color.b); @@ -2437,7 +2329,7 @@ function over.GarrisonMissionFrame_SetFollowerPortrait(portraitFrame, followerIn end end -function over.GarrisonMissionPage_Close(self) +function addon:GarrisonMissionPageOnClose(self) GMF:ClearParty() GarrisonMissionFrame.MissionTab.MissionPage:Hide(); GarrisonMissionFrame.followerCounters = nil; @@ -2544,35 +2436,35 @@ function addon:AddRewards(frame, rewards, numRewards) frame.Rewards[i]:Hide(); end end -function over.GarrisonMissionPageFollowerFrame_OnEnter(self) - if not self.info then +function addon:HookedGarrisonMissionPageFollowerFrame_OnEnter(frame) + if not frame.info then return; end if (addon:IsRewardPage()) then return end GarrisonFollowerTooltip:ClearAllPoints(); - GarrisonFollowerTooltip:SetPoint("TOPLEFT", self, "BOTTOMRIGHT"); - GarrisonFollowerTooltip_Show(self.info.garrFollowerID, - self.info.isCollected, - C_Garrison.GetFollowerQuality(self.info.followerID), - C_Garrison.GetFollowerLevel(self.info.followerID), - C_Garrison.GetFollowerXP(self.info.followerID), - C_Garrison.GetFollowerLevelXP(self.info.followerID), - C_Garrison.GetFollowerItemLevelAverage(self.info.followerID), - C_Garrison.GetFollowerAbilityAtIndex(self.info.followerID, 1), - C_Garrison.GetFollowerAbilityAtIndex(self.info.followerID, 2), - C_Garrison.GetFollowerAbilityAtIndex(self.info.followerID, 3), - C_Garrison.GetFollowerAbilityAtIndex(self.info.followerID, 4), - C_Garrison.GetFollowerTraitAtIndex(self.info.followerID, 1), - C_Garrison.GetFollowerTraitAtIndex(self.info.followerID, 2), - C_Garrison.GetFollowerTraitAtIndex(self.info.followerID, 3), - C_Garrison.GetFollowerTraitAtIndex(self.info.followerID, 4), + GarrisonFollowerTooltip:SetPoint("TOPLEFT", frame, "BOTTOMRIGHT"); + GarrisonFollowerTooltip_Show(frame.info.garrFollowerID, + frame.info.isCollected, + C_Garrison.GetFollowerQuality(frame.info.followerID), + C_Garrison.GetFollowerLevel(frame.info.followerID), + C_Garrison.GetFollowerXP(frame.info.followerID), + C_Garrison.GetFollowerLevelXP(frame.info.followerID), + C_Garrison.GetFollowerItemLevelAverage(frame.info.followerID), + C_Garrison.GetFollowerAbilityAtIndex(frame.info.followerID, 1), + C_Garrison.GetFollowerAbilityAtIndex(frame.info.followerID, 2), + C_Garrison.GetFollowerAbilityAtIndex(frame.info.followerID, 3), + C_Garrison.GetFollowerAbilityAtIndex(frame.info.followerID, 4), + C_Garrison.GetFollowerTraitAtIndex(frame.info.followerID, 1), + C_Garrison.GetFollowerTraitAtIndex(frame.info.followerID, 2), + C_Garrison.GetFollowerTraitAtIndex(frame.info.followerID, 3), + C_Garrison.GetFollowerTraitAtIndex(frame.info.followerID, 4), true, - self.missionID and self.info.followerID and - C_Garrison.GetFollowerBiasForMission(self.missionID, self.info.followerID) < 0.0 + frame.missionID and frame.info.followerID and + C_Garrison.GetFollowerBiasForMission(frame.missionID, frame.info.followerID) < 0.0 or false ); end -function addon:HookedGarrisonMissionButton_OnEnter(this, button) +function addon:ScriptGarrisonMissionButton_OnEnter(this, button) if (this.info == nil) then return; end @@ -2832,7 +2724,7 @@ function addon:AddIndicatorToButton(button,mission,missionID,bigscreen) end local panel=button.gcINDICATOR local perc=select(4,G.GetPartyMissionInfo(missionID)) - if button.party then perc=button.party.perc end + if button.party and button.party.perc then perc=button.party.perc end if button.party.full then panel.Percent:SetFormattedText(GARRISON_MISSION_PERCENT_CHANCE,perc) panel.Percent:SetTextColor(self:GetDifficultyColors(perc)) @@ -2940,12 +2832,11 @@ function addon:AddFollowersToButton(button,mission,missionID,bigscreen) end end -- Switchs between active and availabla missions depending on tab object -function over.GarrisonMissionList_SetTab(...) +function addon:HookedGarrisonMissionList_SetTab(tab) --@debug@ - print("Click su",...) + print("Click su",tab:GetID()) --@end-debug@ -- I dont actually care wich page we are showing, I know I must redraw missions - orig.GarrisonMissionList_SetTab(...) addon:RefreshFollowerStatus() for i=1,#GMFMissionListButtons do GMFMissionListButtons.lastMissionID=nil @@ -2953,16 +2844,14 @@ function over.GarrisonMissionList_SetTab(...) if (HD) then addon:ResetSinks() end end function addon:HookedClickOnTabs(tab) - --@debug@ -print(tab) + print(tab) --@end-debug@ lastTab=tab end -function over.GarrisonMissionFrame_SelectTab(self,tab,...) - +function addon:GarrisonMissionFrame_SelectTab(frame,tab) --@debug@ -print(tab) + print(frame,tab) --@end-debug@ addon:RefreshFollowerStatus() for i=1,#GMFMissionListButtons do @@ -2983,9 +2872,7 @@ function addon:HookedGarrisonMissionButton_SetRewards(frame,rewards,numRewards) end frame.lastID = frame.info.missionID frame.lastProgress = frame.info.inProgress - if not frame.party or frame.party.missionID ~=frame.info.missionID then - frame.party=self:GetParty(frame.info.missionID) - end + frame.party=self:GetParty(frame.info.missionID) self:DrawSingleButton(GMF,frame,false,ns.bigscreen) end end @@ -2998,16 +2885,12 @@ function addon:HookedGMFMissions_update(frame) end end end -addon:SafeSecureHook(GMFMissions.listScroll,"update","HookedGMFMissions_update") +addon:SafeSecureHook(GMF.MissionTab.MissionList.listScroll,"update","HookedGMFMissions_update") addon:SafeSecureHook("GarrisonMissionButton_SetRewards") -addon:SafeRawHook("GarrisonMissionButton_OnEnter") +addon:SafeRawHook("GarrisonMissionButton_OnEnter","ScriptGarrisonMissionButton_OnEnter") +addon:SafeRawHook("GarrisonMissionPageFollowerFrame_OnEnter") +addon:SafeSecureHook("GarrisonMissionList_SetTab") +addon:SafeSecureHook(GMF,"SelectTab","GarrisonMissionFrame_SelectTab") +addon:SafeRawHookScript(GMF.MissionTab.MissionPage.CloseButton,"OnClick","GarrisonMissionPageOnClose") -override("GarrisonMissionPageFollowerFrame_OnEnter") -override("GarrisonMissionList_SetTab") -hooksecurefunc(GMF,"SelectTab",over.GarrisonMissionFrame_SelectTab) -GMF.MissionTab.MissionPage.CloseButton:SetScript("OnClick",over.GarrisonMissionPage_Close) -for i=1,#GMFMissionListButtons do - local b=GMFMissionListButtons[i] - addon:SafeRawHookScript(b,"OnEnter","HookedGarrisonMissionButton_OnEnter") -end _G.GAC=addon \ No newline at end of file diff --git a/GarrisonCommander.xml b/GarrisonCommander.xml index d647622..70a2b17 100644 --- a/GarrisonCommander.xml +++ b/GarrisonCommander.xml @@ -49,11 +49,17 @@ - + + + + + + + diff --git a/Init.lua b/Init.lua index 13d6134..49b5048 100644 --- a/Init.lua +++ b/Init.lua @@ -102,17 +102,17 @@ do end local backdrop = { --bgFile="Interface\\TutorialFrame\\TutorialFrameBackground", - bgFile=nil,--"Interface\\DialogFrame\\UI-DialogBox-Background-Dark", + bgFile="Interface\\DialogFrame\\UI-DialogBox-Background-Dark", edgeFile="Interface\\Tooltips\\UI-Tooltip-Border", tile=true, tileSize=16, edgeSize=16, - insets={bottom=7,left=7,right=7,top=7} + insets={bottom=3,left=3,right=3,top=3} } function ns.AddBackdrop(frame) frame:SetBackdrop(backdrop) frame:SetBackdropColor(1,1,1,0) - frame:SetBackdropColor(1,0,0,1) + frame:SetBackdropBorderColor(1,0,0,1) end -- my implementation of tonumber which accounts for nan and inf ---@function [parent=#ns] tonumber diff --git a/MissionCache.lua b/MissionCache.lua index c2067ec..cc40816 100644 --- a/MissionCache.lua +++ b/MissionCache.lua @@ -23,129 +23,48 @@ local rushOrders="interface\\icons\\inv_scroll_12.blp" local rawget=rawget local time=time local empty={} -local cache +local index={} -- Mission caching is a bit different fron follower caching mission appears and disappears on a regular basis local module=addon:NewSubClass('MissionCache') --#module function module:OnInitialized() - self:HookScript(GMF,"OnShow","PanelOpened",true) - self:HookScript(GMF,"OnHide","PanelClosed",true) - self:HookScript(GSF,"OnShow","PanelOpened",true) - self:HookScript(GSF,"OnHide","PanelClosed",true) - addon.db:RegisterNamespace('missionscache',{global={['*']={rewards={},followers={},_filled=0}}}) - cache=addon.db:GetNamespace('missionscache').global - --wipe(cache) - --@debug@ -print("OnInitialized") + print("OnInitialized") --@end-debug@ - - -end -local function deepCopy(original,copy) - for k, v in pairs(original) do - -- as before, but if we find a table, make sure we copy that too - if type(v) == 'table' then - copy[k]={} - deepCopy(v,copy[k]) - else - copy[k] = v - end - end - return copy end -local function flatCopy(original,copy) - ---@debug@ -print("Destination",copy,"Original",original) ---@end-debug@ - for k, v in pairs(original) do - -- as before, but if we find a table, make sure we copy that too - if type(v) ~= 'table' then - copy[k] = v - end - end - return copy -end -local runkeys={ -'inProgress', -'offerTimeRemaining', -'timeLeft', -'missionEndTime', -'canStart' -} -local function load(t,base) - for i=1,#t do - local missionID=t[i].missionID - local mission=t[i] - for _,k in ipairs(runkeys) do - cache[missionID][k]=mission[k] - end - if mission.inProgress then - if (mission.followers) then - for f=1,#mission.followers do - cache[missionID].followers[f]=mission.followers[f] - end - end - ---@debug@ -print("Refreshed",mission.name,"followers",mission.followers) ---@end-debug@ - else - wipe(mission.followers) +local function scan(t,s) + if type(t)=="table" then + for i=1,#t do + index[t[i].missionID]=format("%s@%d",s,i) end end end -function module:PanelOpened(frame,...) - if (frame==GMF) then - load(GMFMissions.availableMissions) - load(GMFMissions.inProgressMissions) - else - load(GSFMissions.missions) - end -end -function module:PanelClosed(frame,...) - -end -local keys={ -'followerTypeID', -'cost', -'duration', -'durationSeconds', -'level', -'iLevel', -'duration', -'xpBonus', -'numFollowers', -'missionID', -'numRewards', -'costCurrencyTypesID', -'cost' -} -function module:GetMission(id) - if time() - (tonumber(cache[id]._filled) or 0) > 3600 then - cache[id].name=G.GetMissionName(id) - if cache[id].name then -- I need to be sure mission actually exists - local t=G.GetBasicMissionInfo(id) - if (t) then - for _,k in ipairs(keys) do - cache[id][k]=t[k] - end - cache[id]._filled=time() - for i=1,#t.followers do - cache[id].followers[i]=t.followers[i] - end - deepCopy(t.rewards,cache[id].rewards) - end +function module:GetMission(id,noretry) + local mission + if index[id] then + print(id,index[id]) + local type,ix=strsplit("@",index[id]) + ix=tonumber(ix) + if type=="a" then + mission=GMFMissions.availableMissions[ix] + if mission and mission.missionID==id then return mission end + elseif type=="p" then + mission=GMFMissions.inProgressMissions[ix] + if mission and mission.missionID==id then return mission end + elseif type=="s" then + mission=GSFMissions.missions[ix] + if mission and mission.missionID==id then return mission end end end - return cache[id] + if noretry then return end + wipe(index) + scan(GMFMissions.availableMissions,'a') + scan(GMFMissions.inProgressMissions,'p') + scan(GSFMissions.missions,'s') + return self:GetMission(id,true) end function module:AddExtraData(mission) - local _ - _,mission.xp,mission.type,mission.typeDesc,mission.typeIcon,mission.locPrefix,_,mission.enemies=G.GetMissionInfo(mission.missionID) - if mission.level then - mission.rank=mission.level < GARRISON_FOLLOWER_MAX_LEVEL and mission.level or mission.iLevel - end + print(mission) + mission.rank=mission.level < GARRISON_FOLLOWER_MAX_LEVEL and mission.level or mission.iLevel mission.resources=0 mission.oil=0 mission.apexis=0 @@ -293,13 +212,11 @@ local function keyToIndex(key) end return idx end + function addon:GetMissionData(missionID,key,default) - local mission - if newcache then - mission=module:GetMission(missionID) - else - local idx=keyToIndex(missionID) - local mission=Mbase.availableMissions[idx] + local mission=module:GetMission(missionID) + if mission and not mission.class then + self:AddExtraData(mission) end if not mission then mission=self:GetModule("MissionCompletion"):GetMission(missionID) diff --git a/MissionCompletion.lua b/MissionCompletion.lua index 8b10f6c..411a503 100644 --- a/MissionCompletion.lua +++ b/MissionCompletion.lua @@ -300,3 +300,6 @@ function module:MissionsPrintResults(success) report:AddRow(L["No follower gained xp"]) end end +function addon:MissionComplete(...) + return module:MissionComplete(...) +end diff --git a/MissionControl.lua b/MissionControl.lua index 26a5486..90dd926 100644 --- a/MissionControl.lua +++ b/MissionControl.lua @@ -9,8 +9,7 @@ local _G=_G local factory=addon:GetFactory() --GMC_G.frame = CreateFrame('FRAME') local aMissions={} -local dbcache -local cache +local chardb local db local GMC local GMF=GarrisonMissionFrame @@ -403,12 +402,11 @@ end function module:OnInitialized() local bigscreen=ns.bigscreen db=addon.db.global - dbcache=addon.privatedb.profile - cache=addon.private.profile + chardb=addon.privatedb.profile chestTexture='GarrMission-'..UnitFactionGroup('player').. 'Chest' GMC = CreateFrame('FRAME', 'GMCOptions', GMF) ns.GMC=GMC - settings=dbcache.missionControl + settings=chardb.missionControl tOrder=settings.rewardOrder if settings.version < 2 then dbfixV1() diff --git a/ShipYard.lua b/ShipYard.lua index 1e202c0..d0aea63 100644 --- a/ShipYard.lua +++ b/ShipYard.lua @@ -66,10 +66,6 @@ local i=0 function module:HookedGarrisonShipyardMap_SetupBonus(missionList,frame,mission) if not GSF:IsShown() then return end - ---@debug@ -print(frame:GetWidth(),mission) ---@end-debug@ addon:AddExtraData(mission) local perc=addon:MatchMaker(mission) local addendum=frame.GcAddendum @@ -78,20 +74,35 @@ print(frame:GetWidth(),mission) i=i+1 addendum=CreateFrame("Frame",nil,frame) addendum:SetPoint("TOPLEFT",frame,"TOPRIGHT",-15,0) - 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") + addendum:SetFrameStrata("FULLSCREEN_DIALOG") + addendum:SetFrameLevel(GSF:GetFrameLevel()+5) + AddBackdrop(addendum) + addendum:SetBackdropColor(0,0,0,0.5) + addendum:SetWidth(50) + addendum:SetHeight(25) + addendum.chance=addendum:CreateFontString(nil,"TOOLTIP","GameFontHighlightMedium") + addendum.chance:SetAllPoints() + addendum.chance:SetJustifyH("CENTER") + addendum.chance:SetJustifyV("CENTER") 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)) + local cost=mission.cost + local currency=mission.costCurrencyTypesID + if cost and currency then + local _,available=GetCurrencyInfo(currency) + if cost>available then + addendum:SetBackdropBorderColor(1,0,0) + else + addendum:SetBackdropBorderorderCOlor(0,1,0) + end + else + addendum:SetBackdropBorderorderCOlor(1,1,1) + + end --addendum.expire:SetText(mission.class) --addendum.duration:SetText(mission.duration) end @@ -100,12 +111,12 @@ function module:HookedGarrisonShipyardMap_UpdateMissions() for i=1,#list.missions do local frame = list.missionFrames[i] if not self:IsHooked(frame,"PostClick") then - self:SafeHookScript(frame,"PostClick","HookedMapButtonOnClick",true) + self:SafeHookScript(frame,"PostClick","ScriptMapButtonOnClick",true) end end end -function module:HookedMapButtonOnClick(this) +function module:ScriptMapButtonOnClick(this) self:FillMissionPage(this.info) end function module:HookedGSF_OnClickMission(this,missionInfo) @@ -134,14 +145,14 @@ function module:Setup(this,...) --@debug@ print("Doing one time initialization for",this:GetName(),...) --@end-debug@ - self:SafeHookScript(GSF,"OnShow","OnShow",true) + self:SafeSecureHookScript("GarrisonShipyardFrame","OnShow") GSF:EnableMouse(true) GSF:SetMovable(true) GSF:RegisterForDrag("LeftButton") GSF:SetScript("OnDragStart",function(frame)if (self:GetBoolean("MOVEPANEL")) then frame:StartMoving() end end) GSF:SetScript("OnDragStop",function(frame) frame:StopMovingOrSizing() end) end -function module:OnShow() +function module:ScriptGarrisonShipyardFrame_OnShow() --@debug@ print("Doing all time initialization") @@ -163,7 +174,7 @@ function module:HookedGarrisonShipyardMapMission_OnEnter(frame) addon:AddFollowersToTooltip(missionID,LE_FOLLOWER_TYPE_SHIPYARD_6_2) --@debug@ g:AddDoubleLine("MissionID:",missionID) ---@end-debug +--@end-debug@ g:Show() if g:GetWidth() < GarrisonShipyardMapMissionTooltip:GetWidth() then g:SetWidth(GarrisonShipyardMapMissionTooltip:GetWidth()) diff --git a/Widgets.lua b/Widgets.lua index 3b83073..d77e290 100644 --- a/Widgets.lua +++ b/Widgets.lua @@ -332,6 +332,9 @@ local function GMCMissionButton() local Type2="GMCSlimMissionButton" local Version=1 local unique=0 + local function GarrisonMissionButton_OnEnter(...) + addon:ScriptGarrisonMissionButton_OnEnter(...) + end local m={} --#GMCMissionButton function m:OnAcquire() local frame=self.frame -- 1.7.9.5