You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

438 lines
12 KiB

3 years ago
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,
4 years ago
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",
control = "WeakAurasSpinBox",
width = WeakAuras.normalWidth,
name = L["Animation Sequence"],
min = 0,
4 years ago
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",
control = "WeakAurasSpinBox",
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",
control = "WeakAurasSpinBox",
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",
control = "WeakAurasSpinBox",
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",
control = "WeakAurasSpinBox",
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",
control = "WeakAurasSpinBox",
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",
control = "WeakAurasSpinBox",
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",
control = "WeakAurasSpinBox",
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",
control = "WeakAurasSpinBox",
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",
control = "WeakAurasSpinBox",
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",
control = "WeakAurasSpinBox",
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",
control = "WeakAurasSpinBox",
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 not WeakAuras.IsClassic() 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
-- Duplicated because Private does not exist when we want to create the first thumnail
local function ModelSetTransformFixed(self, tx, ty, tz, rx, ry, rz, s)
-- In Dragonflight the api changed, this converts to the new api
self:SetTransform(CreateVector3D(tx, ty, tz), CreateVector3D(rx, ry, rz), -s)
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.SetTransformFixed = model.GetResizeBounds and ModelSetTransformFixed or model.SetTransform -- TODO change test to WeakAuras.IsWrathOrRetail() after 3.4.1 release
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:SetTransformFixed(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:SetTransformFixed(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
OptionsPrivate.registerRegions = OptionsPrivate.registerRegions or {}
table.insert(OptionsPrivate.registerRegions, function()
OptionsPrivate.Private.RegisterRegionOptions("model", createOptions, createIcon, L["Model"], createThumbnail, modifyThumbnail,
L["Shows a 3D model from the game files"], templates);
end)