local me, ns = ... local pp=print local _G=_G ns.Configure() local addon=ns.addon --#addon local factory=addon:GetFactory() local wipe=wipe local pairs=pairs local kpairs=addon:GetKpairs() local tinsert=tinsert local coroutine=coroutine local GetItemInfo=GetItemInfo local GarrisonMissionFrame_SetItemRewardDetails=GarrisonMissionFrame_SetItemRewardDetails local GetItemCount=GetItemCount local strsplit=strsplit local GarrisonFollower_DisplayUpgradeConfirmation=GarrisonFollower_DisplayUpgradeConfirmation local StaticPopup_Show=StaticPopup_Show local CONFIRM_GARRISON_FOLLOWER_UPGRADE=CONFIRM_GARRISON_FOLLOWER_UPGRADE local GameTooltip=GameTooltip local StaticPopupDialogs=StaticPopupDialogs local YES=YES local NO=NO local GARRISON_FOLLOWER_MAX_ITEM_LEVEL=GARRISON_FOLLOWER_MAX_ITEM_LEVEL local ORDER_HALL_MAC_ITEM_LEVEL=900 local module=addon:NewSubClass("FollowerPage") --#module local UIDropDownMenu_SetSelectedID, UIDropDownMenu_Initialize, UIDropDownMenu_CreateInfo,UIDropDownMenu_AddButton =UIDropDownMenu_SetSelectedID,UIDropDownMenu_Initialize, UIDropDownMenu_CreateInfo,UIDropDownMenu_AddButton local UIDropDownMenu_SetWidth,UIDropDownMenu_SetButtonWidth,UIDropDownMenu_JustifyText=UIDropDownMenu_SetWidth,UIDropDownMenu_SetButtonWidth,UIDropDownMenu_JustifyText local UIDropDownMenu_SetText=UIDropDownMenu_SetText function module:ShowImprovements() local scroller=self:GetScroller("Items") scroller:AddRow("Follower Upgrades",C.Orange()) for i,v in pairs(self:GetUpgrades()) do scroller:AddRow(i,C.Yellow()) for itemID,_ in pairs(v) do local b=scroller:AddItem(itemID) b:SetUserData("item",itemID) b:SetCallback("OnEnter",function(this) --@debug@ print("Item:",this:GetUserData("item")) --@end-debug@ GameTooltip:SetOwner(this.frame,"ANCHOR_CURSOR") GameTooltip:AddLine("Reward") GameTooltip:SetItemByID(this:GetUserData("item")) GameTooltip:Show() end) b:SetCallback("OnLeave",function(this) GameTooltip:Hide() end) --@debug@ b:SetCallback("OnClick",function(this) print("Click") end) --@end-debug@ end end scroller:AddRow("Item Tokens",C.Orange()) for i,v in pairs(self:GetItems()) do local b=scroller:AddItem(i) end end local CONFIRM1=L["Upgrading to |cff00ff00%d|r"].."\n" .. CONFIRM_GARRISON_FOLLOWER_UPGRADE local CONFIRM2=L["Upgrading to |cff00ff00%d|r"].."\n|cffffd200 "..L["You are wasting |cffff0000%d|cffffd200 point(s)!!!"].."|r\n" .. CONFIRM_GARRISON_FOLLOWER_UPGRADE local function DoUpgradeFollower(this) G.CastSpellOnFollower(this.data); end local function UpgradeFollower(this) local follower=this:GetParent() local followerID=follower.followerID local upgradelevel=this.rawlevel local genere=this.tipo:sub(1,1) local currentlevel=genere=="w" and follower.ItemWeapon.itemLevel or follower.ItemArmor.itemLevel local name = ITEM_QUALITY_COLORS[G.GetFollowerQuality(followerID)].hex..G.GetFollowerName(followerID)..FONT_COLOR_CODE_CLOSE; local losing=false local upgrade=math.min(upgradelevel>600 and upgradelevel or upgradelevel+currentlevel,GARRISON_FOLLOWER_MAX_ITEM_LEVEL) if upgradelevel > 600 and currentlevel>600 then if (currentlevel > upgradelevel) then losing=upgradelevel - 600 else losing=currentlevel -600 end elseif upgrade > GARRISON_FOLLOWER_MAX_ITEM_LEVEL then losing=(upgrade)-GARRISON_FOLLOWER_MAX_ITEM_LEVEL end if losing then return module:Popup(format(CONFIRM2,upgrade,losing,name),0,DoUpgradeFollower,true,followerID,true) else if addon:GetToggle("NOCONFIRM") then return G.CastSpellOnFollower(followerID); else return module:Popup(format(CONFIRM1,upgrade,name),0,DoUpgradeFollower,true,followerID,true) end end end local colors={ [1]="Yellow", [3]="Uncommon", [6]="Rare", [9]="Epic", [615]="Uncommon", [630]="Rare", [645]="Epic" } function addon:ApplyUPG(value) module:ShowUpgradeButtons() end function addon:ApplySWAPBUTTONS(value) module:ShowUpgradeButtons() end function module:BindingClick(tipo,level) local gf=GMF.FollowerTab if (not gf:IsVisible() or not gf.upgradeButtons) then return end if (not gf.ItemWeapon:IsVisible() or not gf.ItemArmor:IsVisible()) then return end local current=tipo=="w" and gf.ItemWeapon.itemLevel or gf.ItemArmor.itemLevel for _,b in pairs(gf.upgradeButtons) do if b:IsVisible() then print(current,b.tipo,b.Level:GetText(),b.rawLevel) if (tipo==tipo:sub(1,1) and level==b.rawlevel) then b:Click() end else return end end end local upgradeButtons function module:ShowUpgradeButtons(force) if InCombatLockdown() then self:ScheduleLeaveCombatAction("ShowUpgradeButtons",force) return end local gf=GMF.FollowerTab if not self:GetBoolean("UPG") then if not upgradeButtons then return end local b=upgradeButtons for i=1,#b do b[i]:Hide() end return end if (not force and not gf:IsVisible()) then return end if not upgradeButtons then upgradeButtons ={} end --if not gf.upgradeFrame then gf.upgradeFrame=CreateFrame("Frame",nil,gf.model) end local b=upgradeButtons local upgrades=self:GetUpgrades() local axpos=self:GetBoolean("SWAPBUTTONS") and 7 or 243 local wxpos=self:GetBoolean("SWAPBUTTONS") and 243 or 7 local wypos=-85 local aypos=-85 local used=1 if not gf.followerID then return self:DelayedRefresh(0.1) end local followerID=gf.followerID local followerInfo = followerID and G.GetFollowerInfo(followerID); local canUpgrade = followerInfo and followerInfo.isCollected and gf.ItemWeapon.itemLevel + gf.ItemArmor.itemLevel < GARRISON_FOLLOWER_MAX_ITEM_LEVEL * 2 if canUpgrade and (not followerInfo.status or followerInfo.status == GARRISON_FOLLOWER_INACTIVE) and followerInfo.isMaxLevel then ClearOverrideBindings(gf) local binded={} local currentType="" local shown local reuse for i=#upgrades,1,-1 do local tipo,itemID,level=strsplit(":",upgrades[i]) if not b[used] then b[used]=CreateFrame("Button","GCUPGRADES"..used,gf,"GarrisonCommanderUpgradeButton,SecureActionbuttonTemplate") end level=tonumber(level) local A=b[used] local qt=GetItemCount(itemID) --@debug@ print(tipo,level) --@end-debug@ repeat if (qt>0) then A:ClearAllPoints() A.tipo=tipo if tipo ~=currentType then shown=false currentType=tipo end local currentlevel=tipo:sub(1,1)=="w" and gf.ItemWeapon.itemLevel or gf.ItemArmor.itemLevel if currentlevel == GARRISON_FOLLOWER_MAX_ITEM_LEVEL then break end if level > 600 and level <= currentlevel then break -- Pointless item for this toon end if level<600 and level + currentlevel > GARRISON_FOLLOWER_MAX_ITEM_LEVEL then if shown then reuse=true end end if (not binded[tipo]) then binded[tipo]=true local kb=GetBindingKey("GC" .. tipo:upper()) if (kb ) then SetOverrideBindingClick(gf,false,kb,A:GetName()) A.Shortcut:SetText(GetBindingText(kb,"",true)) else A.Shortcut:SetText('') end else A.Shortcut:SetText('') end shown=true if reuse then A=b[used-1] reuse=false else used=used+1 if (tipo:sub(1,1)=="a") then A:SetPoint("TOPLEFT",axpos,aypos) aypos=aypos-45 else A:SetPoint("TOPLEFT",wxpos,wypos) wypos=wypos-45 end end A:SetSize(40,40) A.Icon:SetSize(40,40) A.itemID=itemID GarrisonMissionFrame_SetItemRewardDetails(A) A.rawlevel=level A.Level:SetText(level < 600 and (currentlevel+level) or level) local c=colors[level] A.Level:SetTextColor(C[c]()) A.Quantity:SetFormattedText("%d",qt) A.Quantity:SetTextColor(C.Yellow()) A:SetFrameLevel(20) A.Quantity:Show() A.Level:Show() A:EnableMouse(true) A:RegisterForClicks("LeftButtonDown") A:SetAttribute("type","item") A:SetAttribute("item",select(2,GetItemInfo(itemID))) A:Show() if tipo=="at" or tipo =="wt" then A.Level:Hide() A:SetScript("PostClick",nil) else A.Level:Show() A:SetScript("PostClick",UpgradeFollower) end end until true -- Continue dei poveri end end for i=used,#b do b[i]:Hide() end -- fix Blizzard UI Bug if followerInfo and not followerInfo.isCollected then GarrisonFollowerPage_SetItem(gf.ItemWeapon) GarrisonFollowerPage_SetItem(gf.ItemArmor) end end function module:DelayedRefresh(delay) if GMF.FollowerTab:IsShown() then if not tonumber(delay) then delay=0.5 end return C_Timer.After(delay,function() module:ShowUpgradeButtons() end) end end function module:OnInitialized() self:SafeSecureHookScript("GarrisonMissionFrame","OnShow","Setup") for catId,list in pairs (ns.traitTable) do for abId,_ in pairs(list) do ns.traitTable[catId][abId]=G.GetFollowerAbilityName(abId) end end ns.catTable={ [L["Environment Preference"]]=1, [L["Increased Rewards"]]=2, [L["Mission Duration"]]=3, [L["Mission Success"]]=4, [L["Other"]]=5, [L["Profession"]]=6, [L["Racial Preference"]]=7, [L["Slayer"]]=8, [L["Threat Counter"]]=9, } end function module:Setup() self:RegisterEvent("GARRISON_FOLLOWER_UPGRADED","DelayedRefresh") self:RegisterEvent("CHAT_MSG_LOOT","DelayedRefresh") --@debug@ self:GarrisonTraitCountersFrame_OnLoad(GarrisonTraitCountersFrame, L["%s |4follower:followers; with %s"] .. " (%d)") --@end-debug@ --[===[@non-debug@ self:GarrisonTraitCountersFrame_OnLoad(GarrisonTraitCountersFrame, L["%s |4follower:followers; with %s"]) --@end-non-debug@]===] self:SafeSecureHookScript(GarrisonTraitCountersFrame,"OnEvent","GarrisonTraitCountersFrame_OnEvent") self:SafeSecureHookScript(GarrisonTraitCountersFrame,"OnShow","GarrisonTraitCountersFrame_OnShow") self:ShowUpgradeButtons() end function module:Cleanup() self:UnregisterAllEvents() end --[[ --]] local list={} local chooser local function sel(this,category,categoryId) --UIDropDownMenu_SetSelectedID(chooser,index) module:FillCounters(chooser:GetParent(),categoryId) UIDropDownMenu_SetText(chooser,category) end function module:GarrisonTraitCountersFrame_OnLoad(this, tooltipString) this:ClearAllPoints() this:SetParent(GarrisonThreatCountersFrame:GetParent()) this:SetPoint("BOTTOMLEFT",185,0) this:Show() this.tooltipString = tooltipString; if not this.choice then this.choice=CreateFrame('Frame',this:GetName()..'Choice',this,"UIDropDownMenuTemplate") this.choice.button=_G[this.choice:GetName()..'Button'] chooser=this.choice this.choice:SetPoint("TOPLEFT",-192,0) end this.TraitsList[1]:SetScript("OnEnter",_G.GarrisonTraitCounter_OnEnter) --this.TraitsList[1]:SetScript("OnEnter",pp) local startcat="" do local frame=this.choice if #list > 0 then wipe(list) end local done local i=0 print("Using",kpairs) for k,v in kpairs(ns.catTable) do if not done then done=true module:FillCounters(this,v) startcat=k end if ns.traitTable[v] then i=i+1 tinsert(list,{text=k,value=v,func=sel,arg1=k,arg2=v,notCheckable=true}) end end done=nil frame.button:SetScript("OnClick",function() EasyMenu(list,frame,this,-180,-7,nil,5) end ) --EasyMenu(list,frame,this,0,0,nil,5) UIDropDownMenu_SetWidth(frame, 150); UIDropDownMenu_SetButtonWidth(frame, 174) UIDropDownMenu_SetText(frame,startcat) UIDropDownMenu_JustifyText(frame, "LEFT") end this:RegisterEvent("GARRISON_FOLLOWER_LIST_UPDATE"); end function module:GarrisonTraitCountersFrame_OnEvent(this, event, ...) if ( this:IsVisible() ) then self:GarrisonTraitCountersFrame_OnShow(this); end end function module:GarrisonTraitCountersFrame_OnShow(this) for i = 1, #this.TraitsList do local t=addon:GetFollowersWithTrait(this.TraitsList[i].id) local n=t and #t or 0 this.TraitsList[i].Count:SetText(n); end end ---@function [parent=#addon] GarrisonTraitCounter_OnEnter -- Need to be a global function _G.GarrisonTraitCounter_OnEnter(this) GameTooltip:SetOwner(this, "ANCHOR_RIGHT"); GameTooltip:SetText(this:GetParent().tooltipString:format(this.Count:GetText(), this.name,this.id) , nil, nil, nil, nil, true); end function module:FillCounters(this,category) local i=0 for id,name in pairs(ns.traitTable[category]) do i=i+1 local frame = this.TraitsList[i]; local offset=(ns.bigscreen and 22 or 17) if ( not frame ) then frame = CreateFrame("Button", nil, this, "GarrisonTraitCounterTemplate"); frame:SetPoint("LEFT", this.TraitsList[i-1], "RIGHT", 14, 0); frame:SetScript("OnEnter",GarrisonTraitCounter_OnEnter) this.TraitsList[i] = frame; end frame.Icon:SetTexture(G.GetFollowerAbilityIcon(id)) frame.name = name; frame.id = id; frame:Show() end self:GarrisonTraitCountersFrame_OnShow(GarrisonTraitCountersFrame) for j=i+1,#this.TraitsList do this.TraitsList[j]:Hide() end end -- Binding descriptions _G.BINDING_HEADER_GCFOLLOWER="Garrison Commander - Follower Page" for _,v in pairs(addon:GetUpgrades()) do local t,_,l=strsplit(':',v) t=t:upper() l=tonumber(l) local keyname="BINDING_NAME_GC"..t..l if (l<600) then _G[keyname]= format(L["Add %1$d levels to %2$s"],l,(t:sub(1,1)=="W" and "weapon" or "armor")) else _G[keyname]= format(L["Upgrade %1$s to %2$d itemlevel"],(t:sub(1,1)=="W" and "weapon" or "armor"),l) end end _G.BINDING_NAME_GCWE=L["Applies the best weapon upgrade"] _G.BINDING_NAME_GCAE=L["Applies the best armor upgrade"] _G.BINDING_NAME_GCWF=L["Applies the best weapon set"] _G.BINDING_NAME_GCAF=L["Applies the best armor set"] _G.BINDING_NAME_GCWT=L["Uses weapon token"] _G.BINDING_NAME_GCAT=L["Uses armor token"]