If you make an addon of the following code (can use https://addon.bool.no/ to do it easily):
Code: Select all
-- starting background color
local backColor = {r=0.1,g=0.1,b=0.1}
-- create a dialog type frame with titlebar and close button
local f = CreateFrame("Frame","PetViewer",UIParent,"BasicFrameTemplate")
f:SetSize(300,300)
f:SetPoint("CENTER")
f:SetFlattensRenderLayers(true)
f:Hide()
-- add an inset that takes up most of the frame with a solid color background
f.Inset = CreateFrame("Frame",nil,f,"InsetFrameTemplate")
f.Inset.Bg:SetColorTexture(backColor.r,backColor.g,backColor.b)
f.Inset:SetPoint("TOPLEFT",6,-28)
f.Inset:SetPoint("BOTTOMRIGHT",-10,30)
f.Inset:SetFrameStrata("HIGH")
-- add a model that fills the inset
f.ModelScene = CreateFrame("ModelScene",nil,f.Inset,"ReversedLightingModelSceneMixinTemplate")
f.ModelScene:SetPoint("TOPLEFT",4,-4)
f.ModelScene:SetPoint("BOTTOMRIGHT",-4,4)
-- make frame movable
f:SetMovable(true)
f:SetScript("OnMouseDown",function(self) self:StartMoving() end)
f:SetScript("OnMouseUp",function(self) self:StopMovingOrSizing() end)
-- create resize grip in bottomright corner to resize frame
f:SetResizable(true)
f:SetMinResize(200,100)
f.Resize = CreateFrame("Button",nil,f)
f.Resize:SetSize(16,16)
f.Resize:SetPoint("BOTTOMRIGHT",-4,2)
f.Resize:SetNormalTexture("Interface\\ChatFrame\\UI-ChatIM-SizeGrabber-Up")
f.Resize:SetPushedTexture("Interface\\ChatFrame\\UI-ChatIM-SizeGrabber-Down")
f.Resize:SetHighlightTexture("Interface\\ChatFrame\\UI-ChatIM-SizeGrabber-Highlight")
f.Resize:SetScript("OnMouseDown",function(self) self:GetParent():StartSizing() end)
f.Resize:SetScript("OnMouseUp",function(self) self:GetParent():StopMovingOrSizing() end)
-- create ridiculously overkill color swatch to choose a background color
f.ColorSwatch = CreateFrame("Button",nil,f)
f.ColorSwatch:SetSize(20,20)
f.ColorSwatch:SetPoint("BOTTOMLEFT",6,6)
f.ColorSwatch:SetNormalTexture("Interface\\Common\\RingBorder")
f.ColorSwatch:SetPushedTexture("Interface\\Common\\RingBorder")
local pushed = PetViewer.ColorSwatch:GetPushedTexture()
pushed:SetPoint("TOPLEFT",1,-1)
pushed:SetPoint("BOTTOMRIGHT",-1,1)
f.ColorSwatch:SetHighlightTexture("Interface\\Common\\CommonRoundHighlight")
f.ColorSwatch.Color = f.ColorSwatch:CreateTexture(nil,"BACKGROUND")
f.ColorSwatch.Color:SetPoint("TOPLEFT",3,-3)
f.ColorSwatch.Color:SetPoint("BOTTOMRIGHT",-3,3)
f.ColorSwatch.Color:SetColorTexture(backColor.r,backColor.g,backColor.b)
-- set the background color to what's chosen (or cancelled) in color picker
local function setBackgroundColor(r,g,b)
backColor.r,backColor.g,backColor.b = r,g,b
f.Inset.Bg:SetColorTexture(r,g,b)
f.ColorSwatch.Color:SetColorTexture(r,g,b)
end
-- click of color swatch summons a color picker to change the background color
f.ColorSwatch:SetScript("OnClick",function(self,...)
local oldR,oldG,oldB = backColor.r,backColor.g,backColor.b
ColorPickerFrame:SetColorRGB(backColor.r,backColor.g,backColor.b)
ColorPickerFrame.hasOpacity = false
ColorPickerFrame.func = function() setBackgroundColor(ColorPickerFrame:GetColorRGB()) end
ColorPickerFrame.cancelFunc = function() setBackgroundColor(oldR,oldG,oldB) end
ColorPickerFrame:Show()
end)
-- create editbox to enter a speciesID and move up/down values (can mousewheel too!)
f.SpeciesInput = CreateFrame("EditBox",nil,f,"NumericInputSpinnerTemplate")
f.SpeciesInput:SetMaxLetters(5)
f.SpeciesInput:SetJustifyH("CENTER")
f.SpeciesInput:SetSize(64,20)
f.SpeciesInput:SetPoint("BOTTOM",0,6)
-- changing text in editbox will update displayed pet
f.SpeciesInput:HookScript("OnTextChanged", function(self,...)
local speciesID = speciesID and tonumber(speciesID) or tonumber(f.SpeciesInput:GetText() or "")
if speciesID then
local name,_,_,_,_,_,_,_,_,_,_,displayID = C_PetJournal.GetPetInfoBySpeciesID(speciesID)
if name and displayID then
f.TitleText:SetText(name)
local cardModelSceneID, loadoutModelSceneID = C_PetJournal.GetPetModelSceneInfoBySpeciesID(speciesID)
f.ModelScene:TransitionToModelSceneID(loadoutModelSceneID, CAMERA_TRANSITION_TYPE_IMMEDIATE, CAMERA_MODIFICATION_TYPE_DISCARD, true)
local battlePetActor = f.ModelScene:GetActorByTag("pet")
battlePetActor:SetModelByCreatureDisplayID(displayID)
battlePetActor:SetAnimationBlendOperation(LE_MODEL_BLEND_OPERATION_NONE)
f.ModelScene:Show()
return
end
end
-- if reached here, then pet was not valid
f.TitleText:SetText("Invalid SpeciesID")
f.ModelScene:Hide()
end)
-- create slash commands /petviewier <speciesID> and /pv <speciesID>
SlashCmdList["PETVIEWER"] = function(msg)
if tonumber(msg or "") then
f.SpeciesInput:SetText(msg)
end
f:Show()
end
SLASH_PETVIEWER1 = "/petviewer"
SLASH_PETVIEWER2 = "/pv"
You can enter a speciesID (for instance, 244 is the Core Hound Pup above, 42 is Black Tabby Cat, etc.) to go directly to a pet. (Can do /petviewer 42 or /pv 42 also.) Or use the buttons (or mousewheel over the number) to scroll forward/back to find pets without knowing their speciesID.
The window is resizable and there's a color swatch in the lower left to change the background color.
If anyone wants to turn this into a real addon and post it someplace you're welcome to it. All code I post on forums like this I release to the wild.