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.
2005 lines
59 KiB
2005 lines
59 KiB
local _, addon = ...
|
|
|
|
local SetModelLight = addon.TransitionAPI.SetModelLight;
|
|
|
|
|
|
local DataAPI;
|
|
local GetItemName, GetSourceID, IsItemValidForTryOn;
|
|
|
|
local MainFrame, HomePage, FavButton;
|
|
|
|
local PI = 3.1416 --math.pi;
|
|
local floor = math.floor;
|
|
local tinsert = table.insert;
|
|
local tremove = table.remove;
|
|
local type = type;
|
|
local After = C_Timer.After;
|
|
local FadeFrame = NarciFadeUI.Fade;
|
|
local L = Narci.L;
|
|
|
|
local GetItemInfoInstant = C_Item.GetItemInfoInstant;
|
|
|
|
local TRY_ON_CHECK = false;
|
|
--[[
|
|
Weapon Cam:
|
|
/script local m=NarciPlayerModelFrame1;m:SetPosition(0, 0, 0);m:SetCameraPosition(14, 0, 0);m:SetCameraTarget(0, 0, 0);m:SetFacing(PI/2);m:SetLight(true, false, -0.72, 0, -0.68, 1, 0.8, 0.8, 0.8, 1, 0.8, 0.8, 0.8)
|
|
|
|
MountJournalIcon
|
|
MountJournalName
|
|
MountJournalSource
|
|
MountJournalLore
|
|
--]]
|
|
|
|
local outQuart = addon.EasingFunctions.outQuart;
|
|
local outQuint = addon.EasingFunctions.outQuint;
|
|
local inQuad = addon.EasingFunctions.inQuad;
|
|
|
|
local DataProvider = {};
|
|
local FavUtil = {};
|
|
|
|
local function GetSubclassID(itemID)
|
|
local _, _, _, _, _, itemClassID, itemSubClassID = GetItemInfoInstant(itemID);
|
|
if itemClassID == 4 and itemSubClassID == 6 then --shield
|
|
itemSubClassID = 69;
|
|
elseif itemClassID ~= 2 then --weapon
|
|
itemSubClassID = 1208; --Unknown class 4 subclass 0 LE_ITEM_ARMOR_GENERIC
|
|
end
|
|
|
|
if itemClassID == 2 and itemSubClassID == 17 then
|
|
itemSubClassID = 6; --Redirect Spears to Polearm
|
|
end
|
|
return itemSubClassID
|
|
end
|
|
|
|
|
|
local ModelZoom = {};
|
|
|
|
function ModelZoom:Init()
|
|
self.executeFrame = CreateFrame("Frame");
|
|
self.widgets = {};
|
|
self.zoomInfo = {};
|
|
local transition = 0.6;
|
|
|
|
local niche, info, offsetX, offsetZ, t;
|
|
self.OnUpdate = function(frame, elapsed)
|
|
local i = 1;
|
|
local isComplete = true;
|
|
while self.widgets[i] do
|
|
niche = self.widgets[i];
|
|
info = self.zoomInfo[niche];
|
|
if info then
|
|
t = info.t + elapsed;
|
|
if t >= transition then
|
|
offsetX = info.wX;
|
|
offsetZ = info.sZ;
|
|
self.zoomInfo[niche] = nil;
|
|
else
|
|
offsetX = outQuint(info.t, info.wB, info.wX, transition);
|
|
offsetZ = outQuint(info.t, info.sB, info.sZ, transition);
|
|
info.t = t;
|
|
isComplete = false;
|
|
end
|
|
niche.Model:SetPosition(offsetX, 0, 0);
|
|
niche.ModelShadow:SetPosition(-offsetX, 0, offsetZ);
|
|
end
|
|
i = i + 1;
|
|
end
|
|
|
|
if isComplete then
|
|
self:Clear();
|
|
end
|
|
end
|
|
end
|
|
|
|
function ModelZoom:Add(weaponNiche, weaponX, shadowZ)
|
|
local _, _, fromZ = weaponNiche.ModelShadow:GetPosition();
|
|
self.zoomInfo[weaponNiche] = {
|
|
wB = weaponNiche.Model:GetPosition();
|
|
wX = weaponX,
|
|
sB = fromZ,
|
|
sZ = shadowZ,
|
|
t = 0,
|
|
};
|
|
|
|
for i = 1, #self.widgets do
|
|
if self.widgets[i] == weaponNiche then
|
|
return
|
|
end
|
|
end
|
|
|
|
tinsert(self.widgets, weaponNiche);
|
|
self.executeFrame:SetScript("OnUpdate", self.OnUpdate);
|
|
end
|
|
|
|
function ModelZoom:Clear()
|
|
self.executeFrame:SetScript("OnUpdate", nil);
|
|
wipe(self.widgets);
|
|
wipe(self.zoomInfo);
|
|
end
|
|
|
|
-----------------------------------------------------------------------------
|
|
local TabUtil = {};
|
|
|
|
function TabUtil:SelectDefaultTab()
|
|
self.activeTab = 1;
|
|
for i = 1, #self.tabButtons do
|
|
self.tabButtons[i]:UpdateVisual();
|
|
end
|
|
|
|
self.SelectDefaultTab = nil;
|
|
end
|
|
|
|
function TabUtil:UpdateCategories(dataSource, countSource)
|
|
local container = HomePage;
|
|
--Sort by Name
|
|
local categoryOrder = {};
|
|
for subclassID, data in pairs(dataSource) do
|
|
tinsert(categoryOrder, subclassID);
|
|
end
|
|
|
|
local subclassName = DataProvider.subclassInfo;
|
|
local function SortFunc(a, b)
|
|
if subclassName[a] and subclassName[b] then
|
|
return subclassName[a] < subclassName[b];
|
|
else
|
|
return a > b
|
|
end
|
|
end
|
|
table.sort(categoryOrder, SortFunc);
|
|
|
|
--Create Buttons
|
|
local button;
|
|
local numWeapons;
|
|
local subclassID;
|
|
local i = 0;
|
|
|
|
if not self.categorybuttons then
|
|
self.categorybuttons = {};
|
|
end
|
|
local buttons = self.categorybuttons;
|
|
|
|
for index = 1, #categoryOrder do
|
|
subclassID = categoryOrder[index];
|
|
numWeapons = countSource[subclassID] or 0;
|
|
if numWeapons > 0 then
|
|
i = i + 1;
|
|
if not buttons[i] then
|
|
buttons[i] = CreateFrame("Button", nil, container, "NarciWeaponCategoryTemplate");
|
|
end
|
|
button = buttons[i];
|
|
button:ClearAllPoints();
|
|
if i == 1 then
|
|
button:SetPoint("TOP", container, "TOP", 0, -38);
|
|
else
|
|
button:SetPoint("TOP", buttons[i - 1], "BOTTOM", 0, 0);
|
|
end
|
|
button.weaponList =
|
|
button:SetHeight(16.0);
|
|
button:SetCatergory(subclassID, numWeapons);
|
|
button:Show();
|
|
end
|
|
end
|
|
|
|
for index = i + 1, #buttons do
|
|
buttons[index]:Hide();
|
|
end
|
|
|
|
HomePage.LoadingNotes:SetShown( i == 0 );
|
|
end
|
|
|
|
function TabUtil:ShowEverything()
|
|
self:UpdateCategories(DataProvider.subclassInfo, DataAPI.GetWeaponCountTable());
|
|
end
|
|
|
|
function TabUtil:ShowFavorites()
|
|
self:UpdateCategories(FavUtil:BuildList());
|
|
end
|
|
-----------------------------------------------------------------------------
|
|
local AlertUtil = {};
|
|
|
|
function AlertUtil:Init(widget)
|
|
self.widget = widget;
|
|
end
|
|
|
|
function AlertUtil:SetReason(reasonIndex)
|
|
if self.widget then
|
|
if reasonIndex then
|
|
local frame = self.widget;
|
|
if self.Init then
|
|
self.Init = nil;
|
|
NarciAlertFrameMixin:AddShakeAnimation(frame.Reason);
|
|
end
|
|
|
|
local reasonText, useShake, colorIndex;
|
|
if reasonIndex == 0 then
|
|
reasonText = (L["Search Result None"]);
|
|
colorIndex = 1;
|
|
elseif reasonIndex == 1 then
|
|
reasonText = ("The selected actor is hidden.");
|
|
useShake = true;
|
|
colorIndex = 2;
|
|
elseif reasonIndex == 2 then
|
|
reasonText = ("Fist weapons are invisible while sheathed.");
|
|
useShake = true;
|
|
colorIndex = 2;
|
|
elseif reasonIndex == 3 then
|
|
reasonText = ("This item is not available to the current model type.");
|
|
useShake = true;
|
|
colorIndex = 3;
|
|
elseif reasonIndex == 4 then
|
|
reasonText = ("This skin is not available to the current model type.");
|
|
useShake = true;
|
|
colorIndex = 3;
|
|
else
|
|
return
|
|
end
|
|
frame.Reason:SetText(reasonText);
|
|
self:UpdateFadeDuration();
|
|
self:SetBackgroundColor(colorIndex);
|
|
self:ShowAlert(useShake);
|
|
end
|
|
end
|
|
end
|
|
|
|
function AlertUtil:ShowShorcutTooltip()
|
|
if self.widget then
|
|
self.widget.Reason:SetText(L["Weapon Browser Specify Hand"]);
|
|
self:UpdateFadeDuration();
|
|
self:SetBackgroundColor(1);
|
|
self:ShowAlert(false);
|
|
end
|
|
end
|
|
|
|
function AlertUtil:UpdateFadeDuration()
|
|
local numLines = self.widget.Reason:GetNumLines();
|
|
self.widget:SetHeight(numLines * 8 + 8);
|
|
self.widget.animFade.Hold:SetStartDelay(2 + numLines * 1);
|
|
end
|
|
|
|
function AlertUtil:SetBackgroundColor(colorIndex)
|
|
if colorIndex == 1 then
|
|
--Black
|
|
self.widget.Color:SetColorTexture(0.05, 0.05, 0.05, 0.9);
|
|
elseif colorIndex == 2 then
|
|
--Yellow
|
|
self.widget.Color:SetColorTexture(1, 0.82, 0, 0.9);
|
|
elseif colorIndex == 3 then
|
|
--Red
|
|
self.widget.Color:SetColorTexture(1, 0.3137, 0.3137, 0.9);
|
|
else
|
|
--Black
|
|
self.widget.Color:SetColorTexture(0.05, 0.05, 0.05, 0.9);
|
|
end
|
|
end
|
|
|
|
function AlertUtil:ShowAlert(useShake)
|
|
self.widget:StopAnimating();
|
|
if useShake then
|
|
self.widget.Reason:SetTextColor(0, 0, 0);
|
|
self.widget.Reason.animError:Play();
|
|
else
|
|
self.widget.Reason:SetTextColor(0.5, 0.5, 0.5);
|
|
self.widget.Color:SetColorTexture(0.05, 0.05, 0.05, 0.9);
|
|
end
|
|
self.widget.animFade:Play();
|
|
self.widget:Show();
|
|
end
|
|
|
|
function AlertUtil:HideAlert()
|
|
self.widget:Hide();
|
|
end
|
|
|
|
function AlertUtil:SetNumMatches(total, overFlow)
|
|
if not total or total == 0 then
|
|
self:SetReason(0);
|
|
else
|
|
if overFlow then
|
|
self.widget.Reason:SetText(string.format(L["Search Result Overflow"], total));
|
|
elseif total > 1 then
|
|
self.widget.Reason:SetText(string.format(L["Search Result Plural"], total));
|
|
else
|
|
self.widget.Reason:SetText(string.format(L["Search Result Singular"], total));
|
|
end
|
|
|
|
self:UpdateFadeDuration();
|
|
self:SetBackgroundColor(1);
|
|
self:ShowAlert();
|
|
end
|
|
end
|
|
|
|
-----------------------------------------------------------------------------
|
|
local TEMP = {};
|
|
|
|
TEMP.categoryOrder = {};
|
|
|
|
TEMP.categoryInfo = {
|
|
[13] = "One-Handed Axes", --Axe 1H
|
|
[20] = "Two-Handed Axes", --Axe 2H
|
|
[25] = "Bows", --Bow
|
|
[26] = "Guns", --Gun
|
|
[15] = "One-Handed Maces", --Mace 1H
|
|
[22] = "Two-Handed Maces", --Mace 2H
|
|
[24] = "Polearms", --Polearm
|
|
[14] = "One-Handed Swords", --Sword 1H
|
|
[21] = "Two-Handed Swords", --Sword 2H
|
|
[28] = "Warglaives", --Warglaive
|
|
[23] = "Staves", --Staff
|
|
[17] = "Fist Weapons", --Fist Weapon
|
|
[0] = MISCELLANEOUS, --Miscellaneous
|
|
[16] = "Daggers", --Dagger
|
|
--[16] = INVTYPE_THROWN, --Thrown
|
|
--[17] = "Spears", --Spears
|
|
[27] = "Crossbows", --Crossbow
|
|
[12] = "Wands", --Wands
|
|
--[20] = "Fishing Poles", --Fishing Poles
|
|
[18] = "Shields",
|
|
[19] = 'Held In Off-hand',
|
|
[29] = 'Legion Artifacts',
|
|
};
|
|
|
|
function TEMP:CreateWeaponNiche(container)
|
|
local button;
|
|
local buttons = {};
|
|
local numButtons = 6;
|
|
for i = 1, numButtons do
|
|
button = CreateFrame("Button", nil, container, "NarciWeaponNicheTemplate");
|
|
buttons[i] = button;
|
|
button:SetPoint("TOP", container, "TOP", 0, 90*(1 - i) );
|
|
end
|
|
|
|
container.buttons = buttons;
|
|
end
|
|
|
|
function TEMP:CreateTabButtons(container)
|
|
local button;
|
|
local numTabs = 2;
|
|
local buttonWidth = floor(container:GetWidth() + 0.5) / numTabs;
|
|
for i = 1, numTabs do
|
|
button = CreateFrame("Button", nil, container, "NarciWeaponTabButtonTemplate");
|
|
button:SetPoint("TOPLEFT", container, "TOPLEFT", buttonWidth*(i - 1), -16);
|
|
button:Init(i);
|
|
end
|
|
|
|
TabUtil:SelectDefaultTab();
|
|
end
|
|
|
|
function TEMP:Release()
|
|
wipe(TEMP);
|
|
TEMP = nil;
|
|
end
|
|
|
|
|
|
|
|
DataProvider.zoomDistance = {
|
|
--subclassID redirect Shields to 69
|
|
[0] = 5, --Axe
|
|
[2] = 5.5, --Bow
|
|
[4] = 4.5, --Mace 1H
|
|
[5] = 5.5, --Mace 2H
|
|
[6] = 6, --Polearm
|
|
[7] = 4.5, --1H Sword
|
|
[8] = 5, --2H Sword
|
|
[9] = 5, --Glaive
|
|
[10] = 6, --Staff
|
|
[13] = 5, --Fist
|
|
[14] = 4, --Miscellaneous
|
|
[15] = 4, --Dagger
|
|
[18] = 5.5, --Crossbow
|
|
[19] = 4, --Wand
|
|
[20] = 6, --Fishing Poles
|
|
|
|
[69] = 5.5, --Shield
|
|
[1208] = 4, --Others
|
|
};
|
|
|
|
DataProvider.subclassInfo = {
|
|
[0] = "One-Handed Axes", --Axe 1H
|
|
[1] = "Two-Handed Axes", --Axe 2H
|
|
[2] = "Bows", --Bow
|
|
[3] = "Guns", --Gun
|
|
[4] = "One-Handed Maces", --Mace 1H
|
|
[5] = "Two-Handed Maces", --Mace 2H
|
|
[6] = "Polearms", --Polearm
|
|
[7] = "One-Handed Swords", --Sword 1H
|
|
[8] = "Two-Handed Swords", --Sword 2H
|
|
[9] = "Warglaives", --Warglaive
|
|
[10] = "Staves", --Staff
|
|
[13] = "Fist Weapons", --Fist Weapon
|
|
[14] = MISCELLANEOUS, --Miscellaneous
|
|
[15] = "Daggers", --Dagger
|
|
[16] = INVTYPE_THROWN, --Thrown
|
|
--[17] = "Spears", --Spears redirected to Polearms
|
|
[18] = "Crossbows", --Crossbow
|
|
[19] = "Wands", --Wands
|
|
[20] = "Fishing Poles", --Fishing Poles
|
|
[69] = "Shields",
|
|
[1208] = _G["INVTYPE_HOLDABLE"],
|
|
};
|
|
|
|
DataProvider.weaponList = {};
|
|
--/run Narci_WeaponBrowser:SetScale(1.2)
|
|
local UI_SCALE = 1;
|
|
|
|
function DataProvider:LocalizeSubclassName()
|
|
local GetItemSubClassInfo = GetItemSubClassInfo;
|
|
|
|
for subclassID, name in pairs(self.subclassInfo) do
|
|
if subclassID == 69 then
|
|
self.subclassInfo[subclassID] = GetItemSubClassInfo(4, 6) or self.subclassInfo[subclassID];
|
|
elseif subclassID ~= 1208 then
|
|
self.subclassInfo[subclassID] = GetItemSubClassInfo(2, subclassID) or self.subclassInfo[subclassID];
|
|
end
|
|
end
|
|
end
|
|
|
|
function DataProvider:GetCameraInfo(subclassID, itemID)
|
|
local fileID = DataAPI.GetItemModelFileID(itemID);
|
|
if self.specialItemZoomDistance[fileID] then
|
|
return UI_SCALE * (self.specialItemZoomDistance[fileID] or 5), self.specialItemCameraOffset[fileID];
|
|
end
|
|
|
|
if subclassID then
|
|
return UI_SCALE*(self.zoomDistance[subclassID] or 5), self.specialItemCameraOffset[fileID];
|
|
else
|
|
return UI_SCALE*5, self.specialItemCameraOffset[fileID];
|
|
end
|
|
end
|
|
|
|
function DataProvider:GetWeaponsByIndex(startIndex)
|
|
local weapons = {};
|
|
for i = 1, 6 do
|
|
weapons[i] = self.weaponList[startIndex + i];
|
|
end
|
|
return weapons
|
|
end
|
|
|
|
|
|
local ViewUpdator = {};
|
|
|
|
-----------------------------------------------------------------------------
|
|
FavUtil.isFavItems = {};
|
|
|
|
function FavUtil:IsFavorite(itemID, itemModID)
|
|
if itemModID then
|
|
return self.isFavItems[itemID.." "..itemModID];
|
|
else
|
|
return self.isFavItems[itemID];
|
|
end
|
|
end
|
|
|
|
function FavUtil:Add(itemID, itemModID)
|
|
if itemID then
|
|
if itemModID then
|
|
self.isFavItems[itemID.." "..itemModID] = true;
|
|
else
|
|
self.isFavItems[itemID] = true;
|
|
end
|
|
|
|
self:Save();
|
|
end
|
|
end
|
|
|
|
function FavUtil:Remove(itemID, itemModID)
|
|
if itemID then
|
|
if itemModID then
|
|
self.isFavItems[itemID.." "..itemModID] = nil;
|
|
else
|
|
self.isFavItems[itemID] = nil;
|
|
end
|
|
self:Save();
|
|
end
|
|
end
|
|
|
|
function FavUtil:Load()
|
|
if not NarcissusDB then
|
|
print("Cannot find NarcissusDB");
|
|
return 0;
|
|
end
|
|
|
|
NarcissusDB.Favorites = NarcissusDB.Favorites or {};
|
|
NarcissusDB.Favorites.FavoriteWeaponIDs = NarcissusDB.Favorites.FavoriteWeaponIDs or {};
|
|
self.db = NarcissusDB.Favorites.FavoriteWeaponIDs;
|
|
|
|
for i = 1, #self.db do
|
|
self.isFavItems[ self.db[i] ] = true;
|
|
end
|
|
|
|
self.favList = {};
|
|
self.favCount = {};
|
|
|
|
self.isLoaded = true;
|
|
self.requireUpdate = true;
|
|
end
|
|
|
|
function FavUtil:Save()
|
|
if self.isLoaded then
|
|
wipe(self.db);
|
|
local numFavs = 0;
|
|
for item, isFav in pairs(self.isFavItems) do
|
|
if isFav then
|
|
numFavs = numFavs + 1;
|
|
self.db[numFavs] = item;
|
|
end
|
|
end
|
|
self.requireUpdate = true;
|
|
ViewUpdator:RefreshStar();
|
|
end
|
|
end
|
|
|
|
function FavUtil:BuildList()
|
|
local numFavs = 0;
|
|
local itemID, itemModID;
|
|
local subclassID;
|
|
|
|
if self.requireUpdate then
|
|
wipe(self.favList);
|
|
wipe(self.favCount);
|
|
|
|
for item, isFav in pairs(self.isFavItems) do
|
|
if isFav then
|
|
numFavs = numFavs + 1;
|
|
if type(item) == "string" then
|
|
itemID, itemModID = string.split(" ", item);
|
|
itemID = tonumber(itemID);
|
|
itemModID = tonumber(itemModID);
|
|
else
|
|
itemID, itemModID = item, nil;
|
|
end
|
|
|
|
subclassID = GetSubclassID(itemID);
|
|
|
|
if not self.favList[subclassID] then
|
|
self.favList[subclassID] = {};
|
|
self.favCount[subclassID] = 0;
|
|
end
|
|
|
|
if itemModID then
|
|
tinsert(self.favList[subclassID], {itemID, itemModID} );
|
|
else
|
|
tinsert(self.favList[subclassID], itemID);
|
|
end
|
|
self.favCount[subclassID] = self.favCount[subclassID] + 1;
|
|
end
|
|
end
|
|
|
|
self.requireUpdate = nil;
|
|
end
|
|
return self.favList, self.favCount;
|
|
end
|
|
|
|
function FavUtil:GetListBySubclassID(subclassID)
|
|
return self.favList[subclassID] or {};
|
|
end
|
|
|
|
---------------------------------------------------------------
|
|
NarciWeaponBrowserQuickFavButtonMixin = {};
|
|
|
|
function NarciWeaponBrowserQuickFavButtonMixin:OnLoad()
|
|
FavButton = self;
|
|
self.Star:SetVertexColor(0.4, 0.4, 0.4);
|
|
end
|
|
|
|
function NarciWeaponBrowserQuickFavButtonMixin:OnHide()
|
|
self:Hide();
|
|
end
|
|
|
|
function NarciWeaponBrowserQuickFavButtonMixin:OnEnter()
|
|
self.Star:SetVertexColor(1, 1, 1);
|
|
self.Star:Show();
|
|
end
|
|
|
|
function NarciWeaponBrowserQuickFavButtonMixin:OnLeave()
|
|
self.Star:SetVertexColor(0.4, 0.4, 0.4);
|
|
if self.isFav then
|
|
self.Star:Hide();
|
|
end
|
|
if not MainFrame:IsMouseOver() then
|
|
self:Hide();
|
|
end
|
|
end
|
|
|
|
function NarciWeaponBrowserQuickFavButtonMixin:OnMouseDown()
|
|
|
|
end
|
|
|
|
function NarciWeaponBrowserQuickFavButtonMixin:OnMouseUp()
|
|
|
|
end
|
|
|
|
function NarciWeaponBrowserQuickFavButtonMixin:OnClick()
|
|
if self.parentObject then
|
|
if self.isFav then
|
|
FavUtil:Remove(self.parentObject.itemID, self.parentObject.itemModID);
|
|
else
|
|
FavUtil:Add(self.parentObject.itemID, self.parentObject.itemModID);
|
|
self.Star:Hide();
|
|
end
|
|
end
|
|
end
|
|
|
|
function NarciWeaponBrowserQuickFavButtonMixin:OnDoubleClick()
|
|
|
|
end
|
|
|
|
function NarciWeaponBrowserQuickFavButtonMixin:SetParentObject(weaponNiche)
|
|
self:ClearAllPoints();
|
|
self:SetParent(weaponNiche);
|
|
self:SetPoint("TOPLEFT", weaponNiche, "TOPLEFT", 0, -12);
|
|
self.parentObject = weaponNiche;
|
|
self:SetFrameLevel( weaponNiche:GetFrameLevel() + 3);
|
|
if weaponNiche.isFav then
|
|
self.isFav = true;
|
|
self.Star:SetTexCoord(0, 0.5, 0, 1);
|
|
self.Star:Hide();
|
|
else
|
|
self.isFav = false;
|
|
self.Star:SetTexCoord(0.5, 1, 0, 1);
|
|
self.Star:Show();
|
|
end
|
|
self:Show();
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
local TooltipUtil = {}
|
|
TooltipUtil.tooltip = NarciWeaponTooltip;
|
|
|
|
function TooltipUtil:ShowTooltip(object)
|
|
self.tooltip:SetNameID(object.Name:GetText(), object.itemID, object);
|
|
end
|
|
|
|
function TooltipUtil:HideTooltip()
|
|
self.tooltip:FadeOut();
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
local ButtonHighlight = {};
|
|
|
|
ViewUpdator.b = 0;
|
|
|
|
function ViewUpdator:SetButtonGroup(buttons)
|
|
self.buttons = buttons;
|
|
self.numButtons = #buttons;
|
|
end
|
|
|
|
function ViewUpdator:UpdateReference()
|
|
self.yTop = MainFrame:GetTop();
|
|
self.yBot = MainFrame:GetBottom();
|
|
end
|
|
|
|
function ViewUpdator:UpdateVisibleArea(offsetY)
|
|
local b = floor( offsetY / 90 + 0.5) - 1; --90 ~ buttonHeight
|
|
if b ~= self.b then --last offset
|
|
local buttons = self.buttons;
|
|
local data = DataProvider:GetWeaponsByIndex(b);
|
|
if b > self.b then
|
|
local topButton = tremove(buttons, 1);
|
|
tinsert(buttons, topButton);
|
|
else
|
|
local bottomButton = tremove(buttons);
|
|
tinsert(buttons, 1, bottomButton);
|
|
end
|
|
for i = 1, self.numButtons do
|
|
buttons[i]:SetPoint("TOP", 0, -(b + i - 1) * 90);
|
|
buttons[i]:SetItem(data[i]);
|
|
buttons[i]:UpdateRoll(self.yTop, self.yBot);
|
|
end
|
|
self.b = b;
|
|
else
|
|
for i = 1, self.numButtons do
|
|
self.buttons[i]:UpdateRoll(self.yTop, self.yBot);
|
|
end
|
|
end
|
|
end
|
|
|
|
function ViewUpdator:ForceUpdate()
|
|
MainFrame.WeaponContainer.scrollBar:SetValue(0);
|
|
|
|
local buttons = self.buttons;
|
|
local data = DataProvider:GetWeaponsByIndex(0);
|
|
for i = 1, self.numButtons do
|
|
buttons[i]:SetPoint("TOP", 0, (1 - i) * 90);
|
|
--buttons[i]:Clear();
|
|
buttons[i]:SetItem(data[i]);
|
|
end
|
|
|
|
local top = MainFrame.WeaponContainer:GetTop();
|
|
|
|
for i = 1, self.numButtons do
|
|
buttons[i]:UpdateRoll(self.yTop, self.yBot, top - 90 * i + 45);
|
|
end
|
|
end
|
|
|
|
function ViewUpdator:SetReversedFacing(state)
|
|
if state ~= self.reversedFacing then
|
|
self.reversedFacing = state;
|
|
local d;
|
|
if state then
|
|
d = -PI/2
|
|
else
|
|
d = PI/2;
|
|
end
|
|
for i = 1, self.numButtons do
|
|
self.buttons[i].Model:SetFacing(d);
|
|
end
|
|
end
|
|
end
|
|
|
|
function ViewUpdator:SetScrollRange(numWeapons)
|
|
local ScrollFrame = MainFrame.WeaponContainer;
|
|
local maxScroll = (numWeapons * 90 - ScrollFrame:GetHeight() + 90);
|
|
ScrollFrame.scrollBar:SetRange(maxScroll, true);
|
|
end
|
|
|
|
function ViewUpdator:FindFocusedButton()
|
|
if MainFrame:IsMouseOver() then
|
|
local button;
|
|
for i = 1, self.numButtons do
|
|
button = self.buttons[i];
|
|
if button:IsMouseOver() then
|
|
button:OnEnter();
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function ViewUpdator:EnableShadow(state)
|
|
for i = 1, self.numButtons do
|
|
self.buttons[i].ModelShadow:SetShown(state)
|
|
end
|
|
end
|
|
|
|
function ViewUpdator:PauseMouseMotion(state)
|
|
for i = 1, self.numButtons do
|
|
self.buttons[i].puaseMotion = state;
|
|
end
|
|
end
|
|
|
|
function ViewUpdator:OnScrollStart()
|
|
local v = ViewUpdator;
|
|
if not v.isScrolling then
|
|
if v.focusedButton then
|
|
v.focusedButton:OnLeave(nil, true);
|
|
v.focusedButton = nil;
|
|
end
|
|
end
|
|
v.isScrolling = true;
|
|
v:PauseMouseMotion(true);
|
|
|
|
TooltipUtil.tooltip:Hide();
|
|
end
|
|
|
|
function ViewUpdator:ReleaseLastFocus()
|
|
if self.focusedButton then
|
|
self.focusedButton:OnLeave(nil, true);
|
|
self.focusedButton = nil;
|
|
end
|
|
end
|
|
|
|
function ViewUpdator:OnScrollEnd()
|
|
local v = ViewUpdator;
|
|
v.isScrolling = nil;
|
|
v:PauseMouseMotion(nil);
|
|
v:FindFocusedButton();
|
|
end
|
|
|
|
function ViewUpdator:ToggleName(state)
|
|
if state then
|
|
for i = 1, self.numButtons do
|
|
FadeFrame(self.buttons[i].Name, 0.2, 1);
|
|
end
|
|
else
|
|
for i = 1, self.numButtons do
|
|
self.buttons[i].Name:SetAlpha(0);
|
|
end
|
|
end
|
|
end
|
|
|
|
function ViewUpdator:UpdateAnimation(scale, distance)
|
|
local buttons = ViewUpdator.buttons;
|
|
local button;
|
|
for i = 1, #buttons do
|
|
button = buttons[i];
|
|
button.Background:SetScale(scale)
|
|
button.Model:SetPosition(distance, 0, 0);
|
|
button.ModelShadow:SetPosition(distance, 0, -button.Model.zoomDistance/100);
|
|
end
|
|
end
|
|
|
|
function ViewUpdator:PlayTabTransition(isHomePage)
|
|
self.animHome:Hide();
|
|
if isHomePage then
|
|
ButtonHighlight:ResetState();
|
|
self.animHome.easeFunc = outQuint;
|
|
self.animHome.toY = -16;
|
|
self.animHome.fromY = -400;
|
|
self.animHome.duration = 0.6;
|
|
MainFrame.HomePage.MotionBlocker:Show();
|
|
After(0.25, function()
|
|
MainFrame.HomePage.MotionBlocker:Hide();
|
|
end)
|
|
else
|
|
self:PauseMouseMotion(nil);
|
|
self.animHome.easeFunc = inQuad;
|
|
self.animHome.toY = -400;
|
|
self.animHome.fromY = -16;
|
|
self.animHome.duration = 0.45;
|
|
MainFrame.HomePage.MotionBlocker:Show();
|
|
end
|
|
self.animHome.toBeHidden = not isHomePage;
|
|
self.animHome:Show();
|
|
end
|
|
|
|
function ViewUpdator:RecolorCurrentList()
|
|
for i = 1, self.numButtons do
|
|
self.buttons[i]:RecolorItemName();
|
|
end
|
|
end
|
|
|
|
function ViewUpdator:RefreshStar()
|
|
for i = 1, self.numButtons do
|
|
self.buttons[i]:RefreshStar();
|
|
if self.buttons[i]:IsMouseOver() then
|
|
FavButton:SetParentObject(self.buttons[i]);
|
|
end
|
|
end
|
|
end
|
|
-------------------------------------------------------------------------------
|
|
--Entrance Visual
|
|
local Roller = CreateFrame("Frame");
|
|
Roller:Hide();
|
|
Roller.toRoll = 0;
|
|
|
|
function Roller:SetButtonGroup(buttons)
|
|
self.objects = buttons;
|
|
self.fromRoll = -PI/2;
|
|
self.duration = 0.5;
|
|
self.numObjects = 4 --#buttons;
|
|
end
|
|
|
|
function Roller:Start(withDelay)
|
|
self.times = {};
|
|
if withDelay then
|
|
if self.objects then
|
|
for i = 1, self.numObjects do
|
|
self.times[i] = 0.1*(- i);
|
|
end
|
|
end
|
|
else
|
|
if self.objects then
|
|
for i = 1, self.numObjects do
|
|
self.times[i] = 0.05*(1 - i);
|
|
end
|
|
end
|
|
end
|
|
self:Stop();
|
|
self:Show();
|
|
end
|
|
|
|
function Roller:Stop()
|
|
self:Hide();
|
|
self.times = {};
|
|
if self.objects then
|
|
for i = 1, self.numObjects do
|
|
self.times[i] = 0.1*(- i) --0.05*(1 - i);
|
|
end
|
|
end
|
|
end
|
|
|
|
Roller:SetScript("OnUpdate", function(self, elapsed)
|
|
local obj, t, roll;
|
|
local isRolling = false;
|
|
|
|
for i = 1, self.numObjects do
|
|
obj, t = self.objects[i], self.times[i];
|
|
t = t + elapsed;
|
|
self.times[i] = t;
|
|
if t >= self.duration then
|
|
roll = 0;
|
|
isRolling = isRolling or false;
|
|
elseif t >= 0 then
|
|
roll = outQuart(t, self.fromRoll, self.toRoll, self.duration);
|
|
isRolling = true;
|
|
else
|
|
roll = self.fromRoll;
|
|
isRolling = true;
|
|
end
|
|
obj:SetItemRoll(roll);
|
|
end
|
|
|
|
if not isRolling then
|
|
self:Stop();
|
|
end
|
|
end);
|
|
|
|
|
|
-------------------------------------------------------------------------------
|
|
local function Niche_OnModelLoaded(self)
|
|
self.isLoaded = true;
|
|
self:SetKeepModelOnHide(true);
|
|
self:MakeCurrentCameraCustom();
|
|
self:SetCameraPosition(self.zoomDistance, 0, 0);
|
|
self:SetCameraTarget(0, 0, 0);
|
|
self:SetViewTranslation(0, self.offsetY or 0);
|
|
|
|
self:GetParent().ModelShadow:SetAnimation(0, 0);
|
|
self:SetAnimation(0, 0);
|
|
end
|
|
|
|
local function RenderedShadow_OnModelLoaded(self)
|
|
local m = self:GetParent().Model;
|
|
self:SetParticlesEnabled(false);
|
|
self:SetKeepModelOnHide(true);
|
|
self:MakeCurrentCameraCustom();
|
|
self:SetCameraPosition(m.zoomDistance, 0, 0);
|
|
self:SetCameraTarget(0, 0, 0);
|
|
self:SetViewTranslation(0, m.offsetY or 0);
|
|
self:SetPosition(0, 0, -m.zoomDistance/100);
|
|
m:SetAnimation(0, 0);
|
|
self:SetAnimation(0, 0);
|
|
end
|
|
|
|
NarciWeaponNicheMixin = {};
|
|
|
|
function NarciWeaponNicheMixin:OnLoad()
|
|
self.defaultRoll = 0;
|
|
|
|
local m = self.Model;
|
|
m:SetScript("OnModelLoaded", Niche_OnModelLoaded);
|
|
SetModelLight(m, true, false, -0.55, 0, -0.83, 1, 0.8, 0.8, 0.8, 1, 0.6, 0.6, 0.6);
|
|
m:SetFacing(PI/2);
|
|
m:UseModelCenterToTransform(true);
|
|
|
|
local ms = self.ModelShadow;
|
|
local a = 0.1;
|
|
ms:SetFogColor(a, a, a);
|
|
SetModelLight(ms, false);
|
|
ms:SetScript("OnModelLoaded", RenderedShadow_OnModelLoaded);
|
|
m:SetFacing(PI/2);
|
|
ms:UseModelCenterToTransform(true);
|
|
end
|
|
|
|
function NarciWeaponNicheMixin:Clear()
|
|
self.itemID = nil;
|
|
self.itemModID = nil;
|
|
self.sourceID = nil;
|
|
self.Model:ClearModel();
|
|
self.ModelShadow:ClearModel();
|
|
end
|
|
|
|
function NarciWeaponNicheMixin:SetItem(itemID, itemModID)
|
|
--itemID: number or {itemID, itemModID}: table
|
|
if itemID then
|
|
if type(itemID) == "table" then
|
|
self.sourceID = itemID[3];
|
|
itemID, itemModID = itemID[1], itemID[2];
|
|
end
|
|
if itemID ~= self.itemID or itemModID ~= self.itemModID then
|
|
self.Model.isLoaded = false;
|
|
self.itemID = itemID;
|
|
self.itemModID = itemModID;
|
|
|
|
local name = GetItemName(itemID);
|
|
self.Name:SetFontObject("NarciIndicatorLetter");
|
|
self.Name:SetText(name);
|
|
if self.Name:IsTruncated() then
|
|
self.Name:SetFontObject("NarciIndicatorDigitTiny");
|
|
end
|
|
|
|
local _, _, _, _, _, itemClassID, itemSubClassID = GetItemInfoInstant(itemID);
|
|
if itemClassID and itemSubClassID then
|
|
if (itemClassID == 4 and (itemSubClassID == 0 or itemSubClassID == 6)) then --Shield
|
|
itemSubClassID = 69;
|
|
self.Model:SetFacing(-PI/2);
|
|
self.ModelShadow:SetFacing(-PI/2);
|
|
elseif itemSubClassID == 2 then --Bow
|
|
self.Model:SetFacing(-PI/2);
|
|
self.ModelShadow:SetFacing(-PI/2);
|
|
else
|
|
self.Model:SetFacing(PI/2);
|
|
self.ModelShadow:SetFacing(PI/2);
|
|
end
|
|
if itemSubClassID == 18 then --Crossbow: Tilt a bit
|
|
self.defaultRoll = 0.3925;
|
|
else
|
|
self.defaultRoll = 0;
|
|
end
|
|
end
|
|
self.itemSubClassID = itemSubClassID;
|
|
self.Model.zoomDistance, self.Model.offsetY = DataProvider:GetCameraInfo(itemSubClassID, itemID);
|
|
|
|
if itemModID then
|
|
self.Model:SetItem(itemID, itemModID);
|
|
self.ModelShadow:SetItem(itemID, itemModID);
|
|
else
|
|
self.Model:SetItem(itemID);
|
|
self.ModelShadow:SetItem(itemID);
|
|
end
|
|
|
|
local isFav = FavUtil:IsFavorite(itemID, itemModID);
|
|
self.isFav = isFav;
|
|
self.FavStar:SetShown(isFav);
|
|
|
|
--Valid For DressUpModel
|
|
if TRY_ON_CHECK then
|
|
if IsItemValidForTryOn(itemID) then
|
|
self.Name:SetTextColor(0.66, 0.66, 0.66);
|
|
else
|
|
self.Name:SetTextColor(1, 0.3137, 0.3137); --red
|
|
end
|
|
else
|
|
if self.itemModID then
|
|
self.Name:SetTextColor(1, 0.3137, 0.3137); --red
|
|
else
|
|
self.Name:SetTextColor(0.66, 0.66, 0.66);
|
|
end
|
|
end
|
|
end
|
|
self:Show();
|
|
else
|
|
self.itemID = nil;
|
|
self.Model:ClearModel();
|
|
self.ModelShadow:ClearModel();
|
|
self:Hide();
|
|
end
|
|
end
|
|
|
|
function NarciWeaponNicheMixin:RecolorItemName()
|
|
if self.itemID then
|
|
if TRY_ON_CHECK then
|
|
if IsItemValidForTryOn(self.itemID) then
|
|
self.Name:SetTextColor(0.66, 0.66, 0.66);
|
|
else
|
|
self.Name:SetTextColor(1, 0.3137, 0.3137); --red
|
|
end
|
|
else
|
|
if self.itemModID then
|
|
self.Name:SetTextColor(1, 0.3137, 0.3137); --red
|
|
else
|
|
self.Name:SetTextColor(0.66, 0.66, 0.66);
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function NarciWeaponNicheMixin:RefreshStar()
|
|
if self.itemID then
|
|
self.FavStar:StopAnimating();
|
|
if FavUtil:IsFavorite(self.itemID, self.itemModID) then
|
|
self.isFav = true;
|
|
if not self.FavStar:IsShown() then
|
|
self.FavStar:Show();
|
|
self.FavStar.Background.FlyIn:Play();
|
|
self.FavStar.Star.ScaleIn:Play();
|
|
end
|
|
else
|
|
self.isFav = false;
|
|
self.FavStar:Hide();
|
|
end
|
|
end
|
|
end
|
|
|
|
function NarciWeaponNicheMixin:SetItemRoll(r)
|
|
r = r + self.defaultRoll;
|
|
self.Model:SetRoll(r);
|
|
self.ModelShadow:SetRoll(r);
|
|
end
|
|
|
|
function NarciWeaponNicheMixin:SetZoomDistance(distance, scale)
|
|
self.Background:SetScale(scale);
|
|
self.Model:SetPosition(distance, 0, 0);
|
|
self.ModelShadow:SetPosition(distance, 0, -self.Model.zoomDistance/100);
|
|
end
|
|
|
|
function NarciWeaponNicheMixin:UpdateRoll(topY, botY, designatedY)
|
|
--if not self.Model.isLoaded then print("Not Loaded") return end;
|
|
local x, y;
|
|
if designatedY then
|
|
y = designatedY;
|
|
else
|
|
x, y = self:GetCenter();
|
|
end
|
|
local r = 0;
|
|
local a = 1;
|
|
if y < botY + 50 then
|
|
r = (y - botY - 50)*0.035;
|
|
if r < - PI/2 then
|
|
r = - PI/2
|
|
end
|
|
a = 1 + (y - botY - 30)/30;
|
|
elseif y > topY - 60 then
|
|
r = (y - topY + 60)*0.035;
|
|
if r > PI/2 then
|
|
r = PI/2;
|
|
end
|
|
a = 1 - (y - topY + 60)/50;
|
|
else
|
|
|
|
end
|
|
|
|
if a < 0 then
|
|
a = 0;
|
|
self.Model:Hide();
|
|
self.ModelShadow:Hide();
|
|
elseif a > 1 then
|
|
a = 1;
|
|
self.Model:Show();
|
|
self.ModelShadow:Show();
|
|
else
|
|
self.Model:Show();
|
|
self.ModelShadow:Show();
|
|
end
|
|
|
|
r = r + self.defaultRoll;
|
|
|
|
self.Model:SetRoll(r);
|
|
self.ModelShadow:SetRoll(r);
|
|
|
|
self.Model:SetModelAlpha(a);
|
|
self.ModelShadow:SetModelAlpha(a);
|
|
end
|
|
|
|
function NarciWeaponNicheMixin:OnClick(mouseButton)
|
|
if IsModifiedClick() then
|
|
local model = Narci:GetActiveActor();
|
|
if model then
|
|
local slot;
|
|
if IsAltKeyDown() then
|
|
slot = 2;
|
|
else --IsControlKeyDown or Shift
|
|
slot = 1;
|
|
end
|
|
|
|
--Failure Reason
|
|
local hasReason;
|
|
if not model:IsVisible() then
|
|
AlertUtil:SetReason(1); --Actor is hidden
|
|
hasReason = true;
|
|
elseif self.itemSubClassID == 13 and model.GetSheathed and model:GetSheathed() then
|
|
AlertUtil:SetReason(2); --Sheathed fist weapons
|
|
hasReason = true;
|
|
end
|
|
|
|
if model.widgetType == 2 then
|
|
--CinematicModel
|
|
if self.itemModID then
|
|
AlertUtil:SetReason(4);
|
|
hasReason = true;
|
|
end
|
|
else
|
|
--DressUpModel
|
|
--temp fix for 9.1
|
|
if not IsItemValidForTryOn(self.itemID) then
|
|
local itemInfo = C_Item.GetItemInfo(self.itemID);
|
|
if not itemInfo then
|
|
AlertUtil:SetReason(4);
|
|
hasReason = true;
|
|
end
|
|
end
|
|
end
|
|
|
|
if not self.itemModID then
|
|
self.sourceID = GetSourceID(self.itemID) or 0;
|
|
end
|
|
local itemTryOnSuccess, effectiveSlot, widgetType = model:EquipWeapon(self.itemID, self.sourceID, slot);
|
|
if itemTryOnSuccess then
|
|
Narci_PhotoModeWeaponFrame:SetItemInfo(self.itemID, effectiveSlot, self.Name:GetText(), widgetType == 2);
|
|
if not hasReason then
|
|
AlertUtil:HideAlert();
|
|
end
|
|
else
|
|
AlertUtil:SetReason(3);
|
|
end
|
|
end
|
|
else
|
|
if mouseButton == "RightButton" then
|
|
MainFrame:ReturnHome();
|
|
else
|
|
--MainFrame:ShowModelComparison(self.itemID);
|
|
AlertUtil:ShowShorcutTooltip();
|
|
end
|
|
end
|
|
end
|
|
|
|
function NarciWeaponNicheMixin:OnEnter()
|
|
--self.Model:SetPosition(0.4, 0, 0);
|
|
if not self.puaseMotion then
|
|
ViewUpdator.focusedButton = self;
|
|
ModelZoom:Add(self, 0.4, -(self.Model.zoomDistance/50));
|
|
TooltipUtil:ShowTooltip(self);
|
|
end
|
|
FavButton:SetParentObject(self);
|
|
end
|
|
|
|
function NarciWeaponNicheMixin:OnLeave(motion, forcedLeave)
|
|
--self.Model:SetPosition(0, 0, 0);
|
|
if self.itemID and not self.puaseMotion and (forcedLeave or not self:IsMouseOver(0, 0, 0, -12)) then
|
|
ViewUpdator.focusedButton = nil;
|
|
ModelZoom:Add(self, 0, -(self.Model.zoomDistance/100));
|
|
TooltipUtil:HideTooltip();
|
|
FavButton:Hide();
|
|
end
|
|
end
|
|
|
|
function NarciWeaponNicheMixin:OnMouseDown()
|
|
|
|
end
|
|
|
|
function NarciWeaponNicheMixin:OnMouseUp()
|
|
|
|
end
|
|
|
|
|
|
-------------------------------------------------------------------------------
|
|
local Turner = CreateFrame("Frame");
|
|
Turner:Hide();
|
|
Turner.t = 0;
|
|
Turner.d = 0.5;
|
|
Turner:SetScript("OnUpdate", function(self, elapsed)
|
|
self.t = self.t + elapsed;
|
|
if self.model then
|
|
self.model:SetFacing( outQuart(self.t, self.fromFacing, self.toFacing, self.d));
|
|
else
|
|
|
|
end
|
|
if self.t >= self.d then
|
|
self.t = 0;
|
|
self:Hide();
|
|
end
|
|
end);
|
|
|
|
function Turner:Start(facing)
|
|
self.t = 0;
|
|
self.fromFacing = facing - 0.25;
|
|
self.toFacing = facing
|
|
self:Show();
|
|
end
|
|
|
|
function Turner:Stop()
|
|
self:Hide();
|
|
self.t = 0;
|
|
end
|
|
|
|
|
|
|
|
|
|
ButtonHighlight.typicalModelInfo = {
|
|
-- [subclassID] = {itemID, facing, {camPosition}, {modelPosition}, {backgroundGradient}}
|
|
|
|
[0] = {168268, 5.453, {3.435, 0, -2.638}, {0, 0.273, -0.767}}, --Axe 1H
|
|
[1] = {128323, 5.491, {3.376, 0, -1.43}, {0, 0.394, -0.407}}, --Axe 2H
|
|
[2] = {151781, 2.162, {2.876, 0, -1.522}, {0, 0.298, -0.27}}, --Bow
|
|
[3] = {153648, 5.464, {2.241, 0, -0.449}, {0, 0.115, -0.301}}, --Gun
|
|
[4] = {115283, 5.432, {3.006, 0, -1.904}, {0, 0.247, -0.651}}, --Mace 1H
|
|
[5] = {177838, 5.469, {3.184, 0, -1.504}, {0, 0.534, -0.607}}, --Mace 2H
|
|
[6] = {174994, 5.384, {3.065, 0, -2.268}, {0, 0.555, -0.774}}, --Polearm
|
|
[7] = {178906, 5.635, {2.206, 0, -0.907}, {0, 0.192, -0.464} }, --Sword 1H
|
|
[8] = {152482, 5.645, {2.909, 0, -0.904}, {0, 0.230, -0.515} }, --Sword 2H
|
|
[9] = {120370, 2.205, {4.034, 0, -1.282}, {0, 0.519, -0.686} }, -- [4], --Warglaive
|
|
[10] = {153575, 5.48, {3.276, 0, -2.147}, {0, 0.402, -0.778}}, --Staff
|
|
[13] = {165224, 2.018, {3.901, 0, -1.058}, {0, 0.296, -0.177}}, --Fist Weapon
|
|
[14] = {167044, 5.608, {2.123, 0, -0.354}, {0, 0.116, -0.116}}, --Miscellaneous
|
|
[15] = {171193, 5.549, {2.292, 0, -0.856}, {0, 0.182, -0.413}}, --Dagger
|
|
[16] = {39490, 2.023, {2.166, 0, -0.377}, {0, 0.175, -0.328}}, --Thrown
|
|
--[17] = {174994, 5.384, {3.065, 0, -2.268}, {0, 0.555, -0.774}}, --Spears
|
|
[18] = {179729, 5.565, {3.526, 0, -2.109}, {0, 0.238, -0.842}}, --Crossbow
|
|
[19] = {117628, 5.379, {2.661, 0, -1.921}, {0, 0.268, -0.664}}, --Wands
|
|
[20] = {44050, 5.683, {3.612, 0, -1.065}, {0, 0.281, -0.443}}, --Fishing Poles
|
|
[69] = {139622, 4.344, {3.506, 0, -0.56}, {0, 0.094, -0.399}}, --Shield
|
|
[1208] = {176455, 1.01, {2.834, 0, -0.299}, {0, 0.184, 0.219}}, --Miscellaneous
|
|
};
|
|
|
|
local function Highlight_OnModelLoaded(self)
|
|
self:MakeCurrentCameraCustom();
|
|
self:SetCameraTarget(0, 0, 0)
|
|
self:SetCameraPosition( unpack(self.cameraPosition) );
|
|
self:SetPosition( unpack(self.modelPosition) );
|
|
self:SetFacing(self.facing);
|
|
MD = self
|
|
end
|
|
|
|
function ButtonHighlight:Init(widget)
|
|
self.object = widget;
|
|
Turner.model = widget.WeaponModel;
|
|
SetModelLight(widget.WeaponModel, true, false, -0.61, 0.52, -0.6, 1, 0.5, 0.5, 0.5, 1, 1, 1, 1);
|
|
widget.WeaponModel:SetScript("OnModelLoaded", Highlight_OnModelLoaded);
|
|
end
|
|
|
|
function ButtonHighlight:SetFocus(categoryButton)
|
|
self.lastFocus = categoryButton;
|
|
|
|
self.object:ClearAllPoints();
|
|
self.object:SetPoint("LEFT", categoryButton, "LEFT", 0, 0);
|
|
self.object.ItemCount:SetText(categoryButton.numWeapons);
|
|
local itemInfo = self.typicalModelInfo[categoryButton.subclassID];
|
|
if itemInfo then
|
|
self.object.WeaponModel:SetItem(itemInfo[1]); --182575 180218 120370
|
|
self.object.WeaponModel.facing = itemInfo[2];
|
|
Turner:Start(itemInfo[2]);
|
|
self.object.WeaponModel.cameraPosition = itemInfo[3];
|
|
self.object.WeaponModel.modelPosition = itemInfo[4];
|
|
end
|
|
|
|
self.object:Show();
|
|
end
|
|
|
|
function ButtonHighlight:Hide()
|
|
self.object:Hide();
|
|
Turner:Stop();
|
|
end
|
|
|
|
function ButtonHighlight:SetColor(v)
|
|
self.object.Background:SetColorTexture(v, v, v);
|
|
end
|
|
|
|
function ButtonHighlight:ResetState()
|
|
if self.lastFocus then
|
|
self.lastFocus.pauseMotion = nil;
|
|
self.lastFocus:OnLeave();
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
NarciWeaponCategoryMixin = {};
|
|
|
|
function NarciWeaponCategoryMixin:SetCatergory(subclassID, numWeapons)
|
|
local cate = DataProvider.subclassInfo[subclassID];
|
|
if cate then
|
|
if type(cate) == "number" then
|
|
|
|
else
|
|
self.Name:SetText(cate);
|
|
end
|
|
else
|
|
self.Name:SetText("Unknown "..subclassID);
|
|
end
|
|
|
|
self.subclassID = subclassID;
|
|
self.numWeapons = numWeapons;
|
|
self.ItemCountRight:SetText( numWeapons );
|
|
end
|
|
|
|
function NarciWeaponCategoryMixin:OnClick()
|
|
if TabUtil.activeTab == 2 then
|
|
DataProvider.weaponList = FavUtil:GetListBySubclassID(self.subclassID);
|
|
else
|
|
DataProvider.weaponList = DataAPI.GetWeaponsBySubclassID(self.subclassID);
|
|
end
|
|
|
|
ViewUpdator:SetScrollRange(self.numWeapons);
|
|
ViewUpdator:SetReversedFacing(self.subclassID == 69 or self.subclassID == 2); --Shield/Bow
|
|
MainFrame:GoToWeapons();
|
|
MainFrame.Header.Tab2Label:SetText(self.Name:GetText());
|
|
Roller:Start(true);
|
|
|
|
self.pauseMotion = true;
|
|
end
|
|
|
|
function NarciWeaponCategoryMixin:OnDoubleClick()
|
|
|
|
end
|
|
|
|
function NarciWeaponCategoryMixin:OnEnter()
|
|
ButtonHighlight:SetFocus(self);
|
|
self.Name:SetTextColor(0.8, 0.8, 0.8);
|
|
self.ItemCountRight:Hide();
|
|
self:SetHeight(30.0);
|
|
end
|
|
|
|
function NarciWeaponCategoryMixin:OnLeave()
|
|
if not self.pauseMotion then
|
|
self.Name:SetTextColor(0.66, 0.66, 0.66);
|
|
self.ItemCountRight:Show();
|
|
self:SetHeight(16.0);
|
|
ButtonHighlight:Hide();
|
|
end
|
|
end
|
|
|
|
function NarciWeaponCategoryMixin:OnMouseDown()
|
|
ButtonHighlight:SetColor(0.08);
|
|
end
|
|
|
|
function NarciWeaponCategoryMixin:OnMouseUp()
|
|
ButtonHighlight:SetColor(0);
|
|
end
|
|
|
|
|
|
-------------------------------------------------------------------------------
|
|
NarciWeaponBrowserMixin = {};
|
|
|
|
function NarciWeaponBrowserMixin:Open()
|
|
self:Show();
|
|
if self.Load then
|
|
--Enable Database
|
|
After(0.2, function()
|
|
local addOnName = "Narcissus_Database_Item";
|
|
if C_AddOns.GetAddOnEnableState( UnitName("player"), addOnName ) == 0 then
|
|
C_AddOns.EnableAddOn(addOnName);
|
|
end
|
|
local loaded, reason = C_AddOns.LoadAddOn(addOnName);
|
|
end);
|
|
end
|
|
end
|
|
|
|
function NarciWeaponBrowserMixin:Preload()
|
|
MainFrame = self;
|
|
ViewUpdator:UpdateReference();
|
|
|
|
local a = 0.15;
|
|
self.Backdrop:SetColorTexture(a, a, a);
|
|
|
|
self.InnerShadow:Hide();
|
|
self.HomePage.LoadingNotes:SetText(Narci.L["Loading Database"]);
|
|
|
|
local tooltip = NarciWeaponTooltip;
|
|
if tooltip then
|
|
tooltip:SetParent(self);
|
|
tooltip:SetFrameStrata("TOOLTIP");
|
|
tooltip:SetFrameLevel(80);
|
|
end
|
|
end
|
|
|
|
function NarciWeaponBrowserMixin:Load()
|
|
--Fetch
|
|
if not NarciItemDatabase then
|
|
print("Failed to find NarciItemDatabase");
|
|
return
|
|
end
|
|
DataAPI = NarciItemDatabase;
|
|
GetItemName = DataAPI.GetItemName;
|
|
GetSourceID = DataAPI.GetSourceID;
|
|
IsItemValidForTryOn = DataAPI.IsItemValidForTryOn;
|
|
|
|
DataProvider:LocalizeSubclassName();
|
|
|
|
local ScrollFrame = self.WeaponContainer;
|
|
local ScrollChild = ScrollFrame.ScrollChild;
|
|
TEMP:CreateWeaponNiche(ScrollChild);
|
|
local weaponButtons = ScrollChild.buttons;
|
|
ViewUpdator:SetButtonGroup(weaponButtons);
|
|
Roller:SetButtonGroup(weaponButtons);
|
|
|
|
local buttonHeight = 90;
|
|
local numButtons = #weaponButtons;
|
|
local numButtonsPerPage = 1;
|
|
local totalHeight = floor(numButtons * buttonHeight + 0.5);
|
|
local maxScroll = floor((5000 - numButtonsPerPage) * buttonHeight + 0.5 - self:GetHeight()/2);
|
|
|
|
ScrollFrame.scrollBar:SetMinMaxValues(0, maxScroll)
|
|
ScrollFrame.buttonHeight = totalHeight;
|
|
ScrollFrame.range = maxScroll;
|
|
|
|
NarciAPI_SmoothScroll_Initialization(ScrollFrame, nil, nil, 1/numButtons, 0.14, nil, ViewUpdator.OnScrollStart, ViewUpdator.OnScrollEnd);
|
|
ScrollFrame.scrollBar.onValueChangedFunc = function(value)
|
|
ScrollFrame:SetVerticalScroll(value);
|
|
ViewUpdator:UpdateVisibleArea(value);
|
|
end
|
|
|
|
--Create Categories
|
|
HomePage = self.HomePage;
|
|
ButtonHighlight:Init(HomePage.ButtonHighlight);
|
|
TabUtil:ShowEverything();
|
|
TEMP:CreateTabButtons(HomePage); --Above Categories
|
|
|
|
local animHome = NarciAPI_CreateAnimationFrame(0.6);
|
|
animHome:SetScript("OnUpdate", function(frame, elapsed)
|
|
frame.total = frame.total + elapsed;
|
|
local offsetY;
|
|
if frame.total >= frame.duration then
|
|
offsetY = frame.toY;
|
|
frame:Hide();
|
|
if frame.toBeHidden then
|
|
MainFrame.HomePage:Hide();
|
|
end
|
|
else
|
|
offsetY = frame.easeFunc(frame.total, frame.fromY, frame.toY, frame.duration);
|
|
end
|
|
HomePage:SetPoint("TOP", self, "TOP", 0, offsetY);
|
|
end);
|
|
ViewUpdator.animHome = animHome;
|
|
|
|
--Search Box
|
|
local SearchBox = self.Header.SearchBox;
|
|
SearchBox.DefaultText:SetText("Item Name");
|
|
SearchBox.onSearchFunc = function(word)
|
|
local numMacthes, overFlow;
|
|
local id = tonumber(word);
|
|
if id and id ~= 0 then
|
|
if GetItemInfoInstant(id) then
|
|
DataProvider.searchResult = { id };
|
|
numMacthes = 1;
|
|
else
|
|
DataProvider.searchResult = {};
|
|
numMacthes = 0;
|
|
end
|
|
else
|
|
DataProvider.searchResult, numMacthes, overFlow = DataAPI.SearchItemByName(word);
|
|
DataProvider.numMacthes = numMacthes;
|
|
end
|
|
|
|
DataProvider.weaponList = DataProvider.searchResult;
|
|
ViewUpdator:SetScrollRange(numMacthes);
|
|
ViewUpdator:ForceUpdate();
|
|
Roller:Start();
|
|
--SearchBox.NoMatchText:SetShown(numMacthes == 0);
|
|
AlertUtil:SetNumMatches(numMacthes, overFlow);
|
|
end
|
|
|
|
AlertUtil:Init(self.AlertFrame);
|
|
ModelZoom:Init();
|
|
|
|
self:SetParent(Narci_ModelSettings);
|
|
self:SetIgnoreParentAlpha(true);
|
|
self:SetFrameLevel(70);
|
|
self.ComparisonFrame:SetFrameStrata("LOW");
|
|
self.ComparisonFrame:SetFrameLevel(1);
|
|
|
|
FavUtil:Load();
|
|
|
|
self.InnerShadow:Show();
|
|
HomePage.LoadingNotes:Hide();
|
|
|
|
HomePage.LoadingNotes:SetText("No favorite weapons.");
|
|
|
|
--Guide Frame
|
|
local GuideFrame = self.GuideFrame;
|
|
GuideFrame.Tip1:SetText(L["WeaponBrowser Guide Hotkey"]);
|
|
GuideFrame.Tip2:SetText(L["WeaponBrowser Guide ModelType"]);
|
|
GuideFrame.DressUpModelNote:SetText(string.format(L["WeaponBrowser Guide DressUpModel"], NARCI_MODIFIER_ALT));
|
|
GuideFrame.CinematicModelNote:SetText(L["WeaponBrowser Guide CinematicModel"]);
|
|
if NarcissusDB.Tutorials["WeaponBrowser"] then
|
|
NarcissusDB.Tutorials["WeaponBrowser"] = false;
|
|
After(1.5, function()
|
|
self:ShowGuide();
|
|
end);
|
|
end
|
|
TEMP:Release();
|
|
self.Load = nil;
|
|
collectgarbage("collect");
|
|
|
|
--self.TempMouseAction:SetText(NARCI_MODIFIER_CONTROL.."-Click: ".."|cff808080Main Hand|r "..NARCI_MODIFIER_ALT.."-Click: ".."|cff808080Off Hand|r");
|
|
end
|
|
|
|
function NarciWeaponBrowserMixin:ReturnHome()
|
|
self.WeaponContainer:Hide();
|
|
--self.HomePage:SetAlpha(0);
|
|
self.HomePage:Show();
|
|
self.Header.SearchBox:Hide();
|
|
self.Header.SearchTrigger:Show();
|
|
self.Header.Tab2Label:Hide();
|
|
self.Header.HomeButton:Hide();
|
|
TooltipUtil:HideTooltip();
|
|
ViewUpdator:ReleaseLastFocus();
|
|
ViewUpdator:PlayTabTransition(true);
|
|
AlertUtil:HideAlert();
|
|
|
|
if TabUtil.activeTab == 2 and FavUtil.requireUpdate then
|
|
TabUtil:ShowFavorites();
|
|
end
|
|
end
|
|
|
|
function NarciWeaponBrowserMixin:GoToWeapons()
|
|
--self.HomePage:Hide();
|
|
self.Header.SearchBox:Hide();
|
|
self.Header.SearchTrigger:Hide();
|
|
self.Header.Tab2Label:Show();
|
|
self.Header.HomeButton:Show();
|
|
self.WeaponContainer:Show();
|
|
ViewUpdator:UpdateReference();
|
|
ViewUpdator:ForceUpdate();
|
|
ViewUpdator:PlayTabTransition(false);
|
|
end
|
|
|
|
function NarciWeaponBrowserMixin:GoToSearch()
|
|
ViewUpdator:UpdateReference();
|
|
DataProvider.weaponList = DataProvider.searchResult or {};
|
|
ViewUpdator:SetScrollRange(DataProvider.numMacthes or 0);
|
|
--self.HomePage:Hide();
|
|
self.Header.SearchBox:Show();
|
|
self.Header.SearchTrigger:Hide();
|
|
self.Header.Tab2Label:Hide();
|
|
self.Header.HomeButton:Show();
|
|
self.WeaponContainer:Show();
|
|
ViewUpdator:ForceUpdate();
|
|
TooltipUtil:HideTooltip();
|
|
ViewUpdator:PlayTabTransition(false);
|
|
end
|
|
|
|
function NarciWeaponBrowserMixin:Close()
|
|
self:Hide();
|
|
end
|
|
|
|
function NarciWeaponBrowserMixin:OnDragStart()
|
|
self:StartMoving();
|
|
end
|
|
|
|
function NarciWeaponBrowserMixin:OnDragStop()
|
|
self:StopMovingOrSizing();
|
|
ViewUpdator:UpdateReference();
|
|
end
|
|
|
|
function NarciWeaponBrowserMixin:ShowModelComparison(itemID)
|
|
if not itemID then return end; --base itemID
|
|
|
|
local frame = self.ComparisonFrame;
|
|
local fileID = DataAPI.GetItemModelFileID(itemID);
|
|
frame.Header.Title:SetText( "ModelFileID: "..fileID )
|
|
|
|
if not fileID then return end;
|
|
|
|
local items = DataAPI.GetItemsByFileID(fileID);
|
|
if not frame.models then
|
|
frame.models = {};
|
|
end
|
|
local models = frame.models;
|
|
|
|
local numItems = #items;
|
|
local MODELS_PER_PAGE = 12;
|
|
|
|
local m, id, appearanceID, skip;
|
|
local isAppearanceLogged = {};
|
|
local numUnique = 0;
|
|
for index = 1, numItems do
|
|
skip = false;
|
|
id = items[index];
|
|
appearanceID = C_TransmogCollection.GetItemInfo(id);
|
|
if appearanceID then
|
|
if isAppearanceLogged[appearanceID] then
|
|
skip = true;
|
|
else
|
|
isAppearanceLogged[appearanceID] = true;
|
|
numUnique = numUnique + 1;
|
|
end
|
|
else
|
|
numUnique = numUnique + 1;
|
|
end
|
|
|
|
if numUnique > MODELS_PER_PAGE then
|
|
numUnique = numUnique - 1;
|
|
break;
|
|
end
|
|
|
|
if not skip then
|
|
m = models[numUnique];
|
|
if not m then
|
|
local i = numUnique;
|
|
m = CreateFrame("Button", nil, frame, "NarciWeaponComparisonTemplate");
|
|
models[i] = m;
|
|
local row = math.ceil(i / 3);
|
|
local col = i - (row - 1) * 3;
|
|
m:ClearAllPoints();
|
|
m:SetPoint("TOPLEFT", frame, "TOPLEFT", 192*(col - 1), -16 - 90*(row-1) );
|
|
end
|
|
m:SetComparisonItem(id, itemID);
|
|
end
|
|
end
|
|
|
|
for i = numUnique + 1, MODELS_PER_PAGE do
|
|
m = models[i];
|
|
if m then
|
|
m:SetItem();
|
|
else
|
|
break;
|
|
end
|
|
end
|
|
|
|
frame:Show();
|
|
end
|
|
|
|
|
|
function NarciWeaponBrowserMixin:ToggleShadow()
|
|
self.isShadowEnabled = not self.isShadowEnabled;
|
|
ViewUpdator:EnableShadow(self.isShadowEnabled)
|
|
end
|
|
--/run Narci_WeaponBrowser:ToggleShadow();
|
|
|
|
function NarciWeaponBrowserMixin:RefreshingCurrentList()
|
|
|
|
end
|
|
|
|
function NarciWeaponBrowserMixin:ChangeActiveModelType(widgetType)
|
|
local checkTryOn;
|
|
if widgetType == 1 then
|
|
checkTryOn = true;
|
|
else
|
|
checkTryOn = false;
|
|
end
|
|
|
|
if self.Load then
|
|
TRY_ON_CHECK = checkTryOn;
|
|
else
|
|
|
|
if checkTryOn ~= TRY_ON_CHECK then
|
|
TRY_ON_CHECK = checkTryOn;
|
|
ViewUpdator:RecolorCurrentList();
|
|
end
|
|
end
|
|
end
|
|
|
|
function NarciWeaponBrowserMixin:OnHide()
|
|
self:Hide();
|
|
self.ComparisonFrame:Hide();
|
|
self.GuideFrame:Hide();
|
|
end
|
|
|
|
function NarciWeaponBrowserMixin:ShowGuide()
|
|
self.GuideFrame:SetAlpha(0);
|
|
FadeFrame(self.GuideFrame, 0.2, 1);
|
|
end
|
|
------------------------------------------------------------------
|
|
NarciWeaponTabButtonMixin = {};
|
|
|
|
function NarciWeaponTabButtonMixin:Init(tabID)
|
|
self.tabID = tabID;
|
|
if not TabUtil.tabButtons then
|
|
TabUtil.tabButtons = {};
|
|
end
|
|
|
|
tinsert(TabUtil.tabButtons, self);
|
|
|
|
if tabID == 1 then
|
|
self.ButtonText:SetText(VIDEO_OPTIONS_EVERYTHING);
|
|
elseif tabID == 2 then
|
|
self.ButtonText:SetText( (FAVORITES or "Favorites") );
|
|
end
|
|
|
|
self.ButtonText:SetWidth( self:GetWidth() - 8 );
|
|
|
|
self.Init = nil;
|
|
end
|
|
|
|
function NarciWeaponTabButtonMixin:OnEnter()
|
|
self.ButtonText:SetTextColor(0.8, 0.8, 0.8);
|
|
end
|
|
|
|
function NarciWeaponTabButtonMixin:OnLeave()
|
|
self.ButtonText:SetTextColor(0.35, 0.35, 0.35);
|
|
end
|
|
|
|
function NarciWeaponTabButtonMixin:OnMouseUp()
|
|
self.ButtonText:SetPoint("CENTER", 0, 0);
|
|
end
|
|
|
|
function NarciWeaponTabButtonMixin:OnMouseDown()
|
|
self.ButtonText:SetPoint("CENTER", 0, -1);
|
|
end
|
|
|
|
function NarciWeaponTabButtonMixin:OnClick()
|
|
if TabUtil.activeTab ~= self.tabID then
|
|
TabUtil.activeTab = self.tabID;
|
|
for i = 1, #TabUtil.tabButtons do
|
|
TabUtil.tabButtons[i]:UpdateVisual();
|
|
end
|
|
|
|
if self.tabID == 1 then
|
|
TabUtil:ShowEverything();
|
|
elseif self.tabID == 2 then
|
|
TabUtil:ShowFavorites();
|
|
end
|
|
end
|
|
end
|
|
|
|
function NarciWeaponTabButtonMixin:UpdateVisual()
|
|
if TabUtil.activeTab == self.tabID then
|
|
self:Disable();
|
|
if self.tabID == 1 then
|
|
self.ButtonText:SetTextColor(0.24, 0.52, 0.55);
|
|
else
|
|
self.ButtonText:SetTextColor(0.7, 0.57, 0.18);
|
|
end
|
|
self.Background:Hide();
|
|
self.HighlightBorder:Show();
|
|
--FadeFrame(self.Background, 0.12, 0);
|
|
self:OnMouseDown();
|
|
else
|
|
self:Enable();
|
|
self.ButtonText:SetTextColor(0.35, 0.35, 0.35);
|
|
self.Background:Show();
|
|
self.HighlightBorder:Hide();
|
|
--FadeFrame(self.Background, 0.15, 1);
|
|
self:OnMouseUp()
|
|
end
|
|
end
|
|
|
|
------------------------------------------------------------------------
|
|
DataProvider.specialItemZoomDistance = {
|
|
--[fileID] = distance
|
|
[3846175] = 6,
|
|
[3620241] = 8,
|
|
[4323001] = 7,
|
|
[3996209] = 8,
|
|
[3813079] = 7,
|
|
|
|
[3562415] = 3.5, --Reven Dagger AGI
|
|
[294450] = 7.5, --Lance
|
|
[3587362] = 6.5, --Fae Glaive
|
|
[3515407] = 6, --Fist
|
|
[252284] = 5, --Foam Sword
|
|
[147035] = 3, --Potion
|
|
[147029] = 3, --Vial
|
|
|
|
[146970] = 2.5, --Flower
|
|
[146974] = 2.5, --Flower
|
|
[146978] = 2.5, --Flower
|
|
[146982] = 2.5, --Flower
|
|
[146990] = 2.5, --Flower
|
|
|
|
[146950] = 2.5, --Bottle
|
|
[146955] = 2.5, --Bottle
|
|
|
|
[3734213] = 5.5, --Maw 2H Sword
|
|
[2741338] = 5.5, --Ankoan Great Cleaver
|
|
[1373498] = 6, --Felborne Staff
|
|
[1305005] = 6, --Nightborne Sword
|
|
|
|
[3307325] = 5.5, --Remornia
|
|
[147996] = 6, --Maiev's Blade
|
|
[147257] = 6, --Hellfire Polearm
|
|
[114217] = 7, --Naga Spear
|
|
[3486056] = 6, --Maldraxxus Polearm
|
|
[3260377] = 7, --Archon's Spear
|
|
[2909741] = 6, --Mechagon Fishing Pole
|
|
[1340861] = 6.5, --Artifact Fish
|
|
[238795] = 5, --Jeweled Fish
|
|
[2267316] = 6, --Tyrande's Glaive
|
|
[1536191] = 7, --Mo'arg
|
|
[1240191] = 7, --Mo'arg
|
|
|
|
[1900900] = 4, --Pistol
|
|
[1321556] = 4, --Pistol
|
|
[148583] = 3, --Throwing Glaive
|
|
[148575] = 3, --Throwing Glaive
|
|
[148579] = 3, --Throwing Glaive
|
|
|
|
[147080] = 5, --Broom
|
|
[1709375] = 6, --Mop
|
|
[2887299] = 5.5, --Thrall Axe
|
|
[1678516] = 6, --Paddle
|
|
[1598037] = 7, --Immortal Mace
|
|
|
|
[135129] = 6, --Harpoon
|
|
[42507] = 6,
|
|
[160435] = 6, --Kultiras Harpoon
|
|
[144607] = 5, --Pick
|
|
[3235091] = 3.5, --Revendreth Vial
|
|
[3259852] = 3, --Revendreth Crystal
|
|
[929895] = 3.5, --Crystal
|
|
|
|
[3615913] = 4.5,
|
|
[2837989] = 6,
|
|
[3159878] = 6,
|
|
[1107166] = 6,
|
|
[1568517] = 6.5, --Sentinel's Glaive
|
|
[2097231] = 6, --Dark Iron Shield
|
|
[146376] = 5, --Voodoo Hexblade
|
|
[462667] = 7, --Banner
|
|
[462668] = 7,
|
|
[1634861] = 5.5, --Pick
|
|
[1064752] = 5.5, --Pick
|
|
[3511043] = 5.5, --Revendreth Lantern
|
|
[3257381] = 5.5, --Lantern
|
|
[2976753] = 6, --N'Zoth Shield
|
|
[2905985] = 6, --Naga Shield
|
|
[2905995] = 6.5, --Naga Shield
|
|
[3580503] = 8.5,
|
|
[3566444] = 7.5,
|
|
[1028009] = 7,
|
|
[1028010] = 7,
|
|
[1028011] = 7,
|
|
[1028012] = 7,
|
|
[147611] = 6,
|
|
[147505] = 6,
|
|
[3195516] = 7,
|
|
|
|
[3955579] = 7,
|
|
[3949874] = 20,
|
|
[3620241] = 7,
|
|
[3615460] = 6.5,
|
|
[4064752] = 6.5,
|
|
[3597245] = 6,
|
|
[3754266] = 5.5,
|
|
};
|
|
|
|
DataProvider.specialItemCameraOffset = {
|
|
[3885243] = 8,
|
|
[3620241] = 4,
|
|
[4323001] = 16,
|
|
[3813079] = 6,
|
|
[531010] = 12,
|
|
[3511043] = 26, --Revendreth Lantern
|
|
[3257381] = 26, --Lantern
|
|
[3191966] = -16, --Lantern
|
|
[3562415] = 8, --Revendreth Dagger
|
|
[3066367] = 10, --Nzoth Dagger
|
|
[853141] = 12, --Grievous Gladiator's Shanker
|
|
[1543574] = 8, --Sargeras Sword
|
|
[3482550] = 12, --Revendreth 2H Sword
|
|
[1340861] = 6, --Fishing Artifact
|
|
[2004589] = -8, --Uldir Fist
|
|
[1709375] = 12, --Mop
|
|
[1117094] = 8, --Ashbringer
|
|
[3566444] = 6,
|
|
[1305009] = -8, --Nightborne Shield
|
|
[1269880] = 12, --Nightborne Sword
|
|
[3994706] = 32,
|
|
[3621054] = 32,
|
|
[3951950] = -8,
|
|
[3621079] = 8,
|
|
[3754266] = -4,
|
|
[4051695] = 8,
|
|
};
|
|
|
|
|
|
--Development
|
|
--[[
|
|
local function Round4(num)
|
|
return floor(num*1000 + 0.5)/1000
|
|
end
|
|
|
|
function Narci_SaveModelInfo(self)
|
|
local model = self:GetParent().WeaponModel;
|
|
local camX, camY, camZ = model:GetCameraPosition();
|
|
local facing = model:GetFacing();
|
|
local x, y, z = model:GetPosition();
|
|
camX, camY, camZ = Round4(camX), Round4(camY), Round4(camZ);
|
|
x, y, z = Round4(x), Round4(y), Round4(z);
|
|
facing = Round4(facing);
|
|
|
|
if not NarciDevToolOutput then
|
|
NarciDevToolOutput = {};
|
|
end
|
|
if not NarciDevToolOutput.weaponInfo then
|
|
NarciDevToolOutput.weaponInfo = {};
|
|
end
|
|
local db = NarciDevToolOutput.weaponInfo;
|
|
db[model.itemID] = {model.itemID, facing, {camX, camY, camZ}, {x, y, z}};
|
|
print("Model Info Saved!")
|
|
end
|
|
|
|
function Narci_LoadModelInfo(self)
|
|
local model = self:GetParent().WeaponModel;
|
|
local data = NarciDevToolOutput.weaponInfo[model.itemID];
|
|
if data then
|
|
model:SetFacing(data[2]);
|
|
model:SetCameraPosition(unpack(data[3]));
|
|
model:SetPosition(unpack(data[4]));
|
|
print("Load Model Info")
|
|
end
|
|
end
|
|
--]]
|
|
|
|
--------------------------
|
|
--Special
|
|
--[[
|
|
115283 Light Hammer
|
|
108736 Green Enchant Pick
|
|
182161 Stone Hammer
|
|
33604 Plague Shooter
|
|
|
|
67108 Lord Crowley's Old Spectacles
|
|
52487 Jeweler's Amber Monocle 52486 52485
|
|
47163 47164
|
|
63277 Mask 63278 105957
|
|
79784 Heml
|
|
|
|
|
|
--]]
|
|
|
|
--[[
|
|
/script local m=TestFrame.WeaponModel;m:SetItem(176455);m.itemID=176455;
|
|
/run TestFrame.WeaponModel:SetLight(true, false, 0.21, -0.49, -0.84, 1, 0.5, 0.5, 0.5, 1, 1, 1, 1)
|
|
|
|
function SetMountByDisplayID(displayID)
|
|
local animID = 91;
|
|
local isSelfMount = false;
|
|
local disablePlayerMountPreview = false;
|
|
|
|
local frame = MountJournal.MountDisplay;
|
|
local mountActor = MountJournal.MountDisplay.ModelScene:GetActorByTag("unwrapped");
|
|
if mountActor then
|
|
mountActor:SetModelByCreatureDisplayID(displayID);
|
|
mountActor:SetAnimationBlendOperation(0);
|
|
mountActor:SetAnimation(0);
|
|
frame.ModelScene:AttachPlayerToMount(mountActor, animID, isSelfMount, disablePlayerMountPreview);
|
|
end
|
|
end
|
|
--]]
|