if not WeakAuras.IsLibsOK() then return end local AddonName, OptionsPrivate = ... local L = WeakAuras.L; local function createOptions(id, data) local options = { __title = L["Model Settings"], __order = 1, modelIsUnit = { type = "toggle", width = WeakAuras.normalWidth, name = L["Show model of unit "], order = 0.5, hidden = function() return data.modelDisplayInfo and WeakAuras.BuildInfo > 80100 end }, -- Option for modelIsDisplayInfo added below -- Option for path/id added below chooseModel = { type = "execute", width = 0.15, name = L["Choose"], order = 2, func = function() OptionsPrivate.OpenModelPicker(data, {}); end, disabled = function() return data.modelIsUnit or (WeakAuras.BuildInfo > 80100 and data.modelDisplayInfo) end, imageWidth = 24, imageHeight = 24, control = "WeakAurasIcon", image = "Interface\\AddOns\\WeakAuras\\Media\\Textures\\browse", }, advance = { type = "toggle", width = WeakAuras.normalWidth, name = L["Animate"], order = 5, }, sequence = { type = "range", width = WeakAuras.normalWidth, name = L["Animation Sequence"], min = 0, softMax = 1499, step = 1, bigStep = 1, order = 6, disabled = function() return not data.advance end }, api = { type = "toggle", name = L["Use SetTransform"], order = 7, width = WeakAuras.normalWidth }, portraitZoom = { type = "toggle", width = WeakAuras.normalWidth, name = L["Portrait Zoom"], order = 8, }, -- old settings model_z = { type = "range", width = WeakAuras.normalWidth, name = L["Z Offset"], softMin = -20, softMax = 20, step = .001, bigStep = 0.05, order = 20, hidden = function() return data.api end }, model_x = { type = "range", width = WeakAuras.normalWidth, name = L["X Offset"], softMin = -20, softMax = 20, step = .001, bigStep = 0.05, order = 30, hidden = function() return data.api end }, model_y = { type = "range", width = WeakAuras.normalWidth, name = L["Y Offset"], softMin = -20, softMax = 20, step = .001, bigStep = 0.05, order = 40, hidden = function() return data.api end }, rotation = { type = "range", width = WeakAuras.normalWidth, name = L["Rotation"], min = 0, max = 360, step = 1, bigStep = 3, order = 45, hidden = function() return data.api end }, -- New Settings model_st_tx = { type = "range", width = WeakAuras.normalWidth, name = L["X Offset"], softMin = -1000, softMax = 1000, step = 1, bigStep = 5, order = 20, hidden = function() return not data.api end }, model_st_ty = { type = "range", width = WeakAuras.normalWidth, name = L["Y Offset"], softMin = -1000, softMax = 1000, step = 1, bigStep = 5, order = 21, hidden = function() return not data.api end }, model_st_tz = { type = "range", width = WeakAuras.normalWidth, name = L["Z Offset"], softMin = -1000, softMax = 1000, step = 1, bigStep = 5, order = 22, hidden = function() return not data.api end }, model_st_rx = { type = "range", width = WeakAuras.normalWidth, name = L["X Rotation"], min = 0, max = 360, step = 1, bigStep = 3, order = 23, hidden = function() return not data.api end }, model_st_ry = { type = "range", width = WeakAuras.normalWidth, name = L["Y Rotation"], min = 0, max = 360, step = 1, bigStep = 3, order = 24, hidden = function() return not data.api end }, model_st_rz = { type = "range", width = WeakAuras.normalWidth, name = L["Z Rotation"], min = 0, max = 360, step = 1, bigStep = 3, order = 25, hidden = function() return not data.api end }, model_st_us = { type = "range", width = WeakAuras.normalWidth, name = L["Scale"], min = 5, max = 1000, step = 0.1, bigStep = 5, order = 26, hidden = function() return not data.api end }, endHeader = { type = "header", order = 100, name = "", }, }; if WeakAuras.BuildInfo > 80100 then options.modelDisplayInfo = { type = "toggle", width = WeakAuras.normalWidth, name = L["Use Display Info Id"], order = 0.6, hidden = function() return data.modelIsUnit end } options.model_fileId = { type = "input", width = WeakAuras.doubleWidth - 0.15, name = L["Model"], order = 1 } else options.model_path = { type = "input", width = WeakAuras.doubleWidth - 0.15, name = L["Model"], order = 1 } end for k, v in pairs(OptionsPrivate.commonOptions.BorderOptions(id, data, nil, nil, 70)) do options[k] = v end return { model = options, position = OptionsPrivate.commonOptions.PositionOptions(id, data, nil, nil, nil), }; end local function createThumbnail() local borderframe = CreateFrame("Frame", nil, UIParent); borderframe:SetWidth(32); borderframe:SetHeight(32); local border = borderframe:CreateTexture(nil, "Overlay"); border:SetAllPoints(borderframe); border:SetTexture("Interface\\BUTTONS\\UI-Quickslot2.blp"); border:SetTexCoord(0.2, 0.8, 0.2, 0.8); local model = CreateFrame("PlayerModel", nil, borderframe); borderframe.model = model; model:SetFrameStrata("FULLSCREEN"); return borderframe; end local function modifyThumbnail(parent, region, data) region:SetParent(parent) local model = region.model model:SetAllPoints(region); model:SetFrameStrata(region:GetParent():GetFrameStrata()); model:SetWidth(region:GetWidth() - 2); model:SetHeight(region:GetHeight() - 2); model:SetPoint("center", region, "center"); WeakAuras.SetModel(model, data.model_path, data.model_fileId, data.modelIsUnit, data.modelDisplayInfo) model:SetScript("OnShow", function() WeakAuras.SetModel(model, data.model_path, data.model_fileId, data.modelIsUnit, data.modelDisplayInfo) model:SetPortraitZoom(data.portraitZoom and 1 or 0) if (data.api) then model:SetTransform(data.model_st_tx / 1000, data.model_st_ty / 1000, data.model_st_tz / 1000, rad(data.model_st_rx), rad(data.model_st_ry), rad(data.model_st_rz), data.model_st_us / 1000); else model:ClearTransform(); model:SetPosition(data.model_z, data.model_x, data.model_y); model:SetFacing(rad(data.rotation)); end end); if (data.api) then model:SetTransform(data.model_st_tx / 1000, data.model_st_ty / 1000, data.model_st_tz / 1000, rad(data.model_st_rx), rad(data.model_st_ry), rad(data.model_st_rz), data.model_st_us / 1000); else model:SetPosition(data.model_z, data.model_x, data.model_y); model:SetFacing(rad(data.rotation)); end end local function createIcon() local data = { model_path = "spells/arcanepower_state_chest.m2", -- arthas is not a thing on classic model_fileId = "122968", -- Creature/Arthaslichking/arthaslichking.m2 modelIsUnit = false, model_x = 0, model_y = 0, model_z = 0.35, sequence = 1, advance = false, rotation = 0, scale = 1, height = 40, width = 40 }; local thumbnail = createThumbnail(); modifyThumbnail(UIParent, thumbnail, data); return thumbnail; end local templates = { { title = L["Default"], data = { }; } } if WeakAuras.IsRetail() then tinsert(templates, { title = L["Fire Orb"], description = "", data = { width = 100, height = 100, model_path = "spells/6fx_smallfire.m2", model_fileId = "937416", -- spells/6fx_smallfire.m2 model_x = 0, model_y = -0.5, model_z = -1.5 }, }) tinsert(templates, { title = L["Blue Sparkle Orb"], description = "", data = { width = 100, height = 100, advance = true, sequence = 1, model_path = "spells/7fx_druid_halfmoon_missile.m2", model_fileId = "1322288", -- spells/7fx_druid_halfmoon_missile.m2 model_x = 0, model_y = 0.7, model_z = 1.5 }, }) tinsert(templates, { title = L["Arcane Orb"], description = "", data = { width = 100, height = 100, advance = true, sequence = 1, model_path = "spells/proc_arcane_impact_low.m2", model_fileId = "1042743", -- spells/proc_arcane_impact_low.m2 model_x = 0, model_y = 0.8, model_z = 2 }, }) tinsert(templates, { title = L["Orange Rune"], description = "", data = { width = 100, height = 100, advance = true, sequence = 1, model_path = "spells/7fx_godking_orangerune_state.m2", model_fileId = "1307356", -- spells/7fx_godking_orangerune_state.m2 }, }) tinsert(templates, { title = L["Blue Rune"], description = "", data = { width = 100, height = 100, advance = true, sequence = 1, model_path = "spells/7fx_godking_bluerune_state.m2", model_fileId = "1307354", -- spells/7fx_godking_bluerune_state.m2 } }) tinsert(templates, { title = L["Yellow Rune"], description = "", data = { width = 100, height = 100, advance = true, sequence = 1, model_path = "spells/7fx_godking_yellowrune_state.m2", model_fileId = "1307358", -- spells/7fx_godking_yellowrune_state.m2 } }) tinsert(templates, { title = L["Purple Rune"], description = "", data = { width = 100, height = 100, advance = true, sequence = 1, model_path = "spells/7fx_godking_purplerune_state.m2", model_fileId = "1307355", -- spells/7fx_godking_purplerune_state.m2 } }) tinsert(templates, { title = L["Green Rune"], description = "", data = { width = 100, height = 100, advance = true, sequence = 1, model_path = "spells/7fx_godking_greenrune_state.m2", model_fileId = "1307357", -- spells/7fx_godking_greenrune_state.m2 } }) end WeakAuras.RegisterRegionOptions("model", createOptions, createIcon, L["Model"], createThumbnail, modifyThumbnail, L["Shows a 3D model from the game files"], templates);