local _,rematch = ... local L = rematch.localization local C = rematch.constants local settings = rematch.settings rematch.loadedTargetPanel = rematch.frame.LoadedTargetPanel rematch.frame:Register("loadedTargetPanel") rematch.events:Register(rematch.loadedTargetPanel,"PLAYER_LOGIN",function(self) self.BigLoadSaveButton.Text:SetFontObject(GameFontNormal) self.MediumLoadButton.Text:SetFontObject(GameFontNormal) self.MediumLoadButton:SetText(L["Load"]) self.SmallRandomButton.tooltipTitle = L["Load Random Pets"] self.SmallRandomButton.tooltipBody = L["Load a set of random high level pets. If the recent target's pets are known, random pets are preferred if they are strong vs and tough vs the opponent pets."] self.SmallTeamsButton.tooltipTitle = L["Edit Target"] self.SmallTeamsButton.tooltipBody = L["Add or remove teams from this target, or change the order of teams for this target."] self.SmallSaveButton.tooltipTitle = L["Save New Team"] self.SmallSaveButton.tooltipBody = L["Create a new team for this target with the currently loaded pets."] end) function rematch.loadedTargetPanel:Configure() if rematch.layout:GetSubview()=="target" then -- in a "mini" target view like minimized or one- or two-panel view self.Badge:Hide() self.Name:Hide() self.Underline:Hide() self.ClearButton:Hide() -- if mini target panel being shown, then switch to current npcID instead of recent target in bigger target panel self.blingNextUpdate = true -- always bling when mini target panel shown rematch.targetInfo.recentTarget = rematch.targetInfo.currentTarget else self.Badge:Show() self.Name:Show() self.Underline:Show() end end function rematch.loadedTargetPanel:Update() if self.npcID ~= rematch.targetInfo.recentTarget or not self.teamIndex then self.teamIndex = 1 -- if target has changed, reset teamIndex to first team of a target end self.npcID = rematch.targetInfo.recentTarget self.teamID = nil -- FillAllyTeam will set this local isMini = rematch.layout:GetSubview()=="target" local right = -8 -- offset from right for name/underline/clear -- for both mini targets and normal, display portrait if there's a recent target if self.npcID then local targetNpcID = UnitExists("target") and rematch.targetInfo:GetUnitNpcID("target") if targetNpcID and targetNpcID==self.npcID then -- we are actually targeting this, use unit portrait self.Portrait.npcID = self.npcID SetPortraitTexture(self.Portrait.Texture,"target") elseif self.Portrait.npcID~=self.npcID then -- otherwise use displayID portrait from the npcID if not actual recent target (that's already drawn) local displayID = rematch.targetInfo:GetNpcDisplayID(self.npcID) if displayID then SetPortraitTextureFromCreatureDisplayID(self.Portrait.Texture,displayID) end end self.Portrait:Show() local isSaved = rematch.savedTargets[self.npcID] local isWild = rematch.targetInfo:IsWildPet(self.npcID) local isNotable = rematch.targetInfo:IsNotable(self.npcID) or isWild if isMini then -- the mini target panel only displays ally team regardless if there's an enemy to show (no room) self.EnemyTeam:Hide() self.AllyTeam:SetPoint("LEFT",self.Portrait,"RIGHT",22,0) self.AllyTeam:Show() self:FillAllyTeam() elseif not isSaved and not isNotable then self.EnemyTeam:Hide() self.AllyTeam:Hide() elseif not isSaved and isNotable then self.EnemyTeam:Show() self.AllyTeam:Hide() self:FillEnemyTeam() elseif isSaved and not isNotable then self.EnemyTeam:Hide() self.AllyTeam:SetPoint("LEFT",self.Portrait,"RIGHT",22,0) self.AllyTeam:Show() self:FillAllyTeam() elseif isSaved and isNotable then self.EnemyTeam:Show() self.AllyTeam:SetPoint("LEFT",self.EnemyTeam,"RIGHT",20,0) self.AllyTeam:Show() self:FillEnemyTeam() self:FillAllyTeam() end -- display buttons based on whether target is notable or saved if isMini then -- for mini target panel which only displays for targets with a saved team, just show big load button self.BigLoadSaveButton:Show() self:SetBigLoadSaveButton(C.BUTTON_MODE_LOAD) self.MediumLoadButton:Hide() self.SmallRandomButton:Hide() self.SmallTeamsButton:Hide() self.SmallSaveButton:Hide() elseif not isSaved then -- if not saved, notable or not, show big save button and small teams button self.MediumLoadButton:Hide() self.SmallSaveButton:Hide() self.BigLoadSaveButton:Show() self:SetBigLoadSaveButton(C.BUTTON_MODE_SAVE) self.SmallRandomButton:Show() self.SmallTeamsButton:Show() self.SmallRandomButton:SetPoint("TOPRIGHT",-3,-3) right = right - (24-3) - (24-2) elseif not isNotable then -- if saved and not notable, big load button and two small save and teams button in topright self.MediumLoadButton:Hide() self.BigLoadSaveButton:Show() self:SetBigLoadSaveButton(C.BUTTON_MODE_LOAD) self.SmallRandomButton:Show() self.SmallTeamsButton:Show() self.SmallRandomButton:SetPoint("TOPRIGHT",-3,-3) self.SmallSaveButton:Show() right = right - (24-3) - (24-2) - (24-2) elseif isNotable then -- if saved and notable, then medium load button and two small save and teams buttons self.BigLoadSaveButton:Hide() self.MediumLoadButton:Show() self.SmallRandomButton:Show() self.SmallTeamsButton:Show() self.SmallRandomButton:SetPoint("TOPRIGHT",self.MediumLoadButton,"TOPLEFT",2,0) self.SmallSaveButton:Show() right = right - (24-3) - (24-2) - (24-2) - (68-2) end else self.Portrait:Hide() self.BigLoadSaveButton:Hide() self.MediumLoadButton:Hide() self.SmallSaveButton:Hide() self.SmallTeamsButton:Hide() self.SmallRandomButton:Hide() self.AllyTeam:Hide() self.EnemyTeam:Hide() end -- if an expanded view, update name and top matter if not isMini then self.Name:SetPoint("TOPRIGHT",right-14,-8) self.Underline:SetPoint("TOPRIGHT",right,-22) self.ClearButton:SetPoint("TOPRIGHT",right+2,-4) if self.npcID then self.Name:SetText(rematch.utils:GetFormattedTargetName(self.npcID)) self.ClearButton:Show() else self.Name:SetText(L["No Target"]) self.Portrait:Hide() self.ClearButton:Hide() end end -- finally, if blingNextUpdate is true, then bling the target if self.blingNextUpdate then self.Bling:Show() self.blingNextUpdate = nil end end -- for the shared load/save button, set for loading or saving function rematch.loadedTargetPanel:SetBigLoadSaveButton(mode) local button = self.BigLoadSaveButton button.mode = mode if mode==C.BUTTON_MODE_LOAD then button:SetText(L["Load"]) button.tooltipTitle = L["Load Team"] button.tooltipBody = L["Load the team saved to this target."] elseif mode==C.BUTTON_MODE_SAVE then button:SetText(L["Save"]) button.tooltipTitle = L["Save New Team"] button.tooltipBody = L["Create a new team for this target with the currently loaded pets."] end end -- fills the enemy team with the target's pets, there can be 1 to 3 of them if this is called function rematch.loadedTargetPanel:FillEnemyTeam() local npcID = self.npcID local numPets = rematch.targetInfo:GetNumPets(npcID) -- team border local coords = C.PET_BORDER_TEXCOORDS[C.TEAM_SIZE_NORMAL][numPets] if coords then self.EnemyTeam.Border:SetTexCoord(coords[1],coords[2],coords[3],coords[4]) self.EnemyTeam:SetSize(coords[5],coords[6]) end -- fill pets local pets = rematch.targetInfo:GetNpcPets(npcID) for i,petID in ipairs(pets) do local petInfo = rematch.petInfo:Fetch(petID) self.EnemyTeam.Pets[i].petID = petID self.EnemyTeam.Pets[i]:SetTexture(petInfo.icon) self.EnemyTeam.Pets[i]:SetDesaturated(false) self.EnemyTeam.Pets[i]:Show() end for i=#pets+1,3 do self.EnemyTeam.Pets[i]:Hide() end end -- fills the ally team with the user's pets from the team of the current teamIndex function rematch.loadedTargetPanel:FillAllyTeam() local npcID = self.npcID local teams = rematch.savedTargets[npcID] if teams and #teams>0 then self.teamIndex = max(1,min(self.teamIndex,#teams)) -- handle prev/next buttons self.AllyTeam.PrevTeamButton:SetShown(#teams>1) self.AllyTeam.NextTeamButton:SetShown(#teams>1) self.AllyTeam.PrevTeamButton:SetEnabled(self.teamIndex~=1) self.AllyTeam.NextTeamButton:SetEnabled(self.teamIndex~=#teams) -- team border local coords = C.PET_BORDER_TEXCOORDS[C.TEAM_SIZE_NORMAL][3] -- user teams always have 3 pets (even if not all valid) self.AllyTeam.Border:SetTexCoord(coords[1],coords[2],coords[3],coords[4]) self.AllyTeam:SetSize(coords[5],coords[6]) -- fill pets self.teamID = teams[self.teamIndex] local team = rematch.savedTeams[self.teamID] for i,petID in ipairs(team.pets) do local petInfo = rematch.petInfo:Fetch(petID) self.AllyTeam.Pets[i].teamID = self.teamID self.AllyTeam.Pets[i].petID = petID self.AllyTeam.Pets[i]:SetTexture(petInfo.icon) self.AllyTeam.Pets[i]:SetDesaturated(petInfo.idType=="species") self.AllyTeam.Pets[i]:Show() if petInfo.isDead then self.AllyTeam.Status[i]:SetTexCoord(0,0.3125,0,0.625) self.AllyTeam.Status[i]:Show() elseif petInfo.isInjured then self.AllyTeam.Status[i]:SetTexCoord(0.3125,0.625,0,0.625) self.AllyTeam.Status[i]:Show() else self.AllyTeam.Status[i]:Hide() end end end end function rematch.loadedTargetPanel:OnShow() rematch.events:Register(self,"REMATCH_TARGET_CHANGED",self.SetTarget) end function rematch.loadedTargetPanel:OnHide() rematch.events:Unregister(self,"REMATCH_TARGET_CHANGED") end -- if npcID is nill, set to current target; otherwise set to given npcID function rematch.loadedTargetPanel:SetTarget(npcID,bling) if not npcID then -- if no npcID given this was likely from a targeting change, show team's pets first npcID = rematch.targetInfo.currentTarget else -- if npcID given this is likely from the targetsPanel, show target's pets first if type(npcID)=="string" then npcID = rematch.targetInfo:GetNpcID(npcID) -- if "target:123", get the numeric npcID end end if npcID then rematch.targetInfo:SetRecentTarget(npcID) end -- if settarget wanted to bling (from targetsPanel list) or this is a target with a saved team, bling it if bling or rematch.savedTargets[npcID] then self.blingNextUpdate = true end self:Update() if rematch.targetsPanel:IsVisible() then rematch.targetsPanel:Update() end end -- use this to clear target (SetTarget(nil) will just pick up current target) function rematch.loadedTargetPanel:ClearTarget() rematch.targetInfo:SetRecentTarget(nil) self:Update() end -- for target subviews, target should only be shown if the target has a saved team function rematch.loadedTargetPanel:ShouldShowTarget() local npcID = UnitExists("target") and rematch.targetInfo:GetUnitNpcID("target") if npcID and rematch.savedTargets[npcID] then local teams = rematch.savedTargets[npcID] if #teams==1 and teams[1]==settings.currentTeamID then return false -- if this target has one team that's already loaded, don't show target else return true -- if this target has more than one team or it's not already loaded, show target end end return false end function rematch.loadedTargetPanel.ClearButton:OnClick() self:GetParent():ClearTarget() end function rematch.loadedTargetPanel.AllyTeam.PrevTeamButton:OnClick() self:GetParent():GetParent().teamIndex = self:GetParent():GetParent().teamIndex - 1 self:GetParent():GetParent():Update() end function rematch.loadedTargetPanel.AllyTeam.NextTeamButton:OnClick() self:GetParent():GetParent().teamIndex = self:GetParent():GetParent().teamIndex + 1 self:GetParent():GetParent():Update() end -- click of the big load (or save) button function rematch.loadedTargetPanel.BigLoadSaveButton:OnClick(button) local teamID = self:GetParent().teamID if self.mode==C.BUTTON_MODE_LOAD and teamID then rematch.loadTeam:LoadTeamID(self:GetParent().teamID) elseif self.mode==C.BUTTON_MODE_SAVE then rematch.loadedTargetPanel:SaveTeamForNpcID(self:GetParent().npcID) end end -- click of the smaller load button function rematch.loadedTargetPanel.MediumLoadButton:OnClick(button) rematch.loadTeam:LoadTeamID(self:GetParent().teamID) end -- click of green paw to set teams for the target function rematch.loadedTargetPanel.SmallTeamsButton:OnClick(button) local npcID = self:GetParent().npcID if npcID then rematch.targetMenu:SetTeams(npcID) end end function rematch.loadedTargetPanel.SmallRandomButton:OnClick(button) local npcID = self:GetParent().npcID if npcID then rematch.randomPets:BuildCounterTeam(npcID) rematch.loadTeam:LoadTeamID("counter") end end function rematch.loadedTargetPanel.SmallSaveButton:OnClick(button) rematch.loadedTargetPanel:SaveTeamForNpcID(self:GetParent().npcID) end function rematch.loadedTargetPanel:SaveTeamForNpcID(npcID) if npcID then rematch.saveDialog:SidelineLoadouts() rematch.savedTeams.sideline.name = rematch.savedTeams:GetUniqueName(rematch.targetInfo:GetNpcName(npcID)) rematch.savedTeams.sideline.targets = {npcID} rematch.dialog:ShowDialog("SaveTeam",{saveMode=C.SAVE_MODE_SAVEAS}) end end