From 69c0ab02b25c778f15f680136cc1695adbf5f4a9 Mon Sep 17 00:00:00 2001 From: Alar of Runetotem Date: Sun, 28 Aug 2016 12:55:04 +0200 Subject: [PATCH] Various fixes in order to support Order Hall --- GarrisonCommander.lua | 188 ++++++++++++++++++++++++++----------------------- Init.lua | 13 ++++ ShipYard.lua | 11 +-- 3 files changed, 120 insertions(+), 92 deletions(-) diff --git a/GarrisonCommander.lua b/GarrisonCommander.lua index 8454d8c..1217115 100644 --- a/GarrisonCommander.lua +++ b/GarrisonCommander.lua @@ -29,6 +29,7 @@ local minHeight local addon=addon --#addon 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 +local LE_FOLLOWER_TYPE_GARRISON_7_0=_G.LE_FOLLOWER_TYPE_GARRISON_7_0 local LE_GARRISON_TYPE_6_0=_G.LE_GARRISON_TYPE_6_0 local LE_GARRISON_TYPE_6_2=_G.LE_GARRISON_TYPE_6_2 local LE_GARRISON_TYPE_7_0=_G.LE_GARRISON_TYPE_7_0 @@ -393,14 +394,30 @@ function addon:ApplyMSORT(value) end self:RefreshMissions() end - +function addon:GetMain() + return GMF +end +function addon:GetMissions() + return GMFMissions +end +function addon:GetBigScreen() + return ns.bigscreen +end function addon:OnInitialized() --@debug@ print("Initialize") --@end-debug@ + -- + ns.custom={ + [LE_FOLLOWER_TYPE_GARRISON_6_0]=addon, + [LE_FOLLOWER_TYPE_SHIPYARD_6_2]=self:GetModule("ShipYard"), + [LE_FOLLOWER_TYPE_GARRISON_7_0]=self:GetModule("OrderHall"), + + } self:SafeRegisterEvent("GARRISON_MISSION_COMPLETE_RESPONSE") self:SafeRegisterEvent("GARRISON_MISSION_NPC_CLOSED") self:SafeRegisterEvent("GARRISON_MISSION_STARTED") + self:SafeRegisterEvent("ADDON_LOADED") for _,b in ipairs(GMF.MissionTab.MissionList.listScroll.buttons) do local scale=0.8 local f,h,s=b.Title:GetFont() @@ -408,7 +425,7 @@ function addon:OnInitialized() local f,h,s=b.Summary:GetFont() b.Summary:SetFont(f,h*scale,s) b:RegisterForClicks("LeftButtonUp","RightButtonUp") - addon:SafeRawHookScript(b,"OnEnter","ScriptGarrisonMissionButton_OnEnter") + addon:SafeSecureHookScript(b,"OnEnter","ScriptGarrisonMissionButton_OnEnter") addon:SafeRawHookScript(b,"OnClick","ScriptGarrisonMissionButton_OnClick") end self:CreatePrivateDb() @@ -642,6 +659,7 @@ function addon:AddLine(name,status) GameTooltip:AddDoubleLine(name, status,nil,nil,nil,r2,g2,b2) end function addon:SetThreatColor(obj,threat) + print(threat) if type(threat)=="string" then local _,_,bias,follower,name=strsplit(":",threat) local color=self:GetBiasColor(tonumber(bias) or -1,nil,"Green") @@ -1338,7 +1356,6 @@ function addon:HookedGarrisonFollowerButton_UpdateCounters(...) return self:RenderFollowerPageFollowerButton(select(2,...)) end function addon:RenderFollowerPageFollowerButton(frame,follower,showCounters) - print(follower.name,frame) if not frame.GCWep then frame.GCWep=frame:CreateFontString(nil,"ARTWORK","GameFontHighlightSmall") frame.GCWep:SetPoint("BOTTOMLEFT",frame.Name,"TOPLEFT",0,2) @@ -1346,7 +1363,7 @@ function addon:RenderFollowerPageFollowerButton(frame,follower,showCounters) frame.GCArm:SetPoint("TOPLEFT",frame.GCWep,"TOPRIGHT") frame.GCXp=frame:CreateFontString(nil,"ARTWORK","GameFontHighlightSmall") end - if not frame.isCollected or type(frame.id)=="number" then + if not follower.isCollected or type(follower.followerID)=="number" or follower.isTroop then frame.GCXp:Hide() frame.GCWep:Hide() frame.GCArm:Hide() @@ -1366,10 +1383,10 @@ function addon:RenderFollowerPageFollowerButton(frame,follower,showCounters) --@debug@ print(follower.followerID) --@end-debug@ - 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)) + local c1=ITEM_QUALITY_COLORS[self:GetAnyData(follower.followerTypeID,follower.followerID,"weaponQuality" ,1)] + local c2=ITEM_QUALITY_COLORS[self:GetAnyData(follower.followerTypeID,follower.followerID,"armorQuality" ,1)] + frame.GCWep:SetFormattedText("W:%3d",self:GetAnyData(follower.followerTypeID,follower.followerID,"weaponItemLevel",600)) + frame.GCArm:SetFormattedText("A:%3d",self:GetAnyData(follower.followerTypeID,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() @@ -1403,6 +1420,9 @@ end -- Shamelessly stolen from Blizzard Code -- Appears when hovering on menaces in mission button function addon.ClonedGarrisonMissionMechanic_OnEnter(this) +--@debug@ +print(this) +--@end-debug@ local tip=GameTooltip local button=this:GetParent() tip:SetOwner(button, "ANCHOR_CURSOR_RIGHT"); @@ -1783,7 +1803,7 @@ function addon:PermanentEvents() 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))) + assert (type(handler)=='function' or type(self[handler])=='function',format("Unable to validate handler '%s'",tostring(handler))) end function addon:SafeRegisterEvent(event,handler) handler=handler or "Event"..event @@ -1941,20 +1961,27 @@ local GARRISON_MISSION_AVAILABILITY2=GARRISON_MISSION_ENVIRONMENT:sub(1,10)..GAR local GARRISON_MISSION_ID=GARRISON_MISSION_ENVIRONMENT:sub(1,10)..'MissionID:|r |cffffffff%s|r' local fakeinfo={followerID=false} local fakeframe={} +local mainframes={ + [LE_FOLLOWER_TYPE_GARRISON_6_0]="GarrisonMissionFrame", + [LE_FOLLOWER_TYPE_SHIPYARD_6_2]="GarrisonShipyardFrame", + [LE_FOLLOWER_TYPE_GARRISON_7_0]="OrderHallMissionFrame", +} 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 - if missionType==LE_FOLLOWER_TYPE_SHIPYARD_6_2 and not missionInfo.canStart then return end - local stage=missionType==LE_FOLLOWER_TYPE_GARRISON_6_0 and GMF.MissionTab.MissionPage.Stage or GSF.MissionTab.MissionPage.Stage - local missionenv=stage.MissionEnv - if toc >=70000 then - missionenv=stage.MissionInfo.MissionEnv + if missionType==LE_FOLLOWER_TYPE_SHIPYARD_6_2 or missionType==LE_FOLLOWER_TYPE_GARRISON_7_0 then + if not missionInfo.canStart then return end + end + local main=_G[mainframes[missionType]] + if not main then return end + local missionpage=main.MissionTab.MissionPage + local stage=main.MissionTab.MissionPage.Stage + local missionenv=stage.MissionInfo.MissionEnv + if missionType==LE_FOLLOWER_TYPE_GARRISON_7_0 then + missionenv=stage.MissionInfo.MissionTime end if not stage.MissionSeen then if not stage.expires then @@ -1977,18 +2004,10 @@ function addon:FillMissionPage(missionInfo) end stage.missionid:SetFormattedText(GARRISON_MISSION_ID,missionInfo.missionID) --@end-debug@ - if( IsControlKeyDown()) then self:Print("Shift key, ignoring mission prefill") return end + if( IsControlKeyDown()) then self:Print("Ctrl key, ignoring mission prefill") return end if (self:GetBoolean("NOFILL")) then return end local missionID=missionInfo.missionID ---@debug@ - print("UpdateMissionPage for",missionID,missionInfo.name,missionInfo.numFollowers) ---@end-debug@ holdEvents() - local main=missionInfo.followerTypeID==LE_FOLLOWER_TYPE_GARRISON_6_0 and GMF or GSF - local missionpage=main.MissionTab.MissionPage ---@debug@ - print(missionpage) ---@end-debug@ main:ClearParty() local party=self:GetParty(missionID) if (party) then @@ -2103,13 +2122,12 @@ function addon:RenderFollowerButton(frame,followerID,missionID,b,t) frame:EnableMouse(true) frame.PortraitFrame.Level:SetTextColor(1,1,1,1) frame.PortraitFrame.Portrait:Show() - local info=self:GetFollowerData(followerID) + local info=self:GetAnyData(0,followerID) if (not info) then - ---@debug@ -print("Unable to find follower",followerID) ---@end-debug@ - return + --@debug@ + print("Unable to find follower",followerID) + --@end-debug@ + return end frame.info=info frame.missionID=missionID @@ -2711,38 +2729,31 @@ function addon:ScriptGarrisonMissionButton_OnEnter(this, button) end if (addon:IsRewardPage()) then return end collectgarbage("step",100) - if (this.info == nil) then - return; - end - - GameTooltip:SetOwner(this, "ANCHOR_CURSOR_RIGHT"); - if(this.info.inProgress) then - GarrisonMissionButton_SetInProgressTooltip(this.info); + --GarrisonMissionButton_SetInProgressTooltip(this.info); else - GameTooltip:SetText(this.info.name); - GameTooltip:AddLine(string.format(GARRISON_MISSION_TOOLTIP_NUM_REQUIRED_FOLLOWERS, this.info.numFollowers), 1, 1, 1); - local followertype=toc==70000 and LE_FOLLOWER_TYPE_GARRISON_6_0 or GarrisonMissionFrame:GetFollowerType() - local rc,message=pcall(GarrisonMissionButton_AddThreatsToTooltip,this.info.missionID, followertype); - --@debug@ - if not rc then GameTooltip:AddLine(message) end - --@end-debug@ - GameTooltip:AddLine(GARRISON_MISSION_AVAILABILITY); - GameTooltip:AddLine(this.info.offerTimeRemaining, 1, 1, 1); - if (blacklist[this.info.missionID]) then - GameTooltip:AddDoubleLine(L["Blacklisted"],L["Right-Click to remove from blacklist"],1,0.125,0.125,C:Green()) - GameTooltip:AddLine(L["Blacklisted missions are ignored in Mission Control"]) - else - GameTooltip:AddDoubleLine(L["Not blacklisted"],L["Right-Click to blacklist"],0.125,1.0,0.125,C:Red()) + if not this.info.isRare then + GameTooltip:AddLine(GARRISON_MISSION_AVAILABILITY); + GameTooltip:AddLine(this.info.offerTimeRemaining, 1, 1, 1); + end + if not this.hall then + if (blacklist[this.info.missionID]) then + GameTooltip:AddDoubleLine(L["Blacklisted"],L["Right-Click to remove from blacklist"],1,0.125,0.125,C:Green()) + GameTooltip:AddLine(L["Blacklisted missions are ignored in Mission Control"]) + else + GameTooltip:AddDoubleLine(L["Not blacklisted"],L["Right-Click to blacklist"],0.125,1.0,0.125,C:Red()) + end end - GameTooltip:AddLine(this.info.offerTimeRemaining, 1, 1, 1); - addon:AddFollowersToTooltip(this.info.missionID,LE_FOLLOWER_TYPE_GARRISON_6_0 or 0) - if not C_Garrison.IsOnGarrisonMap() and not GMF:IsVisible() then - GameTooltip:AddLine(" "); - GameTooltip:AddLine(GARRISON_MISSION_TOOLTIP_RETURN_TO_START, nil, nil, nil, 1); + addon:AddFollowersToTooltip(this.info.missionID,this.hall and LE_FOLLOWER_TYPE_GARRISON_7_0 or LE_FOLLOWER_TYPE_GARRISON_6_0) + if not this.hall then + if not C_Garrison.IsOnGarrisonMap() and not GMF:IsVisible() then + GameTooltip:AddLine(" "); + GameTooltip:AddLine(GARRISON_MISSION_TOOLTIP_RETURN_TO_START, nil, nil, nil, 1); + end end end --@debug@ + GameTooltip:AddLine("----------------------------------------------") GameTooltip:AddDoubleLine("MissionID",this.info.missionID) GameTooltip:AddDoubleLine("Class",this.info.class) GameTooltip:AddDoubleLine(this.info.class,this.info[this.info.class]) @@ -2858,8 +2869,8 @@ function addon:AddStandardDataToButton(source,button,mission,missionID,bigscreen else button.LocBG:Hide(); end - self:AddLevel(source,button,mission,missionID,bigscreen) - button:Enable(); + ns.custom[mission.followerTypeID]:AddLevel(source,button,mission,missionID,bigscreen) + button:Enable() button.MissionType:SetPoint("TOPLEFT",5,-2) -- From here on, I am in my own buttons context -- Mission Control wide is 832, left for buttons is 305 source = "Control" @@ -2898,6 +2909,7 @@ function addon:AddStandardDataToButton(source,button,mission,missionID,bigscreen end function addon:AddLevel(source,button,mission,missionID,bigscreen) + print("base") button.Level:SetPoint("CENTER", button, "TOPLEFT", 40, -36); local level= (mission.level == GARRISON_FOLLOWER_MAX_LEVEL and mission.iLevel > 0) and mission.iLevel or mission.level local quality=1 @@ -2911,7 +2923,6 @@ function addon:AddLevel(source,button,mission,missionID,bigscreen) button.Level:SetText(level) button.Level:SetTextColor(self:GetQualityColor(quality)) button.ItemLevel:Hide(); - end function addon:AddThreatsToButton(button,mission,missionID,bigscreen) local threatIndex=1 @@ -2933,8 +2944,8 @@ function addon:AddThreatsToButton(button,mission,missionID,bigscreen) button.Env:Show() button.Env.Icon:SetTexture(mission.typeIcon) button.Env.texture=mission.typeIcon - button.Env.countered=party.isEnvMechanicCountered - if (party.isEnvMechanicCountered) then + button.Env.countered=party.isEnvMechanicCountered.environmentMechanicCountered + if (party.isEnvMechanicCountered.environmentMechanicCountered) then button.Env.Border:SetVertexColor(C.Green()) else button.Env.Border:SetVertexColor(C.Red()) @@ -2994,8 +3005,8 @@ function addon:AddIndicatorToButton(button,mission,missionID,bigscreen) button.gcINDICATOR=indicators end local panel=button.gcINDICATOR - local perc=select(4,G.GetPartyMissionInfo(missionID)) - if button.party and button.party.perc > perc then perc=button.party.perc end + local perc=select(4,G.GetPartyMissionInfo(missionID)) or 0 + if button.party and type(button.party.perc)=="number" and button.party.perc > 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)) @@ -3141,14 +3152,19 @@ function addon:GarrisonMissionFrame_SelectTab(frame,tab) end function addon:HookedGarrisonMissionButton_SetRewards(frame,rewards,numRewards) collectgarbage("step",300) - if not GMF:IsVisible() then return end + local mission=frame.info + local module=ns.custom[mission.followerTypeID] + local main=module:GetMain() + if not main or not main:IsVisible() then return end + local Missions=module:GetMissions() + local bigscreen=module:GetBigScreen() if frame.info then - if GMFMissions.showInProgress then + if Missions.showInProgress then frame.Title:SetPoint("TOPLEFT",frame,"TOPLEFT",160,-25) else local extra=80*(numRewards-1) - if not ns.bigscreen then extra = extra + 70 * (frame.info.numFollowers-1) end - local allowed=ns.bigscreen and 350- extra or 480 - extra + if not bigscreen then extra = extra + 70 * (frame.info.numFollowers-1) end + local allowed=bigscreen and 350- extra or 480 - extra local needed=frame.Title:GetStringWidth()+5+frame.Summary:GetStringWidth() if (needed > allowed) then frame.Title:SetPoint("TOPLEFT",frame,"TOPLEFT",160,-5) @@ -3160,20 +3176,20 @@ function addon:HookedGarrisonMissionButton_SetRewards(frame,rewards,numRewards) end frame.MissionType:SetPoint("TOPLEFT",5,-2) frame.MissionType:SetAlpha(0.5) - self:AddLevel(GMF,frame,frame.info,frame.info.missionID,ns.bigscreen) - if GMFMissions.showInProgress and frame.lastID and frame.lastID == frame.info.missionID and frame.lastProgress then + module:AddLevel(GMF,frame,frame.info,frame.info.missionID,bigscreen) + if Missions.showInProgress and frame.lastID and frame.lastID == frame.info.missionID and frame.lastProgress then return end frame.lastID = frame.info.missionID frame.lastProgress = frame.info.inProgress frame.party=self:GetParty(frame.info.missionID) - if not GMFMissions.showInProgress then + if not Missions.showInProgress then self:MatchMaker(frame.info.missionID,frame.party) end --@debug@ - if not GMF:IsVisible() then print(debugstack()) end + if not main:IsVisible() then pp(debugstack()) end --@end-debug@ - self:DrawSingleButton(GMF,frame,GMFMissions.showInProgress,ns.bigscreen) + self:DrawSingleButton(GMF,frame,GMFMissions.showInProgress,bigscreen) end end @@ -3203,6 +3219,9 @@ function addon:GarrisonMissionPageFollowerFrame_OnEnter(this) end do local lasttime=0 function addon:HookedGarrisonMissionList_Update(t,...) +--@debug@ + print(self,t,...) +--@end-debug@ collectgarbage('step',200) if not GMFMissions.showInProgress then addon.hooks.GarrisonMissionList_Update(self,t,...) @@ -3233,21 +3252,14 @@ end end --addon:SafeRawHook(GMF.MissionTab.MissionList.listScroll,"update","HookedGMFMissionsListScroll_update") addon.hooks=addon.hooks or {} -if toc==70000 then - addon.hooks.GarrisonMissionList_Update=GMF.MissionTab.MissionList.Update - GMF.MissionTab.MissionList.Update=addon.HookedGarrisonMissionList_Update - addon.hooks.GarrisonMissionList_SetTab=GMF.MissionTab.MissionList.SetTab - GMF.MissionTab.MissionList.SetTav=addon.HookedGarrisonMissionList_SetTab -else - addon:SafeRawHook("GarrisonMissionList_Update") - addon:SafeSecureHook("GarrisonMissionList_SetTab") -end +addon.hooks.GarrisonMissionList_Update=GMF.MissionTab.MissionList.Update +GMF.MissionTab.MissionList.Update=addon.HookedGarrisonMissionList_Update +addon.hooks.GarrisonMissionList_SetTab=GMF.MissionTab.MissionList.SetTab +GMF.MissionTab.MissionList.SetTab=addon.HookedGarrisonMissionList_SetTab addon:SafeSecureHook("GarrisonMissionButton_SetRewards") -addon:SafeRawHook("GarrisonMissionButton_OnEnter","ScriptGarrisonMissionButton_OnEnter") -if toc <70000 then - addon:SafeRawHook("GarrisonMissionPageFollowerFrame_OnEnter") -end +--addon:SafeSecureHook("GarrisonMissionButton_OnEnter","ScriptGarrisonMissionButton_OnEnter") +--addon:SecureHook("GarrisonMissionButton_OnEnter","ScriptGarrisonMissionButton_OnEnter") addon:SafeSecureHook(GMF,"SelectTab","GarrisonMissionFrame_SelectTab") addon:SafeRawHookScript(GMF.MissionTab.MissionPage.CloseButton,"OnClick","GarrisonMissionPageOnClose") _G.GarrisonCommander=addon -_G.GAC=addon \ No newline at end of file +_G.GAC=addon diff --git a/Init.lua b/Init.lua index 727da21..9632f75 100644 --- a/Init.lua +++ b/Init.lua @@ -429,3 +429,16 @@ function ns.Configure() end setfenv(2, ENV) end +function addon:EventADDON_LOADED(event,AddOn) +--@debug@ + print(event,AddOn) +--@end-debug@ + if AddOn~="Blizzard_OrderHallUI" then return end + self:UnregisterEvent("ADDON_LOADED") + ns.GHF=_G.OrderHallMissionFrame + ns.GHFMissions=ns.GHF.MissionTab.MissionList + ENV.GHF=ns.GHF + ENV.GHFMissions=ns.GHFMissions + self:GetModule("OrderHall"):OnInitialize() +end + diff --git a/ShipYard.lua b/ShipYard.lua index 4eabdf1..aa02923 100644 --- a/ShipYard.lua +++ b/ShipYard.lua @@ -7,6 +7,7 @@ local addon=addon --#addon local over=over --#over local _G=_G local GSF=GSF +local GSFMissions=GSFMissions local G=C_Garrison local pairs=pairs local format=format @@ -77,6 +78,12 @@ end function module:GetMain() return GSF end +function module:GetMissions() + return GSFMissions +end +function module:GetBigScreen() + return false +end --- --Invoked on every mission display, only for available missions -- @@ -91,10 +98,6 @@ function module:HookedGarrisonShipyardMap_SetupBonus(missionList,frame,mission) if mission.inProgress then return end i=i+1 addendum=CreateFrame("Frame",nil,frame) - if toc < 70000 then - addendum:SetFrameStrata("MEDIUM") - addendum:SetFrameLevel(GSF:GetFrameLevel()+5) - end addendum:SetPoint("TOPLEFT",frame,"TOPRIGHT",-10,-15) AddBackdrop(addendum) -- 1.7.9.5