Last active
August 29, 2015 14:22
-
-
Save mpavlinsky/b86e8518abd65217cd8e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- AI Research Grid Addon for Elder Scrolls Online | |
-- Author: Stormknight/LCAmethyst | |
-- "All" and "Relative" functionality by His Dad | |
-- Dwemer Motif by rkuhnjr | |
-- Dwemer Motif By garkin | |
-- French Translation by Motsah | |
local _ | |
AIRG = {} | |
AIRG.name = "AIResearchGrid" | |
AIRG.version = "3.2.10" | |
AIRG.initialised = false | |
AIRG.processing = false | |
AIRG.all = " #ALL" -- Default displayname for Virtual character, overrwritten by Localised version | |
AIRG.ShowRelative = false -- State of Button | |
AIRG.relative= {} | |
AIRG.L = {} -- declare language strings | |
-- Set-up the defaults options for saved variables. | |
AIRG.defaults = { | |
data = {}, | |
styles = {}, | |
showMotifs = true, | |
} | |
function AIRG.PlayerActivated() | |
-- somehow somewhere it sometimes happens that the data is not correct completely for whatever reason | |
-- so we force a reload of the current character data when we are actually loaded into the world. | |
AIRG.PopulateMatrix() | |
AIRG.PopulateStyleData() | |
AIRG.DisplayStyles() | |
AIRG.PopulateAll() -- do last | |
end | |
function AIRG.ToggleMainWindow() | |
if (AIResearchGrid:IsHidden()) then | |
AIRG.OnCraftSelected() -- Redisplay data for the current profession | |
SetGameCameraUIMode(true) -- Enable mouse pointer | |
AIResearchGrid:SetHidden(false) -- Display the addon | |
AIRG.OnCharacterSelect() | |
else | |
SetGameCameraUIMode(false) -- Enable mouse pointer | |
AIResearchGrid:SetHidden(true) -- Display the addon | |
end | |
end -- AIRG.ToggleMainWindow | |
-- Invoked by EVENT_SMITHING_TRAIT_RESEARCH_STARTED | |
-- (integer eventCode, integer craftingSkillType, luaindex researchLineIndex, luaindex traitIndex) | |
function AIRG.ResearchStarted(eventCode, craftingSkillType, researchLineIndex, traitIndex) | |
AIRG.PopulateMatrix() | |
AIRG.PopulateAll() | |
AIRG.OnCraftSelected() -- Redisplay data for the current profession | |
end -- AIRG.ResearchStarted | |
-- Invoked by EVENT_SMITHING_TRAIT_RESEARCH_COMPLETED | |
-- (integer eventCode, integer craftingSkillType, luaindex researchLineIndex, luaindex traitIndex) | |
function AIRG.ResearchCompleted() | |
AIRG.PopulateMatrix() | |
AIRG.PopulateAll() | |
AIRG.OnCraftSelected() -- Redisplay data for the current profession | |
end -- AIRG.ResearchEnded | |
function AIRG.StyleLearned(eventCode, styleIndex) | |
AIRG.PopulateStyleData() | |
AIRG.DisplayStyles() | |
AIRG.PopulateAll() | |
end -- AIRG.StyleLearned | |
-- Invoked from AIRG.Initialise but lengthy so in it's own function to not clutter Initialise | |
function AIRG.initUI() | |
-- Some local variable declaration | |
local i, j -- used in for loops | |
local thisTrait, tType, tDesc, rowNum, charName | |
-- Initialise a table to hold all the lua generated components | |
AIRG.UI = {} | |
-- Set the main window title | |
AIRG.UI.WindowTitle = WINDOW_MANAGER:CreateControl("AIResearchGridWindowTitle", AIResearchGrid, CT_LABEL) | |
AIRG.UI.WindowTitle:SetAnchor(TOPLEFT, AIResearchGrid, TOPLEFT, 0, 0) | |
AIRG.UI.WindowTitle:SetFont("ZoFontAnnounceMedium") | |
AIRG.UI.WindowTitle:SetHorizontalAlignment(TEXT_ALIGN_LEFT) | |
AIRG.UI.WindowTitle:SetText("|c8080ffAI|r RESEARCH GRID") | |
-- Set the main window subtitle | |
AIRG.UI.WindowSubTitle = WINDOW_MANAGER:CreateControl("AIResearchGridWindowSubTitle", AIResearchGrid, CT_LABEL) | |
AIRG.UI.WindowSubTitle:SetAnchor(LEFT, AIRG.UI.WindowTitle, RIGHT, 10, 0) | |
AIRG.UI.WindowSubTitle:SetFont("ZoFontAnnounceMedium") | |
AIRG.UI.WindowSubTitle:SetHorizontalAlignment(TEXT_ALIGN_LEFT) | |
AIRG.UI.WindowSubTitle:SetColor(0, 1, 0, 1); -- green | |
AIRG.UI.WindowSubTitle:SetText("") | |
-- Nice little line under the main title | |
-- ## Check is htis showing right? | |
AIRG.UI.TopDivider = WINDOW_MANAGER:CreateControl("AIResearchGridTopDivider", AIResearchGrid, CT_TEXTURE) | |
AIRG.UI.TopDivider:SetDimensions(760, 5) | |
AIRG.UI.TopDivider:SetAnchor(TOPLEFT, AIResearchGrid, TOPLEFT, 0, 32) | |
AIRG.UI.TopDivider:SetTexture("/esoui/art/quest/questjournal_divider.dds") | |
-- Nice little line under the grid | |
AIRG.UI.BottomDivider = WINDOW_MANAGER:CreateControl("AIResearchGridBottomDivider", AIResearchGrid, CT_TEXTURE) | |
AIRG.UI.BottomDivider:SetDimensions(760, 5) | |
AIRG.UI.BottomDivider:SetAnchor(TOPLEFT, AIResearchGrid, TOPLEFT, 0, 636) | |
AIRG.UI.BottomDivider:SetTexture("/esoui/art/quest/questjournal_divider.dds") | |
AIRG.UI.BottomDivider:SetHidden(not AIRG.vars.showMotifs) | |
-- CREATE BUTTON FOR CLOSE ADDON AT TOP_RIGHT | |
AIRG.UI.btnCloseAddonFrame = WINDOW_MANAGER:CreateControl("AIResearchGridButtonCloseAddon", AIResearchGrid, CT_BUTTON) | |
AIRG.UI.btnCloseAddonFrame:SetDimensions(28, 28) | |
AIRG.UI.btnCloseAddonFrame:SetAnchor(TOPRIGHT, AIResearchGrid, TOPRIGHT, 5 , 0) | |
AIRG.UI.btnCloseAddonFrame:SetState(BSTATE_NORMAL) | |
AIRG.UI.btnCloseAddonFrame:SetMouseOverBlendMode(0) | |
-- AIRG.UI.btnCloseAddonFrame:SetHidden(false) | |
AIRG.UI.btnCloseAddonFrame:SetEnabled(true) | |
-- AIRG.UI.btnCloseAddonFrame:SetClickSound(SOUNDS.WOODWORKER_EXTRACTED_BOOSTER) | |
AIRG.UI.btnCloseAddonFrame:SetNormalTexture("/esoui/art/buttons/clearslot_down.dds") | |
AIRG.UI.btnCloseAddonFrame:SetMouseOverTexture("/esoui/art/buttons/clearslot_up.dds") | |
AIRG.UI.btnCloseAddonFrame:SetHandler("OnClicked", function(self) AIRG.ToggleMainWindow() end) | |
-- CREATE the DROPDOWN BOX for CHARACTER SELECT | |
-- Uses code based on example from Seerah | |
AIRG.UI.charDropdown = WINDOW_MANAGER:CreateControlFromVirtual("AIResearchGridDropdownCharacter", AIResearchGrid, "ZO_StatsDropdownRow") | |
AIRG.UI.charDropdown:SetWidth(205) -- Defaults to 607!!! | |
AIRG.UI.charDropdown:SetAnchor(TOPRIGHT, AIResearchGrid, TOPRIGHT, -32, 0) | |
AIRG.UI.charDropdown:GetNamedChild("Dropdown"):SetWidth(200) | |
AIRG.UI.charDropdown.dropdown:SetSelectedItem(AIRG.curCharacter) -- Set the current character as selected | |
local function OnItemSelect(_, choiceText, choice) --this is the callback function for when an item gets selected in the dropdown | |
AIRG.OnCharacterSelect(choiceText) | |
end | |
for charName, _ in pairs(AIRG.vars.data) do | |
local entry = AIRG.UI.charDropdown.dropdown:CreateItemEntry(charName, OnItemSelect) | |
AIRG.UI.charDropdown.dropdown:AddItem(entry) | |
end | |
-- CREATE BUTTON FOR "Relative to" AT TOP_RIGHT | |
AIRG.UI.btnUpdateOther = WINDOW_MANAGER:CreateControlFromVirtual("AIResearchGridButtonUpdateOther", AIResearchGrid, "ZO_DefaultButton") | |
--Attempt to adjust button size to content, but units are different. May not be fixable. leave for meantime. | |
local textlen = 0 | |
if string.len(AIRG.L["btnRelativeOn"]) > string.len(AIRG.L["btnRelativeOff"]) | |
then textlen = string.len(AIRG.L["btnRelativeOn"]) | |
else textlen = string.len(AIRG.L["btnRelativeOff"]) | |
end | |
AIRG.UI.btnUpdateOther:SetDimensions(140+textlen, 30) | |
AIRG.UI.btnUpdateOther:SetAnchor(RIGHT, AIRG.UI.charDropdown, LEFT, 0, 0) | |
AIRG.UI.btnUpdateOther:SetState(BSTATE_NORMAL) | |
AIRG.UI.btnUpdateOther:SetMouseOverBlendMode(0) | |
-- AIRG.UI.btnUpdateOther:SetNormalTexture("/esoui/art/icons/ability_tradecraft_008.dds") | |
AIRG.UI.btnUpdateOther:SetMouseOverTexture("ESOUI/art/buttons/generic_highlight.dds") | |
AIRG.UI.btnUpdateOther:SetClickSound("Click") | |
AIRG.UI.btnUpdateOther:SetDisabledFontColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA()) | |
AIRG.UI.btnUpdateOther:SetFont("ZoFontGame") | |
AIRG.UI.btnUpdateOther:SetText(AIRG.L["btnRelativeOff"]) | |
AIRG.UI.btnUpdateOther:SetEnabled(false) -- starts pointing to current character, which can't use this | |
AIRG.UI.btnUpdateOther:SetHidden(false) | |
-- enabled at end of function | |
AIRG.UI.btnUpdateOther:SetHandler("OnClicked", | |
function(self) | |
AIRG.ShowRelative = not AIRG.ShowRelative | |
if AIRG.ShowRelative | |
then self:SetText(AIRG.L["btnRelativeOn"]) -- Lime green | |
-- else self:SetText(AIRG.btnUpdateOtherText1 ) | |
else self:SetText(AIRG.L["btnRelativeOff"]) | |
end | |
AIRG.OnCraftSelected() --redisplay | |
end) | |
-- The following have caused bugs to be reported, that I can't duplicate. As there is no tooltip text, disable it entirely. | |
-- AIRG.UI.btnUpdateOther:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter) | |
-- AIRG.UI.btnUpdateOther:SetHandler("OnMouseExit", ZO_Options_OnMouseExit) | |
AIRG.UI.btnUpdateOther:SetMouseEnabled(true) | |
-- CREATE BUTTON FOR PROFESSION: BLACKSMITHING | |
AIRG.UI.btnBlacksmithing = WINDOW_MANAGER:CreateControl("AIResearchGridButtonBlacksmithing", AIResearchGrid, CT_BUTTON) | |
AIRG.UI.btnBlacksmithing:SetDimensions(48, 48) | |
AIRG.UI.btnBlacksmithing:SetAnchor(TOPLEFT, AIResearchGrid, TOPLEFT, 8 , 44) | |
AIRG.UI.btnBlacksmithing:SetState(BSTATE_NORMAL) | |
AIRG.UI.btnBlacksmithing:SetMouseOverBlendMode(0) | |
AIRG.UI.btnBlacksmithing:SetHidden(false) | |
AIRG.UI.btnBlacksmithing:SetEnabled(true) | |
AIRG.UI.btnBlacksmithing:SetClickSound(SOUNDS.WOODWORKER_EXTRACTED_BOOSTER) | |
AIRG.UI.btnBlacksmithing:SetNormalTexture("/esoui/art/icons/ability_smith_007.dds") | |
AIRG.UI.btnBlacksmithing:SetMouseOverTexture("ESOUI/art/buttons/generic_highlight.dds") | |
AIRG.UI.btnBlacksmithing:SetHandler("OnClicked", function(self) AIRG:OnCraftSelected(CRAFTING_TYPE_BLACKSMITHING) end) | |
-- CREATE BUTTON FOR PROFESSION: WOODWORKING | |
AIRG.UI.btnWoodworking = WINDOW_MANAGER:CreateControl("AIResearchGridButtonWoodworking", AIResearchGrid, CT_BUTTON) | |
AIRG.UI.btnWoodworking:SetDimensions(48, 48) | |
AIRG.UI.btnWoodworking:SetAnchor(TOPLEFT, AIRG.UI.btnBlacksmithing, TOPRIGHT, 12 , 0) | |
AIRG.UI.btnWoodworking:SetState(BSTATE_NORMAL) | |
AIRG.UI.btnWoodworking:SetMouseOverBlendMode(0) | |
AIRG.UI.btnWoodworking:SetHidden(false) | |
AIRG.UI.btnWoodworking:SetEnabled(true) | |
AIRG.UI.btnWoodworking:SetClickSound(SOUNDS.BLACKSMITH_EXTRACTED_BOOSTER) | |
AIRG.UI.btnWoodworking:SetNormalTexture("/esoui/art/icons/ability_tradecraft_009.dds") | |
AIRG.UI.btnWoodworking:SetMouseOverTexture("ESOUI/art/buttons/generic_highlight.dds") | |
AIRG.UI.btnWoodworking:SetHandler("OnClicked", function(self) AIRG:OnCraftSelected(CRAFTING_TYPE_WOODWORKING) end) | |
-- CREATE BUTTON FOR PROFESSION: CLOTHING | |
AIRG.UI.btnClothing = WINDOW_MANAGER:CreateControl("AIResearchGridButtonClothing", AIResearchGrid, CT_BUTTON) | |
AIRG.UI.btnClothing:SetDimensions(48, 48) | |
AIRG.UI.btnClothing:SetAnchor(TOPLEFT, AIRG.UI.btnWoodworking, TOPRIGHT, 12 , 0) | |
AIRG.UI.btnClothing:SetState(BSTATE_NORMAL) | |
AIRG.UI.btnClothing:SetMouseOverBlendMode(0) | |
AIRG.UI.btnClothing:SetHidden(false) | |
AIRG.UI.btnClothing:SetEnabled(true) | |
AIRG.UI.btnClothing:SetClickSound(SOUNDS.CLOTHIER_EXTRACTED_BOOSTER) | |
AIRG.UI.btnClothing:SetNormalTexture("/esoui/art/icons/ability_tradecraft_008.dds") | |
AIRG.UI.btnClothing:SetMouseOverTexture("ESOUI/art/buttons/generic_highlight.dds") | |
AIRG.UI.btnClothing:SetHandler("OnClicked", function(self) AIRG:OnCraftSelected(CRAFTING_TYPE_CLOTHIER) end) | |
-- BUILD THE TRAIT LABELS ON THE LEFT-SIDE using built-in language strings | |
AIRG.UI.rowLabels = {} | |
for thisTrait, j in pairs(AIRG.gridTraits) do | |
AIRG.UI.rowLabels[j] = WINDOW_MANAGER:CreateControl("AIResearchGridRowLabel" .. tostring(j), AIResearchGrid, CT_LABEL) | |
AIRG.UI.rowLabels[j]:SetAnchor(TOPLEFT, AIResearchGrid, TOPLEFT, 5, 28*j + 70) | |
AIRG.UI.rowLabels[j]:SetText(GetString("SI_ITEMTRAITTYPE",thisTrait)) -- This is the text displayed on the screen as it's a label | |
AIRG.UI.rowLabels[j]:SetDimensions(180, 24) | |
AIRG.UI.rowLabels[j]:SetFont("ZoFontGame") | |
AIRG.UI.rowLabels[j]:SetHorizontalAlignment(TEXT_ALIGN_RIGHT) | |
AIRG.UI.rowLabels[j]:SetVerticalAlignment(TEXT_ALIGN_CENTER) | |
AIRG.UI.rowLabels[j]:SetMouseEnabled(true) | |
AIRG.UI.rowLabels[j]:SetHandler("OnMouseEnter", function (self) | |
ZO_Tooltips_ShowTextTooltip(self, TOP, self.tooltipText) | |
end) | |
AIRG.UI.rowLabels[j]:SetHandler("OnMouseExit", function (self) | |
ZO_Tooltips_HideTextTooltip() | |
end) | |
end | |
-- Now add tooltip text to the row labels. | |
-- The tooltip functionality is automatic as part of the label control. | |
for j = 1, 9 do | |
tType, tDesc, _ = GetSmithingResearchLineTraitInfo(CRAFTING_TYPE_BLACKSMITHING,1,j) -- weapons | |
rowNum = AIRG.gridTraits[tType] | |
AIRG.UI.rowLabels[rowNum].tooltipText = tDesc | |
tType, tDesc, _ = GetSmithingResearchLineTraitInfo(CRAFTING_TYPE_BLACKSMITHING,9,j) -- armour | |
rowNum = AIRG.gridTraits[tType] | |
AIRG.UI.rowLabels[rowNum].tooltipText = tDesc | |
end | |
-- BUILD THE COLUMNS & GRID | |
-- Determine the maximum number of item types across all three professions. This is currently always 14 | |
AIRG.maxColumns= math.max(GetNumSmithingResearchLines(CRAFTING_TYPE_BLACKSMITHING), | |
GetNumSmithingResearchLines(CRAFTING_TYPE_CLOTHIER), | |
GetNumSmithingResearchLines(CRAFTING_TYPE_WOODWORKING)) | |
AIRG.UI.columnButtons = {} | |
AIRG.UI.gridButtons = {} | |
AIRG.UI.columnFooters = {} | |
for i = 1, AIRG.maxColumns do | |
-- BUILD THE COLUMN BUTTONS | |
AIRG.UI.columnButtons[i] = WINDOW_MANAGER:CreateControl("AIResearchGridHeaderButton" .. tostring(i), AIResearchGrid, CT_BUTTON) | |
AIRG.UI.columnButtons[i]:SetDimensions(36, 36) | |
AIRG.UI.columnButtons[i]:SetState(BSTATE_NORMAL) | |
AIRG.UI.columnButtons[i]:SetAnchor(TOPLEFT, AIResearchGrid, TOPLEFT, 40*i + 150, 55) | |
AIRG.UI.columnButtons[i]:SetHidden(true) | |
AIRG.UI.columnButtons[i]:SetEnabled(true) | |
AIRG.UI.columnButtons[i]:SetMouseOverTexture("ESOUI/art/buttons/generic_highlight.dds") | |
AIRG.UI.columnButtons[i].text = i | |
AIRG.UI.columnButtons[i]:SetHandler("OnMouseEnter", function (self) | |
ZO_Tooltips_ShowTextTooltip(self, TOP, self.text) | |
end) | |
AIRG.UI.columnButtons[i]:SetHandler("OnMouseExit", function (self) | |
ZO_Tooltips_HideTextTooltip() | |
end) | |
-- BUILD THE GRID | |
-- There are a total of 18 traits possible. 9 armour and 9 weapon (Infused, Training and Nirnhoned on both) | |
AIRG.UI.gridButtons[i] = {} | |
for j = 1, 18 do | |
AIRG.UI.gridButtons[i][j] = WINDOW_MANAGER:CreateControl("AIResearchGridGridButton" .. tostring(i) .. "x" .. tostring(j), AIResearchGrid, CT_TEXTURE) | |
AIRG.UI.gridButtons[i][j]:SetDimensions(24, 24) | |
AIRG.UI.gridButtons[i][j]:SetAnchor(TOP, AIRG.UI.columnButtons[i], BOTTOM, 0, 28*j -20) | |
AIRG.UI.gridButtons[i][j]:SetTexture("/esoui/art/buttons/swatchframe_down.dds") -- little square box | |
AIRG.UI.gridButtons[i][j]:SetColor(1, 1, 1, 0.4) | |
AIRG.UI.gridButtons[i][j]:SetHidden(false) | |
AIRG.UI.gridButtons[i][j]:SetMouseEnabled(false) | |
-- Following tooltip code uses ideas contributed by Krysstof | |
AIRG.UI.gridButtons[i][j]:SetHandler("OnMouseEnter", function (self) | |
if (self.tooltipText > 0) then -- Check the item is being researched and has a timestamp | |
local tRemaining = tonumber(self.tooltipText) - GetTimeStamp() | |
local tFormatted = FormatTimeSeconds(tRemaining, TIME_FORMAT_STYLE_DESCRIPTIVE_SHORT, TIME_FORMAT_PRECISION_SECONDS, TIME_FORMAT_DIRECTION_DESCENDING) | |
ZO_Tooltips_ShowTextTooltip(self, RIGHT, tFormatted) | |
-- loop with "registerforupdate" once per second | |
EVENT_MANAGER:RegisterForUpdate(self.name, 1000, function() | |
local tRemaining = tonumber(self.tooltipText) - GetTimeStamp() | |
local tFormatted = FormatTimeSeconds(tRemaining, TIME_FORMAT_STYLE_DESCRIPTIVE_SHORT, TIME_FORMAT_PRECISION_SECONDS, TIME_FORMAT_DIRECTION_DESCENDING) | |
ZO_Tooltips_ShowTextTooltip(self, RIGHT, tFormatted) | |
end) | |
end | |
end) | |
AIRG.UI.gridButtons[i][j]:SetHandler("OnMouseExit", function (self) | |
-- unregister the update event or it keeps on displaying | |
EVENT_MANAGER:UnregisterForUpdate(self.name) | |
ZO_Tooltips_HideTextTooltip() | |
end) | |
end | |
-- BUILD THE COLUMN FOOTERS | |
AIRG.UI.columnFooters[i] = WINDOW_MANAGER:CreateControl("AIResearchGridColumnFooterLabel" .. tostring(i), AIResearchGrid, CT_LABEL) | |
AIRG.UI.columnFooters[i]:SetAnchor(TOP, AIRG.UI.columnButtons[i], BOTTOM, 0, 516) | |
AIRG.UI.columnFooters[i]:SetDimensions(36, 24) | |
AIRG.UI.columnFooters[i]:SetFont("ZoFontGame") | |
AIRG.UI.columnFooters[i]:SetHorizontalAlignment(TEXT_ALIGN_CENTER) | |
AIRG.UI.columnFooters[i]:SetVerticalAlignment(TEXT_ALIGN_CENTER) | |
AIRG.UI.columnFooters[i]:SetColor(1, 1, 0.4, 1); -- faded yellow | |
end | |
-- BUILD LABEL FOR COLUMN FOOTER "TRAIT LINE" | |
AIRG.UI.columnFooterTitle = WINDOW_MANAGER:CreateControl("AIResearchGridColumnFooterTitleLabel", AIResearchGrid, CT_LABEL) | |
AIRG.UI.columnFooterTitle:SetAnchor(TOPLEFT, AIResearchGrid, TOPLEFT, 5, 606) | |
AIRG.UI.columnFooterTitle:SetDimensions(180, 24) | |
AIRG.UI.columnFooterTitle:SetFont("ZoFontGame") | |
AIRG.UI.columnFooterTitle:SetHorizontalAlignment(TEXT_ALIGN_RIGHT) | |
AIRG.UI.columnFooterTitle:SetVerticalAlignment(TEXT_ALIGN_CENTER) | |
AIRG.UI.columnFooterTitle:SetColor(1, 1, 0.4, 1); -- faded yellow | |
-- AIRG.UI.columnFooterTitle:SetText(GetString(SI_SMITHING_RESEARCH_LINE_HEADER)) | |
AIRG.UI.columnFooterTitle:SetText(GetString(SI_CRAFTING_COMPONENT_TOOLTIP_TRAITS)) -- "Traits" | |
-- BUILD THE MOTIF ICONS ACROSS THE BOTTOM | |
-- Note that for now, we're just setting up 15 icons and stuff is configured manually | |
-- but we can fix it later. It's not like it's going to have an overhead on processing. :) | |
-- It's set-up inside a container frame to make hiding or showing the whole lot simpler. | |
AIRG.UI.motifSection = WINDOW_MANAGER:CreateControl("AIResearchMotifSection", AIResearchGrid, CT_CONTROL) | |
AIRG.UI.motifSection:SetDimensions(760, 50) | |
AIRG.UI.motifSection:SetAnchor(BOTTOMLEFT, AIResearchGrid, BOTTOMLEFT, -40, 0) | |
AIRG.UI.motifSection:SetHidden(not AIRG.vars.showMotifs) | |
AIResearchGrid:SetHeight(AIRG.vars.showMotifs and 706 or 636) | |
AIRG.UI.motifButtons = {} | |
for i = 1, 15 do | |
AIRG.UI.motifButtons[i] = WINDOW_MANAGER:CreateControl("AIResearchGridMotifButton" .. tostring(i), AIRG.UI.motifSection, CT_TEXTURE) | |
AIRG.UI.motifButtons[i]:SetDimensions(40, 40) | |
AIRG.UI.motifButtons[i]:SetAnchor(TOPLEFT, AIRG.UI.motifSection, TOPLEFT, 42*i +124, 0) | |
AIRG.UI.motifButtons[i]:SetTexture(AIRG.styleLookupIcons[i] .. "up.dds") | |
AIRG.UI.motifButtons[i]:SetMouseEnabled(true) | |
j = AIRG.styleLookupValue[i] | |
tDesc ,_,_,_,_ = GetSmithingStyleItemInfo( AIRG.styleLookupItem[i] ) | |
AIRG.UI.motifButtons[i].tooltipText = zo_strformat("<<t:1>>\n<<t:2>>", GetString("SI_ITEMSTYLE",j), tDesc) | |
AIRG.UI.motifButtons[i]:SetHandler("OnMouseEnter", function (self) | |
ZO_Tooltips_ShowTextTooltip(self, TOP, self.tooltipText) | |
end) | |
AIRG.UI.motifButtons[i]:SetHandler("OnMouseExit", function (self) | |
ZO_Tooltips_HideTextTooltip() | |
end) | |
end | |
-- BUILD LABEL FOR STYLES | |
AIRG.UI.StyleLabel = WINDOW_MANAGER:CreateControl("AIResearchStylelabel", AIRG.UI.motifSection, CT_LABEL) | |
AIRG.UI.StyleLabel:SetAnchor(TOPLEFT, AIRG.UI.motifSection, TOPLEFT, 5, 6) | |
AIRG.UI.StyleLabel:SetText(GetString(SI_SMITHING_HEADER_STYLE)) | |
AIRG.UI.StyleLabel:SetDimensions(150, 24) | |
AIRG.UI.StyleLabel:SetFont("ZoFontGame") | |
AIRG.UI.StyleLabel:SetHorizontalAlignment(TEXT_ALIGN_RIGHT) | |
end -- AIRG.initUI | |
-- User has clicked on one of the profession buttons | |
-- or we just want to refresh the display with current data | |
function AIRG.OnCraftSelected(_,thisCraft) | |
if (thisCraft == nil) then | |
if (AIRG.curCraft == nil) then | |
return | |
else | |
thisCraft = AIRG.curCraft | |
end | |
end | |
AIRG.UI.WindowSubTitle:SetText(AIRG.craftNames[thisCraft]) | |
local i,j,busy | |
local tType,tDesc,tKnown,tRemain,rowNum,traitCount,alltraits | |
local maxLines = GetNumSmithingResearchLines(thisCraft) -- the number of columns for this profession | |
AIRG.curCraft = thisCraft | |
alltraits = 0 | |
for i = 1, AIRG.maxColumns do | |
busy = false | |
-- "blank" the grid | |
for j = 1, 18 do | |
AIRG.UI.gridButtons[i][j]:SetColor(1, 1, 1, 0.4) | |
AIRG.UI.gridButtons[i][j]:SetTexture("/esoui/art/buttons/swatchframe_down.dds") | |
AIRG.UI.gridButtons[i][j]:SetMouseEnabled(false) -- effectively disable tooltip for this grid item. | |
end | |
if (i > maxLines) then | |
AIRG.UI.columnButtons[i]:SetHidden(true) | |
AIRG.UI.columnFooters[i]:SetText("") | |
else | |
local name, icon, _, _ = GetSmithingResearchLineInfo(thisCraft, i) -- Get info on that specific item | |
AIRG.UI.columnButtons[i]:SetNormalTexture(icon) | |
AIRG.UI.columnButtons[i]:SetHidden(false) | |
AIRG.UI.columnButtons[i].text = name | |
traitCount = 0 | |
--Check for research expiry | |
for rowNum,tKnown in pairs(AIRG.vars.data[AIRG.curCharacter][thisCraft][i]) do | |
if (tKnown > 0 and tKnown < GetTimeStamp()) then | |
AIRG.vars.data[AIRG.curCharacter][thisCraft][i][rowNum] = -1 -- Change to known | |
end | |
end | |
if AIRG.ShowRelative | |
then | |
-- Great! relative mode! we need to address a matter of practical usage. | |
-- We need to see that we actually can research that now, because we can't research more than one item type at a time. | |
-- So we need to pre-check for item research and set the colours (of the texture) appropriately | |
for rowNum,tKnown in pairs(AIRG.vars.data[AIRG.curCharacter][thisCraft][i]) do | |
if (tKnown > 0) then -- researching | |
busy = true | |
end | |
end | |
for rowNum,tKnown in pairs(AIRG.relative[AIRG.curCharacter][thisCraft][i]) do | |
AIRG.UI.gridButtons[i][rowNum].tooltipText = tKnown | |
if (tKnown == -1) then -- Trait is known | |
if (busy) then | |
AIRG.UI.gridButtons[i][rowNum]:SetColor(0.7, 0.6, 0.6, .8) -- Dull Reddish | |
else | |
AIRG.UI.gridButtons[i][rowNum]:SetColor(0.2, 1, 0.2, 1) -- Green | |
end | |
AIRG.UI.gridButtons[i][rowNum]:SetTexture("/esoui/art/loot/loot_finesseitem.dds") | |
traitCount = traitCount + 1 | |
end | |
end | |
else -- not relative | |
for rowNum,tKnown in pairs(AIRG.vars.data[AIRG.curCharacter][thisCraft][i]) do | |
AIRG.UI.gridButtons[i][rowNum].tooltipText = tKnown | |
if (tKnown == -1) then -- Trait is known | |
AIRG.UI.gridButtons[i][rowNum]:SetColor(0.2, 1, 0.2, 1) -- Green | |
AIRG.UI.gridButtons[i][rowNum]:SetTexture("/esoui/art/loot/loot_finesseitem.dds") | |
traitCount = traitCount + 1 | |
elseif (tKnown > 0) then -- Trait is being researched | |
AIRG.UI.gridButtons[i][rowNum]:SetTexture("ESOUI/art/mounts/timer_icon.dds") | |
AIRG.UI.gridButtons[i][rowNum]:SetColor(0.5, 0.5, 1, 1) -- Blue | |
AIRG.UI.gridButtons[i][rowNum]:SetMouseEnabled(true) | |
else -- Trait is NOT known | |
AIRG.UI.gridButtons[i][rowNum]:SetColor(1, 0.2, 0.2, 1) -- Red | |
AIRG.UI.gridButtons[i][rowNum]:SetTexture("ESOUI/art/buttons/decline_up.dds") -- an "X". | |
end | |
end | |
end --Relative | |
AIRG.UI.columnFooters[i]:SetText(traitCount) | |
alltraits = alltraits + traitCount | |
end | |
end | |
AIRG.UI.columnFooterTitle:SetText(GetString(SI_CRAFTING_COMPONENT_TOOLTIP_TRAITS) .. "(" .. tostring(alltraits) .. ")") -- "Traits" | |
end -- AIRG:OnCraftSelected | |
-- Invoked when the user selected a character from the dropdown box | |
function AIRG.OnCharacterSelect(charName) | |
if (charName == nil) then | |
return | |
end | |
AIRG.curCharacter = charName | |
-- The Relative Button doesn't make sense if selecting these | |
if charName == AIRG.all or charName == AIRG.playerName then | |
AIRG.UI.btnUpdateOther:SetEnabled(false) | |
AIRG.ShowRelative = false | |
else | |
AIRG.UI.btnUpdateOther:SetEnabled(true) | |
end | |
AIRG.DisplayStyles() | |
AIRG.OnCraftSelected() | |
end -- AIRG.OnCharacterSelect | |
-- Deletes data for the named character from the saved data and removes them from the dropdown box. | |
function AIRG.DeleteCharacter(charName) | |
local i,item | |
-- Can't delete the current character | |
if (charName == AIRG.curCharacter) then | |
d(AIRG.L["DeleteFalse"]) | |
else | |
if (AIRG.vars.data[charName] ~= nil) then | |
AIRG.vars.data[charName] = nil | |
d(AIRG.L["DeleteTrue"] .. charName) | |
end | |
if (AIRG.vars.styles[charName] ~= nil) then | |
AIRG.vars.styles[charName] = nil | |
end | |
AIRG.PopulateAll() | |
--this part is new, Thank you Garkin | |
for i, item in ipairs(AIRG.UI.charDropdown.dropdown.m_sortedItems) do | |
if item.name == charName then | |
table.remove(AIRG.UI.charDropdown.dropdown.m_sortedItems, i) | |
break | |
end | |
end | |
AIRG.UI.charDropdown.dropdown:UpdateItems() | |
end | |
end -- AIRG.DeleteCharacter | |
-- This function cycles through all three professions and populates the data matrix for this characters | |
-- This is carried out when the addon loads to ensure the current character data is up-to-date. | |
-- The "if" logic in this function guesses at which profession should be default to display as the one with most research in. | |
function AIRG.PopulateMatrix() | |
local curCount = 0 | |
local thisCount | |
AIRG.curCraft = CRAFTING_TYPE_BLACKSMITHING --Default for new chars | |
thisCount = AIRG.CreateDataMatrix(CRAFTING_TYPE_BLACKSMITHING) | |
if (thisCount > curCount) then | |
AIRG.curCraft = CRAFTING_TYPE_BLACKSMITHING | |
curCount = thisCount | |
end | |
thisCount = AIRG.CreateDataMatrix(CRAFTING_TYPE_CLOTHIER) | |
if (thisCount > curCount) then | |
AIRG.curCraft = CRAFTING_TYPE_CLOTHIER | |
curCount = thisCount | |
end | |
thisCount = AIRG.CreateDataMatrix(CRAFTING_TYPE_WOODWORKING) | |
if (thisCount > curCount) then | |
AIRG.curCraft = CRAFTING_TYPE_WOODWORKING | |
curCount = thisCount | |
end | |
AIRG.CreateDataMatrixRelative(CRAFTING_TYPE_BLACKSMITHING) | |
AIRG.CreateDataMatrixRelative(CRAFTING_TYPE_WOODWORKING) | |
AIRG.CreateDataMatrixRelative(CRAFTING_TYPE_CLOTHIER) | |
end -- AIRG.PopulateMatrix | |
-- Lookup the style data for the current character and send it to saved vars. | |
function AIRG.PopulateStyleData() | |
for thisname, _ in pairs(AIRG.vars.data) do --iterate over all characters | |
if thisname ~= AIRG.all then --skip our virtual | |
AIRG.vars.styles[thisname] = {} -- create a table for this character's matrix | |
local i, j, known | |
for i = 1, 14 do | |
j = AIRG.styleLookupItem[i] | |
known = IsSmithingStyleKnown(j, 1) --patternIndex set to 1, temporary workaround for changes introduced in Update 4 | |
AIRG.vars.styles[thisname][i] = known | |
end | |
--Dwemer style chapters | |
AIRG.vars.styles[thisname][15] = {} | |
local itemStyle = AIRG.styleLookupItem[15] | |
for i = 1, 14 do | |
--local known = IsSmithingStyleKnown(itemStyle, i) | |
local _, numCompleted = GetAchievementCriterion(1144, i) | |
AIRG.vars.styles[thisname][15][AIRG.styleChaptersLookup[i]] = numCompleted == 1 | |
end | |
end | |
end | |
end -- AIRG.PopulateStyleData | |
-- When any character data changes we have to go through and create our virtual "All" from the beginning. | |
-- its simplified by not having to reset to unknown as traits can't be forgotton. | |
function AIRG.PopulateAll() | |
local craft, item, trait, thisname, style, known | |
for thisname, _ in pairs(AIRG.vars.data) do --iterate over all characters | |
if thisname ~= AIRG.all then --skip our virtual | |
for craft, _ in pairs(AIRG.vars.data[thisname]) do --iterate over all crafts | |
for item, _ in pairs(AIRG.vars.data[thisname][craft]) do --iterate over all weapons/armour | |
for trait, _ in pairs(AIRG.vars.data[thisname][craft][item]) do --iterate over all traits | |
if AIRG.vars.data[thisname][craft][item][trait] ~= 0 then -- researching counts as learned. | |
AIRG.vars.data[AIRG.all][craft][item][trait] = -1 | |
end | |
end | |
end | |
end | |
-- Fix crash for empty data. | |
if AIRG.vars.styles[thisname] == nil then | |
AIRG.vars.styles[thisname] = {} | |
end | |
-- Update the Styles for this char. | |
for i = 1, 14 do --iterate over all non-dwemer styles | |
if AIRG.vars.styles[thisname][i] then | |
AIRG.vars.styles[AIRG.all][i] = true | |
end | |
--Update Dwemer styles | |
for i = 1, 14 do --iterate over all dwemer items | |
if AIRG.vars.styles[thisname][15][i] then | |
AIRG.vars.styles[AIRG.all][15][i] = true | |
end | |
end | |
end | |
end | |
end | |
end -- AIRG.PopulateAll | |
-- Set the icon highlights for the currently selected character | |
function AIRG.DisplayStyles() | |
local i | |
if (AIRG.vars.styles[AIRG.curCharacter] == nil) then | |
for i = 1, 15 do | |
AIRG.UI.motifButtons[i]:SetTexture(AIRG.styleLookupIcons[i] .. "up.dds") | |
AIRG.UI.motifButtons[i]:SetColor(1, 1, 1, 0.7) -- grey | |
end | |
else | |
for i = 1, 14 do | |
if (AIRG.vars.styles[AIRG.curCharacter][i]) then | |
AIRG.UI.motifButtons[i]:SetTexture(AIRG.styleLookupIcons[i] .. "down.dds") | |
AIRG.UI.motifButtons[i]:SetColor(0.7, 1, 0.7, 1) -- Green | |
else | |
AIRG.UI.motifButtons[i]:SetTexture(AIRG.styleLookupIcons[i] .. "up.dds") | |
AIRG.UI.motifButtons[i]:SetColor(1, 1, 1, 0.7) -- grey | |
end | |
end | |
end | |
--Dwemer Motif, special case | |
--update old saved variables, if exists | |
-- AIRG.vars.styles[AIRG.curCharacter][15] = AIRG.vars.styles[AIRG.curCharacter][15] or {} | |
--making styleIndex as variable, so it will be easier to make a loop if there will be any new styles | |
local styleIndex = 15 | |
--for styleIndex = 15, maxStyleIndex do --start of the future loop | |
local tooltipText = "" | |
local knownCount = 0 | |
for i = 1, 14 do | |
--check how many chapters are known and build tooltip | |
if (AIRG.vars.styles[AIRG.curCharacter][styleIndex][i]) then | |
tooltipText = zo_strjoin(nil, tooltipText, "\n|cFFFFFF", GetString("SI_ITEMSTYLECHAPTER", i), "|r") | |
knownCount = knownCount + 1 | |
else | |
tooltipText = zo_strjoin(nil, tooltipText, "\n|c808080", GetString("SI_ITEMSTYLECHAPTER", i), "|r") | |
end | |
end | |
if knownCount == 0 then | |
AIRG.UI.motifButtons[styleIndex]:SetTexture(AIRG.styleLookupIcons[styleIndex] .. "up.dds") | |
AIRG.UI.motifButtons[styleIndex]:SetColor(1, 1, 1, 0.7) -- grey | |
else | |
AIRG.UI.motifButtons[styleIndex]:SetTexture(AIRG.styleLookupIcons[styleIndex] .. "down.dds") | |
if knownCount == 14 then | |
AIRG.UI.motifButtons[styleIndex]:SetColor(0.7, 1, 0.7, 1) -- Green | |
else | |
AIRG.UI.motifButtons[styleIndex]:SetColor(1, 1, 0.7, 1) -- yellow | |
end | |
end | |
local itemStyle = AIRG.styleLookupValue[styleIndex] | |
local tDesc = GetSmithingStyleItemLink(AIRG.styleLookupItem[styleIndex]) | |
AIRG.UI.motifButtons[styleIndex].tooltipText = zo_strjoin(nil, zo_strformat("<<t:1>> (<<2>>/14)\n<<t:3>>\n", GetString("SI_ITEMSTYLE", itemStyle), knownCount, tDesc), tooltipText) | |
--end --end of the future loop | |
end -- AIRG.DisplayStyles() | |
-- Look up all the data on this profession and commit to saved variables for this character. | |
function AIRG.CreateDataMatrix(thisCraft) -- for current player, not the selected | |
local i, j | |
local tType, tKnown, tRemain, rowNum, tTargetStamp | |
local rCount = 0 | |
local maxLines = GetNumSmithingResearchLines(thisCraft) -- the number of columns for this profession | |
AIRG.vars.data[AIRG.playerName][thisCraft] = {} -- create a table for this profession for real traits | |
-- Not relative updates, show all for Current Character | |
-- Cycle through items for this profession | |
for i = 1, maxLines do | |
AIRG.vars.data[AIRG.playerName][thisCraft][i] = {} -- create a table for this item | |
-- Cycle through the traits for this item | |
for j = 1, 9 do | |
tType,_,tKnown = GetSmithingResearchLineTraitInfo(thisCraft,i,j) | |
_,tRemain = GetSmithingResearchLineTraitTimes(thisCraft,i,j) | |
rowNum = AIRG.gridTraits[tType] | |
if (tKnown) then | |
AIRG.vars.data[AIRG.playerName][thisCraft][i][rowNum] = -1 -- this trait is known | |
rCount = rCount + 1 | |
else | |
if (tRemain) then | |
tTargetStamp = GetTimeStamp() + tRemain | |
AIRG.vars.data[AIRG.playerName][thisCraft][i][rowNum] = tTargetStamp -- this trait is being currently researched | |
-- The value we are setting this to is the timestamp for when the research will be complete. | |
else | |
AIRG.vars.data[AIRG.playerName][thisCraft][i][rowNum] = 0 -- this trait is NOT known | |
end | |
end | |
end | |
end | |
return rCount -- the total number of traits already researched in this profession | |
end -- AIRG.CreateDataMatrix | |
function AIRG.CreateDataMatrixRelative(thisCraft) -- for the current selected player, relative to the real player | |
local craft, item, trait, thisname, style, known | |
for thisname, _ in pairs(AIRG.vars.data) do --iterate over all characters | |
if thisname ~= AIRG.all then --skip our virtual | |
AIRG.relative[thisname] = {} | |
for craft, _ in pairs(AIRG.vars.data[thisname]) do --iterate over all crafts | |
AIRG.relative[thisname][craft] = {} | |
for item, _ in pairs(AIRG.vars.data[thisname][craft]) do --iterate over all weapons/armour | |
AIRG.relative[thisname][craft][item] = {} | |
for trait, _ in pairs(AIRG.vars.data[thisname][craft][item]) do --iterate over all traits | |
AIRG.relative[thisname][craft][item][trait] = {} | |
if AIRG.vars.data[thisname][craft][item][trait] == 0 then -- thischar doesn't have traits | |
if AIRG.vars.data[AIRG.playerName][craft][item][trait] == -1 ---PLayer Does | |
then AIRG.relative[thisname][craft][item][trait] = -1 | |
else AIRG.relative[thisname][craft][item][trait] = nil | |
end | |
end | |
end | |
end | |
end | |
end | |
end | |
end -- AIRG.CreateDataMatrix | |
function AIRG.AssignGridTraits() | |
-- Translates the traitType to the correct ROW of the grid | |
AIRG.gridTraits = {} | |
AIRG.gridTraits[ITEM_TRAIT_TYPE_WEAPON_POWERED] = 1 | |
AIRG.gridTraits[ITEM_TRAIT_TYPE_WEAPON_CHARGED] = 2 | |
AIRG.gridTraits[ITEM_TRAIT_TYPE_WEAPON_PRECISE] = 3 | |
AIRG.gridTraits[ITEM_TRAIT_TYPE_WEAPON_INFUSED] = 4 | |
AIRG.gridTraits[ITEM_TRAIT_TYPE_WEAPON_DEFENDING] = 5 | |
AIRG.gridTraits[ITEM_TRAIT_TYPE_WEAPON_TRAINING] = 6 | |
AIRG.gridTraits[ITEM_TRAIT_TYPE_WEAPON_SHARPENED] = 7 | |
AIRG.gridTraits[ITEM_TRAIT_TYPE_WEAPON_WEIGHTED] = 8 | |
AIRG.gridTraits[ITEM_TRAIT_TYPE_WEAPON_NIRNHONED] = 9 | |
AIRG.gridTraits[ITEM_TRAIT_TYPE_ARMOR_STURDY] = 10 | |
AIRG.gridTraits[ITEM_TRAIT_TYPE_ARMOR_IMPENETRABLE] = 11 | |
AIRG.gridTraits[ITEM_TRAIT_TYPE_ARMOR_REINFORCED] = 12 | |
AIRG.gridTraits[ITEM_TRAIT_TYPE_ARMOR_WELL_FITTED] = 13 | |
AIRG.gridTraits[ITEM_TRAIT_TYPE_ARMOR_TRAINING] = 14 | |
AIRG.gridTraits[ITEM_TRAIT_TYPE_ARMOR_INFUSED] = 15 | |
AIRG.gridTraits[ITEM_TRAIT_TYPE_ARMOR_EXPLORATION] = 16 | |
AIRG.gridTraits[ITEM_TRAIT_TYPE_ARMOR_DIVINES] = 17 | |
AIRG.gridTraits[ITEM_TRAIT_TYPE_ARMOR_NIRNHONED] = 18 | |
end -- AIRG.AssignGridTraits | |
function AIRG.AssignStyleLookups() | |
-- Lookup the correct icon for the style | |
AIRG.styleLookupIcons = {} | |
AIRG.styleLookupIcons[1] = "ESOUI/art/charactercreate/charactercreate_altmericon_" | |
AIRG.styleLookupIcons[2] = "ESOUI/art/charactercreate/charactercreate_dunmericon_" | |
AIRG.styleLookupIcons[3] = "ESOUI/art/charactercreate/charactercreate_bosmericon_" | |
AIRG.styleLookupIcons[4] = "ESOUI/art/charactercreate/charactercreate_nordicon_" | |
AIRG.styleLookupIcons[5] = "ESOUI/art/charactercreate/charactercreate_bretonicon_" | |
AIRG.styleLookupIcons[6] = "ESOUI/art/charactercreate/charactercreate_redguardicon_" | |
AIRG.styleLookupIcons[7] = "ESOUI/art/charactercreate/charactercreate_khajiiticon_" | |
AIRG.styleLookupIcons[8] = "ESOUI/art/charactercreate/charactercreate_orcicon_" | |
AIRG.styleLookupIcons[9] = "ESOUI/art/charactercreate/charactercreate_argonianicon_" | |
AIRG.styleLookupIcons[10] = "ESOUI/art/charactercreate/charactercreate_imperialicon_" | |
AIRG.styleLookupIcons[11] = "ESOUI/art/progression/progression_indexicon_weapons_" | |
AIRG.styleLookupIcons[12] = "ESOUI/art/progression/progression_indexicon_weapons_" | |
AIRG.styleLookupIcons[13] = "ESOUI/art/progression/progression_indexicon_weapons_" | |
AIRG.styleLookupIcons[14] = "ESOUI/art/progression/progression_indexicon_weapons_" | |
AIRG.styleLookupIcons[15] = "ESOUI/art/progression/progression_indexicon_weapons_" | |
-- Translate the icon position to the in-game type. Used for text look-up | |
AIRG.styleLookupValue = {} | |
AIRG.styleLookupValue[1] = ITEMSTYLE_RACIAL_HIGH_ELF | |
AIRG.styleLookupValue[2] = ITEMSTYLE_RACIAL_DARK_ELF | |
AIRG.styleLookupValue[3] = ITEMSTYLE_RACIAL_WOOD_ELF | |
AIRG.styleLookupValue[4] = ITEMSTYLE_RACIAL_NORD | |
AIRG.styleLookupValue[5] = ITEMSTYLE_RACIAL_BRETON | |
AIRG.styleLookupValue[6] = ITEMSTYLE_RACIAL_REDGUARD | |
AIRG.styleLookupValue[7] = ITEMSTYLE_RACIAL_KHAJIIT | |
AIRG.styleLookupValue[8] = ITEMSTYLE_RACIAL_ORC | |
AIRG.styleLookupValue[9] = ITEMSTYLE_RACIAL_ARGONIAN | |
AIRG.styleLookupValue[10] = ITEMSTYLE_AREA_IMPERIAL | |
AIRG.styleLookupValue[11] = ITEMSTYLE_AREA_ANCIENT_ELF | |
AIRG.styleLookupValue[12] = ITEMSTYLE_AREA_REACH | |
AIRG.styleLookupValue[13] = ITEMSTYLE_ENEMY_DAEDRIC | |
AIRG.styleLookupValue[14] = ITEMSTYLE_ENEMY_PRIMITIVE | |
AIRG.styleLookupValue[15] = ITEMSTYLE_AREA_DWEMER | |
-- This is a bit of a hack, but only because of the way ESO uses Style Items with different index to styles. | |
AIRG.styleLookupItem = {} | |
AIRG.styleLookupItem[1] = 8 -- Altmer = Adamantite | |
AIRG.styleLookupItem[2] = 5 -- Dunmer = Obsidian | |
AIRG.styleLookupItem[3] = 9 -- Bosmer = Bone | |
AIRG.styleLookupItem[4] = 6 -- Nord = Corundum | |
AIRG.styleLookupItem[5] = 2 -- Breton = Molybdenum | |
AIRG.styleLookupItem[6] = 3 -- Redguard = Starmetal | |
AIRG.styleLookupItem[7] = 10 -- Khajit = Moonstone | |
AIRG.styleLookupItem[8] = 4 -- Orc = Manganese | |
AIRG.styleLookupItem[9] = 7 -- Argonian = Flint | |
AIRG.styleLookupItem[10] = 35 -- Imperial = Nickel | |
AIRG.styleLookupItem[11] = 16 -- Ancient Elf = Palladium | |
AIRG.styleLookupItem[12] = 18 -- Barbarian = Copper | |
AIRG.styleLookupItem[13] = 21 -- Daedric = Daedra Heart | |
AIRG.styleLookupItem[14] = 20 -- Primal = Argentum | |
AIRG.styleLookupItem[15] = 15 -- Dwemer = Dwemer Frame | |
AIRG.styleChaptersLookup = {} | |
AIRG.styleChaptersLookup[1] = 10 --Axe | |
AIRG.styleChaptersLookup[2] = 6 --Belt | |
AIRG.styleChaptersLookup[3] = 3 --Boots | |
AIRG.styleChaptersLookup[4] = 14 --Bows | |
AIRG.styleChaptersLookup[5] = 5 --Chests | |
AIRG.styleChaptersLookup[6] = 11 --Daggers | |
AIRG.styleChaptersLookup[7] = 2 --Gloves | |
AIRG.styleChaptersLookup[8] = 1 --Helmets | |
AIRG.styleChaptersLookup[9] = 4 --Legs | |
AIRG.styleChaptersLookup[10] = 9 --Maces | |
AIRG.styleChaptersLookup[11] = 13 --Shields | |
AIRG.styleChaptersLookup[12] = 7 --Shoulders | |
AIRG.styleChaptersLookup[13] = 12 --Staves | |
AIRG.styleChaptersLookup[14] = 8 --Swords | |
end -- AIRG.AssignStyleLookups | |
function AIRG.Initialise(eventCode, addOnName) | |
-- Only initialize our own addon | |
if (AIRG.name ~= addOnName) then return end | |
-- Language text | |
AIRG.InitialiseLanguage() | |
-- Load the saved variables | |
AIRG.vars = ZO_SavedVars:NewAccountWide("AIRG_SavedVariables", 2, nil, AIRG.defaults) | |
AIRG.all = AIRG.L["ALL"] -- replace Default with localise string | |
-- Register Keybinding | |
ZO_CreateStringId("SI_BINDING_NAME_TOGGLE_AIRG", "Toggle AI Research Grid") | |
-- Set-up some variables we'll want to refer to. | |
AIRG.craftNames = {} | |
AIRG.relative = {} | |
AIRG.craftNames[CRAFTING_TYPE_BLACKSMITHING] = AIRG.L["BS"] | |
AIRG.craftNames[CRAFTING_TYPE_CLOTHIER] = AIRG.L["Clothing"] | |
AIRG.craftNames[CRAFTING_TYPE_WOODWORKING] = AIRG.L["Woodwork"] | |
AIRG.curCraft= CRAFTING_TYPE_WOODWORKING | |
AIRG.playerName = GetUnitName("player") | |
AIRG.curCharacter = GetUnitName("player") -- Default the display to the current character | |
AIRG.AssignGridTraits() | |
AIRG.AssignStyleLookups() | |
--Remove possibly spurious character data | |
AIRG.vars.styles["#TOUS"] = nil | |
AIRG.vars.styles[" #ALLE"] = nil | |
AIRG.vars.styles[" #ALL"] = nil | |
AIRG.vars.styles[AIRG.all] = {} | |
-- Create these here so the UI dropdown will have them first time around. | |
AIRG.vars.data[AIRG.playerName] = {} -- create a table for this character's matrix | |
--Remove possibly spurious character data | |
AIRG.vars.data["#TOUS"] = nil | |
AIRG.vars.data[" #ALLE"] = nil | |
AIRG.vars.data[" #ALL"] = nil | |
AIRG.vars.data[AIRG.all] = {} -- and our virtual character | |
-- Create Empty data for Virtual Char set to 0, (Not known) | |
local i, j | |
AIRG.vars.data[AIRG.all][CRAFTING_TYPE_BLACKSMITHING] = {} | |
-- Cycle through items for this profession | |
for i = 1, 7 do -- Weapons | |
AIRG.vars.data[AIRG.all][CRAFTING_TYPE_BLACKSMITHING][i] = {} | |
-- Cycle through the traits for this item | |
for j = 1, 9 do | |
AIRG.vars.data[AIRG.all][CRAFTING_TYPE_BLACKSMITHING][i][j] = 0 -- set to not known | |
end | |
end | |
for i = 8, 14 do -- Armour | |
AIRG.vars.data[AIRG.all][CRAFTING_TYPE_BLACKSMITHING][i] = {} | |
-- Cycle through the traits for this item | |
for j = 10, 18 do | |
AIRG.vars.data[AIRG.all][CRAFTING_TYPE_BLACKSMITHING][i][j] = 0 -- set to not known | |
end | |
end | |
AIRG.vars.data[AIRG.all][CRAFTING_TYPE_CLOTHIER] = {} | |
-- Cycle through items for this profession | |
for i = 1, 14 do | |
AIRG.vars.data[AIRG.all][CRAFTING_TYPE_CLOTHIER][i] = {} | |
-- Cycle through the traits for this item | |
for j = 10, 18 do | |
AIRG.vars.data[AIRG.all][CRAFTING_TYPE_CLOTHIER][i][j] = 0 -- set to not known | |
end | |
end | |
AIRG.vars.data[AIRG.all][CRAFTING_TYPE_WOODWORKING] = {} | |
-- Cycle through items for this profession | |
for i = 1, 5 do | |
AIRG.vars.data[AIRG.all][CRAFTING_TYPE_WOODWORKING][i] = {} | |
-- Cycle through the traits for this item | |
for j = 1, 9 do | |
AIRG.vars.data[AIRG.all][CRAFTING_TYPE_WOODWORKING][i][j] = 0 -- set to not known | |
end | |
end | |
for i = 6, 6 do --Shields | |
AIRG.vars.data[AIRG.all][CRAFTING_TYPE_WOODWORKING][i] = {} | |
-- Cycle through the traits for this item | |
for j = 10, 18 do | |
AIRG.vars.data[AIRG.all][CRAFTING_TYPE_WOODWORKING][i][j] = 0 -- set to not known | |
end | |
end | |
--Create Empty Style Table | |
for i = 1, 14 do | |
AIRG.vars.styles[AIRG.all][i] = false | |
end | |
AIRG.vars.styles[AIRG.all][15]= {} --Dwemer | |
for i = 1, 14 do | |
AIRG.vars.styles[AIRG.all][15][i] = false | |
end | |
-- AIRG.CreateDataMatrix | |
-- Following replaced with PlayerActivate | |
-- Query data for THIS character and populate the data matrix with fresh data. | |
--AIRG.PopulateMatrix() | |
-- Query data for THIS character for STYLES | |
--AIRG.PopulateStyleData() | |
-- UI set-up. Create frames, position labels & buttons etc. | |
AIRG.initUI() | |
-- Create the configuration/settings menu. | |
AIRG.CreateConfigMenu() | |
-- REGISTER for events that aren't initialise. | |
EVENT_MANAGER:RegisterForEvent("AIRG", EVENT_SMITHING_TRAIT_RESEARCH_STARTED, AIRG.ResearchStarted) | |
EVENT_MANAGER:RegisterForEvent("AIRG", EVENT_SMITHING_TRAIT_RESEARCH_COMPLETED, AIRG.ResearchCompleted) | |
EVENT_MANAGER:RegisterForEvent("AIRG", EVENT_STYLE_LEARNED, AIRG.StyleLearned) | |
EVENT_MANAGER:RegisterForEvent("AIRG", EVENT_PLAYER_ACTIVATED, AIRG.PlayerActivated) | |
AIRG.initialised = true | |
end -- AIRG.Initialise | |
-- SLASH COMMAND FUNCTIONALITY | |
function AIRGslash(extra) | |
AIRG.ToggleMainWindow() | |
end -- AIRGslash | |
SLASH_COMMANDS["/airg"] = AIRGslash | |
EVENT_MANAGER:RegisterForEvent("AIRG", EVENT_ADD_ON_LOADED, AIRG.Initialise) | |
-- EOF |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment