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.

850 lines
37 KiB

-- module independent variables --
----------------------------------
local addon, ns = ...
local C, L, I = ns.LC.color, ns.L, ns.I
if ns.client_version<7 then return end
-- module own local variables and local cached functions --
-----------------------------------------------------------
local name = "Artifact weapon" -- L["Artifact weapon"] L["ModDesc-Artifact weapon"]
local ttName,ttNameAlt,ttColumns,tt,ttAlt,module,createTooltip = name.."TT",name.."TT2", 3;
local ap_items_found,spec2weapon,knowledgeLevel,obtained,updateBroker, _ = {},{},0,0;
local _ITEM_LEVEL = gsub(ITEM_LEVEL,"%%d","(%%d*)");
local PATTERN_ARTIFACT_XP_GAIN = gsub(ARTIFACT_XP_GAIN,"%s",".*");
local number_pattern,akUpgrade = {};
local artifactKnowledgeMultiplier_cap, artifactLocked = 55;
local updateItemStateTry,updateItemState=0;
local artifactKnowledgeMultiplier = {}
local AP_MATCH_STRINGS,FISHING_AP_MATCH_STRINGS;
local triggerLocked = false
ns.artifactpower_items = {};
ns.artifactrelikts = {};
-- register icon names and default files --
-------------------------------------------
I[name] = {iconfile=1109508 or ns.icon_fallback,coords={0.05,0.95,0.05,0.95}} --IconName::Artifact weapon--
-- some local functions --
--------------------------
local function sort_up_down(a,b)
return a:len()>b:len();
end
local function ttMatchString(line,matchString)
local artifact_power;
if type(matchString)=="table" then
artifact_power = line:match(matchString[1]);
if not artifact_power then
artifact_power = line:match(matchString[2]);
end
else
artifact_power = line:match(matchString);
end
if artifact_power then
local pat,expo=nil,0;
for _,v in ipairs(number_pattern)do
if artifact_power:find(v[1]) then
pat = v[1];
expo = v[2];
break;
end
end
if pat then
artifact_power = tonumber((artifact_power:gsub("(%d*)[,%.](%d)[ ]?"..pat,"%1.%2"):gsub("(%d*)[ ]?"..pat,"%1"))) * (10^expo);
else
artifact_power = artifact_power:gsub("[,%.]","");
end
end
return tonumber(artifact_power);
end
function updateItemState()
wipe(ap_items_found);
local klvls = {};
for sharedSlot,itemInfo in pairs(ns.items.bySlot) do
if itemInfo.bag>=0 and ns.artifactpower_items[itemInfo.id] then
local item = CopyTable(itemInfo);
item.type = "bag";
ns.ScanTT.query(item,true);
item.name, _, _, _, _, _, _, _, _, item.icon = GetItemInfo(item.link);
local knowledge = item.linkData[#item.linkData-3];
if knowledge then
if klvls[knowledge]==nil then klvls[knowledge]={}; end
tinsert(klvls[knowledge],item);
end
end
end
for klvl,items in pairs(klvls)do
local knowledgeLevel = klvl-1;
local isFishing = false;
local artefact_power = nil;
-- read artefact power from single item tooltip with same item id and knowledge level
if items[1].tooltip then
for i=2, #items[1].tooltip do
artefact_power = ttMatchString(items[1].tooltip[i],AP_MATCH_STRINGS); -- artefact power for artefact weapons?
if not artefact_power then
artefact_power = ttMatchString(items[1].tooltip[i],FISHING_AP_MATCH_STRINGS); -- artefact power for artefact pole?
if artefact_power then
isFishing = true;
end
end
if artefact_power then
break;
end
end
end
tinsert(ap_items_found,{
count=#items,
id=items[1].id,
link=items[1].link,
name=items[1].name,
icon=items[1].icon,
artifact_power=artefact_power or -1,
quality=items[1].quality,
isFishing = isFishing
});
end
updateBroker()
end
local function GetRelicTooltipData(data)
local obj = data.obj or {};
if obj.awItemID and obj.relicIndex then
if ns.toon[name][obj.awItemID].relic==nil then
ns.toon[name][obj.awItemID].relic = {};
end
local iLevel,increaseLevel = 0,0;
if data and data.lines and #data.lines>0 then
iLevel = tonumber(data.lines[2]:match(_ITEM_LEVEL)) or tonumber(data.lines[3]:match(_ITEM_LEVEL)) or 0;
increaseLevel = tonumber(data.lines[5]:match("(.*) "..RELIC_ITEM_LEVEL_INCREASE)) or tonumber(data.lines[6]:match("(.*) "..RELIC_ITEM_LEVEL_INCREASE)) or 0;
end
ns.toon[name][obj.awItemID].relic[obj.relicIndex].level = iLevel;
ns.toon[name][obj.awItemID].relic[obj.relicIndex].increase = increaseLevel;
end
end
local function updateCharacterDB(equipped)
local artifact_frame = (ArtifactFrame and ArtifactFrame:IsShown() and ArtifactFrame.PerksTab and ArtifactFrame.PerksTab:IsShown());
local artifact_forge = (ArtifactRelicForgeFrame and ArtifactRelicForgeFrame:IsShown());
local itemID, altItemID, itemName, icon, xp, pointsSpent, quality, artifactAppearanceID, appearanceModID, itemAppearanceID, altItemAppearanceID, altOnTop, artifactTier = C_ArtifactUI[artifact_frame and "GetArtifactInfo" or "GetEquippedArtifactInfo"]();
if itemID and itemID~=0 then
local numPoints, artifactXP, xpForNextPoint = 0,0,0; --MainMenuBar_GetNumArtifactTraitsPurchasableFromXP(pointsSpent,xp,artifactTier);
local maxPoints = numPoints+pointsSpent;
local relic = {};
artifactLocked = nil;
if equipped then
ns.toon[name].equipped=equipped;
end
if ns.toon[name][itemID] and ns.toon[name][itemID].relic then
relic = ns.toon[name][itemID].relic;
if not artifact_frame then
for i=1,#relic do
if relic[i].link and relic[i].level==nil then
ns.ScanTT.query({type="link",link=relic[i].link,obj={awItemID=itemID,relicIndex=i},callback=GetRelicTooltipData});
end
end
end
end
local weapon = ns.items.bySlot[-0.16];
ns.toon[name][itemID] = {
name=itemName,
numPoints=numPoints,
pointsSpent=pointsSpent,
maxPoints=maxPoints,
xp=xp,
artifactTier=artifactTier,
artifactXP=artifactXP,
xpForNextPoint=xpForNextPoint,
relic=relic,
classSpec="", -- string
itemLevel=weapon and weapon.level or 0
};
ns.toon[name].obtained[itemID] = true;
-- update relict slots. (only possible with open artifact frame)
if artifact_frame or artifact_forge then
for i,v in ipairs(ArtifactFrame.PerksTab.TitleContainer.RelicSlots)do
if not v.relicType then
artifactLocked = ARTIFACT_VISIT_FORGE_TO_START;
end
local icon,itemname,color,linktype,itemid,data,_=ns.icon_fallback;
if v.relicLink then
_,_,color,linktype,itemid,data,itemname = v.relicLink:find("|c(%x*)|H([^:]*):(%d+):(.+)|h%[([^%[%]]*)%]|h|r");
icon = GetItemIcon(itemid);
end
local affected = {C_ArtifactUI.GetPowersAffectedByRelic(i)};
for I,A in ipairs(affected) do
affected[I] = (C_ArtifactUI.GetPowerInfo(A) or {}).spellID or UNKNOWN
end
ns.toon[name][itemID].relic[i]={id=tonumber(itemid),color=color,icon=icon,name=itemname,type=v.relicType,locked=v.lockedReason or false,link=v.relicLink,affected=affected};
if v.relicLink then
ns.ScanTT.query({type="link",link=v.relicLink,obj={awItemID=itemID,relicIndex=i},callback=GetRelicTooltipData});
end
end
end
-- update knowledge
ns.toon[name].knowledgeLevel = artifactKnowledgeMultiplier_cap;
end
end
function updateBroker()
local _;
obtained = C_ArtifactUI.GetNumObtainedArtifacts();
local allDisabled,data,obj = true,{}, ns.LDB:GetDataObjectByName(module.ldbName);
local itemID, altItemID, itemName, icon, xp, pointsSpent, quality, artifactAppearanceID, appearanceModID, itemAppearanceID, altItemAppearanceID, altOnTop, artifactTier = C_ArtifactUI.GetEquippedArtifactInfo();
updateCharacterDB(itemID);
if itemID then
local numPoints, artifactXP, xpForNextPoint = 0,0,0; --MainMenuBar_GetNumArtifactTraitsPurchasableFromXP(pointsSpent,xp,artifactTier);
local maxPoints = numPoints+pointsSpent;
if ns.profile[name].showName then
tinsert(data,C("quality"..quality,itemName));
allDisabled=false;
end
if ns.profile[name].showPoints then
tinsert(data,C(maxPoints>pointsSpent and "orange" or "green",pointsSpent).."/"..C("green",numPoints+pointsSpent));
allDisabled=false;
end
if ns.profile[name].showXP=="1" then
tinsert(data,C("yellow",ns.FormatLargeNumber(name,artifactXP)).."/"..C("ltblue",ns.FormatLargeNumber(name,xpForNextPoint)));
allDisabled=false;
elseif ns.profile[name].showXP=="2" then
tinsert(data,C("yellow",ns.FormatLargeNumber(name,xpForNextPoint-artifactXP)));
allDisabled=false;
end
if ns.profile[name].showKnowledge and ns.toon[name].knowledgeLevel>0 then
tinsert(data,C("orange",ns.toon[name].knowledgeLevel));
end
if ns.profile[name].showPower then
local sum = {0,0};
for i,v in ipairs(ap_items_found)do
if v.artifact_power==-1 then
sum[2] = sum[2] + 1;
elseif v.artifact_power>0 then
sum[1] = sum[1] + (v.count * v.artifact_power);
end
end
tinsert(data,ns.FormatLargeNumber(name,sum[1])..strrep("+",sum[2]));
allDisabled=false;
end
end
obj.icon = icon or "interface\\icons\\Ability_MeleeDamage";
if allDisabled then
if ns.profile[name].showWarning and obtained>0 then
obj.text = C("orange",L["Artifact weapon not equipped"]);
else
obj.text = L[name];
end
else
obj.text = table.concat(data,", ");
end
end
local function itemTooltipShow(self,info)
if not info then return end
GameTooltip:SetOwner(tt,"ANCHOR_NONE");
GameTooltip:SetPoint(ns.GetTipAnchor(tt,"horizontal"));
GameTooltip:SetClampedToScreen(true);
GameTooltip:ClearLines();
if info.locked then
GameTooltip:SetText("|TInterface\\LFGFrame\\UI-LFG-ICON-LOCK:16:16:0:2:32:32:0:25:0:25|t "..C("red",LOCKED));
GameTooltip:AddLine(info.locked,.78,.78,.78,true);
elseif info.link then
GameTooltip:SetHyperlink(info.link);
end
if type(info.affected)=="table" then
local regions = {GameTooltip:GetRegions()};
for r=1, #regions do
if regions[r].GetText then
local str = regions[r]:GetText();
if str and str==" " then
local text = "";
for i=2, #info.affected do
local spell = GetSpellInfo(info.affected[i]);
if spell then
text = text .. RELIC_TOOLTIP_RANK_INCREASE:format(1,spell) .. "\n";
end
end
regions[r]:SetText(text.." ");
regions[r]:SetTextColor(1,1,1);
break;
end
end
end
end
GameTooltip:Show();
end
local function createTooltip2(parent,artifactID)
local item,missingdata,l = ns.toon[name][artifactID],false;
local tt = ns.acquireTooltip({ttNameAlt, ttColumns, "LEFT", "RIGHT", "RIGHT", "LEFT", "LEFT","RIGHT", "CENTER", "LEFT", "LEFT", "LEFT"},{false},{parent,"horizontal",tt});
ttAlt = tt;
tt:Clear();
l=tt:AddHeader("|T"..(GetItemIcon(artifactID) or ns.icon_fallback)..":0|t "..C("ltyellow",item.name));
--tt:SetCell(l,3,C("gray","(class spec?)"));
tt:AddSeparator();
-- spent xp
if item.xp and item.xpForNextPoint then
l=tt:AddLine();
tt:SetCell(l,1,C("ltgreen",L["Spent artifact power"]),nil,nil,2);
tt:SetCell(l,3,C("ltyellow",ns.FormatLargeNumber(name,item.xp,true)).."/"..C("ltyellow",ns.FormatLargeNumber(name,item.xpForNextPoint,true)));
else
missingdata = true;
end
-- spent points
if item.maxPoints and item.pointsSpent and item.numPoints then
l=tt:AddLine();
tt:SetCell(l,1,C("ltgreen",L["Spent points"]),nil,nil,2);
tt:SetCell(l,3,C(item.maxPoints>item.pointsSpent and "ltorange" or "ltyellow",item.pointsSpent).."/"..C("ltyellow",item.numPoints+item.pointsSpent));
else
missingdata = true;
end
-- spent power
if ns.profile[name].showTotalAP and item.artifactTier then
local xp = item.xp;
for i=1, item.pointsSpent-1 do
xp=xp+C_ArtifactUI.GetCostForPointAtRank(i,item.artifactTier);
end
l=tt:AddLine();
tt:SetCell(l,1,C("ltgreen",L["Total spend power"]),nil,nil,2);
tt:SetCell(l,3,C("ltyellow",ns.FormatLargeNumber(name,xp,true)));
end
-- item level
if item.itemLevel then
tt:AddLine(C("ltgreen",STAT_AVERAGE_ITEM_LEVEL),"",C("ltyellow",item.itemLevel));
else
missingdata = true;
end
-- display relic slot items
if ns.profile[name].showRelic and artifactID~=133755 and item and item.relic then
tt:AddSeparator(4,0,0,0,0);
tt:AddLine(C("ltblue",RELICSLOT));
tt:AddSeparator();
if #item.relic>0 then
for i,v in ipairs(item.relic) do
local ilvl,ilvlStr={},"";
if (tonumber(v.level) or 0)>0 and ns.profile[name].showRelicItemLevel then
tinsert(ilvl,v.level);
end
if (tonumber(v.increase) or 0)>0 and ns.profile[name].showRelicIncreaseItemLevel then
tinsert(ilvl,"+"..v.increase);
end
if #ilvl>0 then
ilvlStr = " "..C("gray2","("..table.concat(ilvl,"/")..")");
end
local n = (v.color and C(v.color,v.name)..ilvlStr) or (v.locked and C("red", LOCKED)) or C("ltgray",EMPTY);
local icon = v.locked and "|TInterface\\LFGFrame\\UI-LFG-ICON-LOCK:14:14:0:0:32:32:0:25:0:25|t " or "|T"..(v.icon or ns.icon_fallback)..":0|t ";
local _type = v.type or UNKNOWN;
local label = _G["RELIC_SLOT_TYPE_" .. _type:upper()] .. " " .. RELICSLOT;
local l=tt:AddLine(C("white",i..". ")..C("ltgreen",label));
tt:SetCell(l,2,icon .. n,nil,nil,0);
if v.locked or v.link then
tt:SetLineScript(l,"OnEnter",itemTooltipShow,v);
tt:SetLineScript(l,"OnLeave",GameTooltip_Hide);
end
end
else
local l=tt:AddLine();
tt:SetCell(l,1,C("ltgray",ns.strWrap(L["Artifact relic are displayable after opening artifact window. Shift Right-Click on your equipped artifact weapon."],64)),nil,nil,ttColumns);
end
end
if missingdata then
tt:AddSeparator(4,0,0,0,0);
l=tt:AddLine();
tt:SetCell(l,1,ns.strWrap(C("orange",L["Missing artifact weapon data"]),64),nil,"CENTER",0);
end
ns.roundupTooltip(tt);
end
local function hideTooltip2()
if ttAlt then
ttAlt:Release();
ttAlt=nil;
end
end
local function addAltArtifactLine(tt,c,id)
local l=tt:AddLine(C("ltyellow",c..". "..L["Artifact weapon"]));
tt:SetCell(l,3,"|T"..(GetItemIcon(id) or ns.icon_fallback)..":0|t "..C("ltyellow",ns.toon[name][id].name));
tt:SetLineScript(l, "OnEnter", createTooltip2, id);
tt:SetLineScript(l, "OnLeave");
end
function createTooltip(tt)
if not (tt and tt.key and tt.key==ttName) then return end -- don't override other LibQTip tooltips...
if tt.lines~=nil then tt:Clear(); end
-- tooltip header
tt:AddHeader(C("dkyellow",L[name]));
if obtained==0 then
-- not optained info
tt:SetCell(tt:AddLine(),1,C("gray",L["Currently you have no artifact weapon obtained..."]));
elseif artifactLocked then
-- locked info. only for ARTIFACT_VISIT_FORGE_TO_START
tt:AddLine(artifactLocked);
else
-- query data and pray for itemID is not nil... :D
local itemID, altItemID, itemName, icon, xp, pointsSpent, quality, artifactAppearanceID, appearanceModID, itemAppearanceID, altItemAppearanceID, altOnTop, artifactTier,l = C_ArtifactUI.GetEquippedArtifactInfo();
if itemID then
-- wow... not nil... okay... :)
-- display current and next artifact knowledge level
if ns.toon[name].knowledgeLevel and ns.toon[name].knowledgeLevel>0 and itemID~=133755 then
tt:AddSeparator(3,0,0,0,0);
-- localized name if artifact knowledge
local currencyInfo = C_CurrencyInfo.GetCurrencyInfo(1171);
--local ak = GetCurrencyInfo(1171); -- TODO: removed in shadowlands
tt:AddLine(C("ltblue",currencyInfo.name or L["Artifact knowledge"]));
tt:AddSeparator();
l=tt:AddLine();
tt:SetCell(l,1,C("ltgreen",REFORGE_CURRENT));
tt:SetCell(l,3,C("ltyellow",("%d (+%s%%)"):format(ns.toon[name].knowledgeLevel,ns.FormatLargeNumber(name,math.ceil(artifactKnowledgeMultiplier[ns.toon[name].knowledgeLevel]*10)*10,true))));
local nextKL = ns.toon[name].knowledgeLevel+1;
if nextKL<=artifactKnowledgeMultiplier_cap then
l=tt:AddLine();
tt:SetCell(l,1,C("gray2",L["Next knowledge level"]),nil,nil,2);
tt:SetCell(l,3,C("gray2",("%d (+%s%%)"):format(nextKL,ns.FormatLargeNumber(name,math.ceil(artifactKnowledgeMultiplier[nextKL]*10)*10,true))));
tt:AddLine(C("gray2",L["Time to next"]),"",C("gray2",SecondsToTime(ns.toon[name].timeToNextAK,nil,nil,nil,true)));
end
end
tt:AddSeparator(3,0,0,0,0);
tt:SetCell(tt:AddLine(),1, C("ltblue",L["Equipped artifact weapon"]),nil,nil,0);
tt:AddSeparator();
-- display name of artifact weapon in your hand
l=tt:AddLine();
tt:SetCell(l,1,C("ltgreen",NAME),nil,"LEFT");
tt:SetCell(l,2,"|T"..icon..":0|t "..C("ltyellow",itemName),nil,nil,2);
-- display current class spec
-- l=tt:AddLine();
-- tt:SetCell(l,1,C("ltgreen",SPEC_LABEL));
-- tt:SetCell(l,3,C("ltyellow",specname));
-- get/calculate points and expirience
local numPoints, artifactXP, xpForNextPoint = 0,0,0; --MainMenuBar_GetNumArtifactTraitsPurchasableFromXP(pointsSpent,xp,artifactTier);
local maxPoints = numPoints+pointsSpent;
-- display spent artifact power
l=tt:AddLine();
tt:SetCell(l,1,C("ltgreen",L["Spent artifact power"]),nil,nil,2);
tt:SetCell(l,3,C("ltyellow",ns.FormatLargeNumber(name,xp,true)).."/"..C("ltyellow",ns.FormatLargeNumber(name,xpForNextPoint,true)));
-- display spent points
l=tt:AddLine();
tt:SetCell(l,1,C("ltgreen",L["Spent points"]),nil,nil,2);
tt:SetCell(l,3,C(maxPoints>pointsSpent and "ltorange" or "ltyellow",pointsSpent).."/"..C("ltyellow",numPoints+pointsSpent));
-- calculate and display total spent artifact power for current weapon (one more line for real total with all weapons?)
if ns.profile[name].showTotalAP then
local _,_,_,_,xp,ps=C_ArtifactUI.GetEquippedArtifactInfo();
for i=1,ps-1 do
xp=xp+C_ArtifactUI.GetCostForPointAtRank(i,artifactTier);
end
l=tt:AddLine();
tt:SetCell(l,1,C("ltgreen",L["Total spend power"]),nil,nil,2);
tt:SetCell(l,3,C("ltyellow",ns.FormatLargeNumber(name,xp,true)));
end
-- display average item level
local weapon = ns.items.bySlot[-0.16];
if weapon then
tt:AddLine(C("ltgreen",STAT_AVERAGE_ITEM_LEVEL),"",C("ltyellow",weapon.level));
end
-- display relic slot and relic items
if ns.profile[name].showRelic and ns.toon[name][itemID] and ns.toon[name][itemID].relic and itemID~=133755 then
tt:AddSeparator(4,0,0,0,0);
tt:AddLine(C("ltblue",RELICSLOT));
tt:AddSeparator();
if #ns.toon[name][itemID].relic>0 then
for i,v in ipairs(ns.toon[name][itemID].relic) do
local ilvl,ilvlStr={},"";
if (tonumber(v.level) or 0)>0 and ns.profile[name].showRelicItemLevel then
tinsert(ilvl,v.level);
end
if (tonumber(v.increase) or 0)>0 and ns.profile[name].showRelicIncreaseItemLevel then
tinsert(ilvl,"+"..v.increase);
end
if #ilvl>0 then
ilvlStr = " "..C("gray2","("..table.concat(ilvl,"/")..")");
end
local n = (v.color and C(v.color,v.name)..ilvlStr) or (v.locked and C("red", LOCKED)) or C("ltgray",EMPTY);
local icon = v.locked and "|TInterface\\LFGFrame\\UI-LFG-ICON-LOCK:14:14:0:0:32:32:0:25:0:25|t " or "|T"..(v.icon or ns.icon_fallback)..":0|t ";
local label = (v.type and _G["RELIC_SLOT_TYPE_" .. v.type:upper()] or UNKNOWN) .. " " .. RELICSLOT;
local l=tt:AddLine(C("white",i..". ")..C("ltgreen",label));
tt:SetCell(l,2,icon .. n,nil,nil,0);
if v.locked or v.link then
tt:SetLineScript(l,"OnEnter",itemTooltipShow,v);
tt:SetLineScript(l,"OnLeave",GameTooltip_Hide);
end
end
else
-- or a locked info
local l=tt:AddLine();
tt:SetCell(l,1,C("ltgray",ns.strWrap(L["Artifact relic are displayable after opening artifact window. Shift Right-Click on your equipped artifact weapon."],64)),nil,nil,ttColumns);
end
end
-- list of your other obtained artifacts
if ns.profile[name].showAlt and obtained>1 then
tt:AddSeparator(4,0,0,0,0);
tt:AddLine(C("ltblue",L["Your other artifacts"]));
tt:AddSeparator();
local pole,c = false,2;
for id,loc in pairs(ns.toon[name].obtained)do
if id==133755 then
pole=true;
elseif id>0 and itemID~=id then
addAltArtifactLine(tt,c,id);
c=c+1;
end
end
if pole then
addAltArtifactLine(tt,c,133755);
c=c+1;
end
end
-- display a list of items to empower your artifact with artifact power
if ns.profile[name].showItems then
tt:AddSeparator(4,0,0,0,0);
local l=tt:AddLine();
tt:SetCell(l,1,C("ltblue",L["Found in your backpack"]),nil,nil,2);
tt:SetCell(l,3,C("ltblue",ARTIFACT_POWER));
tt:AddSeparator();
local count,sum=0,0;
for i,v in ipairs(ap_items_found)do
local color,l = "quality7";
if v.quality then
color = "quality"..v.quality;
end
if v.artifact_power==-1 then
l=tt:AddLine();
tt:SetCell(l,1,"|T".. v.icon .. ":0|t ".. C(color,v.name),nil,nil,2);
tt:SetCell(l,3," ");
elseif v.artifact_power>0 then
l=tt:AddLine();
tt:SetCell(l,1,"|T".. v.icon .. ":0|t ".. C(color,v.name),nil,nil,2);
tt:SetCell(l,3,C("ltyellow",v.count .." x " .. ns.FormatLargeNumber(name,v.artifact_power,true)));
sum = sum + (v.count*v.artifact_power);
end
if v.link then
tt:SetLineScript(l,"OnEnter",itemTooltipShow,v);
tt:SetLineScript(l,"OnLeave",GameTooltip_Hide);
end
count=count+1;
end
if count>0 then
tt:AddSeparator();
tt:AddLine(C("ltblue",ACHIEVEMENT_SUMMARY_CATEGORY..HEADER_COLON),nil,ns.FormatLargeNumber(name,sum,true));
else
local l = tt:AddLine();
tt:SetCell(l,1,C("ltgray",L["Currently no artifact power items found"]), nil, nil, ttColumns);
end
end
else
tt:AddLine(C("ltgray",L["Currently you have no artifact weapon equipped..."]));
end
end
-- add hints if player want see it :D
if ns.profile.GeneralOptions.showHints then
tt:AddSeparator(3,0,0,0,0);
ns.ClickOpts.ttAddHints(tt,name);
end
-- little roundup for tooltip
ns.roundupTooltip(tt);
end
-- module variables for registration --
---------------------------------------
module = {
events = {
"PLAYER_LOGIN",
"ARTIFACT_XP_UPDATE",
"ARTIFACT_UPDATE",
"UNIT_INVENTORY_CHANGED",
"CURRENCY_DISPLAY_UPDATE"
},
config_defaults = {
enabled = false,
showName = true,
showPoints = true,
showXP = "1",
showPower = true,
showWarning = true,
showRelic = true,
showRelicItemLevel = false,
showRelicIncreaseItemLevel = true,
showItems = true,
showTotalAP = true,
showKnowledge = true,
showAlt = true,
},
clickOptionsRename = {
["charinfo"] = "1_open_character_info",
["artifactframe"] = "2_artifact_frame",
["menu"] = "3_open_menu"
},
clickOptions = {
["charinfo"] = "CharacterInfo",
["artifactframe"] = {"Artifact frame","call",{"SocketInventoryItem",16}}, -- L["Artifact frame"]
["menu"] = "OptionMenu"
}
};
ns.ClickOpts.addDefaults(module,{
charinfo = "__NONE",
artifactframe = "_LEFT",
menu = "_RIGHT"
});
function module.options()
return {
broker = {
showName = { type="toggle", order=1, name=L["OptArtName"], desc=L["OptArtNameDesc"]},
showPoints = { type="toggle", order=2, name=L["OptArtPoints"], desc=L["OptArtPointsDesc"]},
showXP = { type="select", order=3, name=L["OptArtPower"], desc=L["OptArtPowerDesc"],
values = {
["0"] = HIDE,
["1"] = L["Current / max xp"],
["2"] = L["Need to next point"],
},
},
showPower = { type="toggle", order=4, name=L["OptArtUnused"], desc=L["OptArtUnusedDesc"]},
showKnowledge = { type="toggle", order=5, name=L["OptArtKnowledge"], desc=L["OptArtKnowledgeDesc"]},
showWarning = { type="toggle", order=6, name=L["OptartNotEquipped"], desc=L["OptArtNotEquippedDesc"]},
},
tooltip = {
showRelic = { type="toggle", order=1, name=L["OptArtRelic"], desc=L["OptArtRelicDesc"]},
showRelicItemLevel = { type="toggle", order=2, name=L["OptArtRelicILvl"], desc=L["OptArtRelicILvlDesc"]},
showRelicIncreaseItemLevel = { type="toggle", order=3, name=L["OptArtReliciLvlInc"], desc=L["OptArtReliciLvlIncDesc"]},
showItems = { type="toggle", order=4, name=L["OptArtPowerItems"], desc=L["OptArtPowerItemsDesc"]},
showTotalAP = { type="toggle", order=5, name=L["OptArtPowerTotal"], desc=L["OptArtPowerTotalDesc"]},
showAlt = { type="toggle", order=6, name=L["OptArtOthers"], desc=L["OptArtOthersDesc"]}
},
misc = {
shortNumbers=1
},
},
{ -- option set function should execute module event function. true="BE_DUMMY_EVENT", [string]=<execute with given event name>
showName="ARTIFACT_UPDATE",
showPoints="ARTIFACT_UPDATE",
showXP="ARTIFACT_UPDATE",
}
end
function module.init()
ns.artifactpower_items = {
-- >0 = known amount of artifact power
-- -1 = special actifact power items
[127999]=2, [128000]=2, [128021]=2, [128022]=2, [128026]=2, [130144]=1, [130149]=1, [130152]=1, [130153]=1, [130159]=1, [130160]=1, [130165]=1,
[131728]=1, [131732]=1, [131751]=1, [131753]=1, [131758]=1, [131763]=1, [131778]=1, [131784]=1, [131785]=1, [131789]=1, [131795]=1, [131802]=1,
[131808]=1, [132361]=1, [132897]=1, [132923]=1, [132950]=1, [134118]=2, [134133]=2, [136360]=1, [138480]=1, [138487]=1, [138726]=2, [138732]=1,
[138781]=1, [138782]=1, [138783]=1, [138784]=1, [138785]=1, [138786]=1, [138812]=1, [138813]=1, [138814]=1, [138816]=1, [138839]=1, [138864]=1,
[138865]=1, [138880]=1, [138881]=1, [138885]=1, [138886]=1, [139413]=1, [139506]=1, [139507]=1, [139508]=1, [139509]=1, [139510]=1, [139511]=1,
[139512]=1, [139608]=1, [139609]=1, [139610]=1, [139611]=1, [139612]=1, [139613]=1, [139614]=1, [139615]=1, [139616]=1, [139617]=1, [139652]=1,
[139653]=1, [139654]=1, [139655]=1, [139656]=1, [139657]=1, [139658]=1, [139659]=1, [139660]=1, [139661]=1, [139662]=1, [139663]=1, [139664]=1,
[139665]=1, [139666]=1, [139667]=1, [139668]=1, [139669]=1, [140176]=1, [140237]=1, [140238]=1, [140241]=1, [140244]=1, [140247]=1, [140250]=1,
[140251]=1, [140252]=1, [140254]=1, [140255]=1, [140304]=1, [140305]=1, [140306]=1, [140307]=1, [140310]=1, [140322]=1, [140349]=1, [140357]=1,
[140358]=1, [140359]=1, [140361]=1, [140364]=1, [140365]=1, [140366]=1, [140367]=1, [140368]=1, [140369]=1, [140370]=1, [140371]=1, [140372]=1,
[140373]=1, [140374]=1, [140377]=1, [140379]=1, [140380]=1, [140381]=1, [140382]=1, [140383]=1, [140384]=1, [140385]=1, [140386]=1, [140387]=1,
[140388]=1, [140389]=1, [140391]=1, [140392]=1, [140393]=1, [140396]=1, [140409]=1, [140410]=1, [140421]=1, [140422]=1, [140444]=1, [140445]=1,
[140459]=1, [140460]=1, [140461]=1, [140462]=1, [140463]=1, [140466]=1, [140467]=1, [140468]=1, [140469]=1, [140470]=1, [140471]=1, [140473]=1,
[140474]=1, [140475]=1, [140476]=1, [140477]=1, [140478]=1, [140479]=1, [140480]=1, [140481]=1, [140482]=1, [140484]=1, [140485]=1, [140486]=1,
[140487]=1, [140488]=1, [140489]=1, [140490]=1, [140491]=1, [140492]=1, [140494]=1, [140497]=1, [140498]=1, [140503]=1, [140504]=1, [140505]=1,
[140507]=1, [140508]=1, [140509]=1, [140510]=1, [140511]=1, [140512]=1, [140513]=1, [140515]=1, [140516]=1, [140517]=1, [140518]=1, [140519]=1,
[140520]=1, [140521]=1, [140522]=1, [140523]=1, [140524]=1, [140525]=1, [140528]=1, [140529]=1, [140530]=1, [140531]=1, [140532]=1, [140685]=1,
[140847]=1, [141023]=1, [141024]=1, [141310]=1, [141313]=1, [141314]=1, [141337]=1, [141383]=1, [141384]=1, [141385]=1, [141386]=1, [141387]=1,
[141388]=1, [141389]=1, [141390]=1, [141391]=1, [141392]=1, [141393]=1, [141394]=1, [141395]=1, [141396]=1, [141397]=1, [141398]=1, [141399]=1,
[141400]=1, [141401]=1, [141402]=1, [141403]=1, [141404]=1, [141405]=1, [141638]=1, [141639]=1, [141667]=1, [141668]=1, [141669]=1, [141670]=1,
[141671]=1, [141672]=1, [141673]=1, [141674]=1, [141675]=1, [141676]=1, [141677]=1, [141678]=1, [141679]=1, [141680]=1, [141681]=1, [141682]=1,
[141683]=1, [141684]=1, [141685]=1, [141689]=1, [141690]=1, [141699]=1, [141701]=1, [141702]=1, [141703]=1, [141704]=1, [141705]=1, [141706]=1,
[141707]=1, [141708]=1, [141709]=1, [141710]=1, [141711]=1, [141852]=1, [141853]=1, [141854]=1, [141855]=1, [141856]=1, [141857]=1, [141858]=1,
[141859]=1, [141863]=1, [141872]=1, [141876]=1, [141877]=1, [141883]=1, [141886]=1, [141887]=1, [141888]=1, [141889]=1, [141890]=1, [141891]=1,
[141892]=1, [141896]=1, [141921]=1, [141922]=1, [141923]=1, [141924]=1, [141925]=1, [141926]=1, [141927]=1, [141928]=1, [141929]=1, [141930]=1,
[141931]=1, [141932]=1, [141933]=1, [141934]=1, [141935]=1, [141936]=1, [141937]=1, [141940]=1, [141941]=1, [141942]=1, [141943]=1, [141944]=1,
[141945]=1, [141946]=1, [141947]=1, [141948]=1, [141949]=1, [141950]=1, [141951]=1, [141952]=1, [141953]=1, [141954]=1, [141955]=1, [141956]=1,
[142001]=1, [142002]=1, [142003]=1, [142004]=1, [142005]=1, [142006]=1, [142007]=1, [142054]=1, [142449]=1, [142450]=1, [142451]=1, [142453]=1,
[142454]=1, [142455]=1, [142533]=1, [142534]=1, [142535]=1, [142555]=1, [143333]=1, [143486]=1, [143487]=1, [143488]=1, [143498]=1, [143499]=1,
[143533]=1, [143536]=1, [143538]=1, [143540]=1, [143677]=1, [143680]=1, [143713]=1, [143714]=1, [143715]=1, [143716]=1, [143738]=1, [143739]=1,
[143740]=1, [143741]=1, [143742]=1, [143743]=1, [143744]=1, [143745]=1, [143746]=1, [143747]=1, [143749]=1, [143757]=1, [143844]=1, [143868]=1,
[143869]=1, [143870]=1, [143871]=1, [144266]=1, [144267]=1, [144268]=1, [144269]=1, [144270]=1, [144271]=1, [144272]=1, [144297]=1, [146122]=1,
[146123]=1, [146124]=1, [146125]=1, [146126]=1, [146127]=1, [146128]=1, [146129]=1, [146309]=1, [146313]=1, [146314]=1, [146315]=1, [146316]=1,
[146318]=1, [146319]=1, [146320]=1, [146321]=1, [146322]=1, [146323]=1, [146324]=1, [146325]=1, [146326]=1, [146327]=1, [146329]=2, [146662]=1,
[146663]=1, [146664]=1, [146671]=1, [147198]=1, [147199]=1, [147200]=1, [147201]=1, [147202]=1, [147203]=1, [147293]=1, [147398]=1, [147399]=1,
[147400]=1, [147401]=1, [147402]=1, [147403]=1, [147404]=1, [147405]=1, [147406]=1, [147407]=1, [147408]=1, [147409]=1, [147441]=1, [147442]=1,
[147444]=1, [147456]=1, [147457]=1, [147458]=1, [147459]=1, [147460]=1, [147461]=1, [147462]=1, [147463]=1, [147464]=1, [147465]=1, [147466]=1,
[147467]=1, [147468]=1, [147469]=1, [147470]=1, [147471]=1, [147472]=1, [147473]=1, [147474]=1, [147475]=1, [147476]=1, [147477]=1, [147478]=1,
[147479]=1, [147480]=1, [147481]=1, [147482]=1, [147483]=1, [147484]=1, [147485]=1, [147486]=1, [147513]=2, [147548]=1, [147549]=1, [147550]=1,
[147551]=1, [147579]=1, [147581]=1, [147718]=1, [147719]=1, [147720]=1, [147721]=1, [147808]=1, [147809]=1, [147810]=1, [147811]=1, [147812]=1,
[147814]=1, [147818]=1, [147819]=1, [147842]=1, [150931]=1, [151240]=1, [151241]=1, [151242]=1, [151243]=1, [151244]=1, [151245]=1, [151246]=1,
[151247]=1, [151556]=1, [151561]=1, [151619]=1, [151620]=1, [151696]=1, [151697]=1, [151698]=1, [151699]=1, [151700]=1, [151789]=1, [151914]=1,
[151915]=1, [151916]=1, [151917]=1, [151918]=1, [151919]=1, [151920]=1, [151921]=1, [151922]=1, [152430]=1, [152431]=1, [152432]=1, [152433]=1,
[152434]=1, [152435]=1, [152504]=1, [152651]=1, [152653]=1, [152654]=1, [152700]=1, [152706]=1, [152707]=1, [152708]=1, [152709]=1, [152710]=1,
[152711]=1, [152712]=1, [152713]=1, [152937]=1, [152938]=1, [152939]=1, [152962]=1, [152984]=1, [153001]=1, [153007]=1, [153008]=1, [153009]=1,
[153046]=1, [153047]=1, [153048]=1, [153052]=1, [153159]=1, [153160]=1, [153161]=1, [153162]=1, [153163]=1, [153164]=1, [153165]=1, [153198]=1,
[153199]=1, [153200]=1, [153201]=1, [153217]=1, [153218]=1, [153220]=1, [153221]=1, [153222]=1, [153223]=1, [153224]=1, [153225]=1, [153246]=1,
[153259]=1, [153266]=1, [153278]=1, [155657]=1
};
artifactKnowledgeMultiplier = {
-- with 7.0
0.25, 0.50, 0.90, 1.40, 2.00, -- 1 - 5
2.75, 3.75, 5.00, 6.50, 8.50, -- 6 - 10
11.00, 14.00, 17.75, 22.50, 28.50, -- 11 - 15
36.00, 45.50, 57.00, 72.00, 90.00, -- 16 - 20
113.00,142.00,178.00,223.00,249.00, -- 21 - 25
-- with 7.2
1000.00, 1300.00, 1700.00, 2200.00, 2900.00, -- 26 - 30
3800.00, 4900.00, 6400.00, 8300.00, 10800.00, -- 31 - 35
14000.00, 18200.00, 23700.00, 30800.00, 40000.00, -- 36 - 40
-- with 7.2.5
-- 52000.00, 67600.00, 87900.00, 114300.00, 148600.00, -- 41 - 45
--193200.00, 251200.00, 326600.00, 424600.00, 552000.00, -- 46 - 50
-- with 7.3
160000.00, 208000.00, 270400.00, 351500.00, 457000.00, -- 41 - 45
594000.00, 772500.00, 1004000.00, 1305000.00, 1696500.00, -- 46 - 50
2205500.00, 2867500.00, 3727500.00, 4846000.00, 6300000.00, -- 51 - 55
-- wow... damned high values
}
AP_MATCH_STRINGS = ({
deDE = "Gewährt Eurem derzeit ausgerüsteten Artefakt (.*) Artefaktmacht",
enUS = "Grants (.*) Artifact Power to your currently equipped Artifact",
esES = "Otorga (.*) p. de poder de artefacto al artefacto que lleves equipado",
esMX = "Otorga (.*) p. de Poder de artefacto para el artefacto que llevas equipado",
frFR = "Confère (.*) point* de puissance à l’arme prodigieuse que vous brandissez",
itIT = {"Fornisce (.*) Potere Artefatto all'Artefatto attualmente equipaggiato.","(.*) Potere Artefatto fornito all'Artefatto attualmente equipaggiato"},
koKR = {"현재 장착한 유물에 (.*)의 유물력을 부여합니다.","현재 장착한 유물에 (.*)의 유물력 부여"},
ptBR = "Concede (.*) de Poder do Artefato ao artefato equipado",
ptPT = "Concede (.*) de Poder do Artefato ao artefato equipado",
ruRU = {"Добавляет используемому в данный момент артефакту (.*) ед. силы артефакта.","Добавление используемому в данный момент артефакту (.*) ед. силы артефакта"},
zhCN = "将(.*)点神器能量注入到你当前装备的神器之中",
zhTW = "賦予你目前裝備的神兵武器(.*)點神兵之力",
})[ns.locale];
FISHING_AP_MATCH_STRINGS = ({
deDE = "Wirft den Fisch zurück ins Wasser und gewährt Eurem Angelartefakt (.*) Artefaktmacht",
enUS = "Toss the fish back into the water, granting (.*) Artifact Power to your fishing artifact",
esES = "Lanza el pez de nuevo al agua, lo que otorga (.*) p. de poder de artefacto a tu artefacto de pesca",
esMX = "Devuelve el pez al agua, lo que otorga (.*) de poder de artefacto a tu artefacto de pesca",
frFR = "Vous rejetez le poisson à l’eau, ce qui confère (.*) $lpoint:points; de puissance prodigieuse à votre ustensile de pêche prodigieux",
itIT = "Rilancia il pesce in acqua, fornendo (.*) Potere Artefatto al tuo artefatto da pesca",
koKR = "물고기를 다시 물에 던져 낚시 유물에 (.*)의 유물력을 추가합니다.",
ptBR = "Joga o peixe de volta na água, concedendo (.*) de Poder do Artefato ao seu artefato de pesca",
ptPT = "Joga o peixe de volta na água, concedendo (.*) de Poder do Artefato ao seu artefato de pesca",
ruRU = "Бросить рыбу обратно в воду, добавив вашему рыболовному артефакту (.*) ед. силы артефакта",
zhCN = "将鱼扔回到水中,使你的钓鱼神器获得(.*)点神器能量",
zhTW = "將魚丟回水中,為你的釣魚神器取得(.*)點神兵之力",
})[ns.locale];
for _,expo in ipairs({{SECOND_NUMBER,6},{THIRD_NUMBER,9},{FOURTH_NUMBER,12}})do
local strs = {strsplit(HEADER_COLON,(expo[1]:gsub("%\1247(.*);","%1")))};
table.sort(strs,sort_up_down);
for i,v in pairs(strs)do
table.insert(number_pattern,{v,expo[2]});
end
end
end
local function UpdateNumArtifact()
obtained = C_ArtifactUI.GetNumObtainedArtifacts() or 0;
updateBroker();
triggerLocked = false
end
function module.onevent(self,event,arg1,...)
if event=="BE_UPDATE_CFG" and arg1 and arg1:find("^ClickOpt") then
ns.ClickOpts.update(name);
elseif event=="PLAYER_LOGIN" then
if ns.toon[name]==nil then
ns.toon[name] = {equipped=false,knowledgeLevel=0};
end
if ns.toon[name].knowledgeLevel==nil then
ns.toon[name].knowledgeLevel = 0;
end
if ns.toon[name].obtained==nil then
ns.toon[name].obtained = {};
for id, data in pairs(ns.toon[name])do
if type(id)=="number" and id>0 and type(data)=="table" and data.name then
ns.toon[name].obtained[id] = true;
end
end
end
if ns.toon[name][0]~=nil then
ns.toon[name][0]=nil;
ns.toon[name].obtained[0]=nil;
end
ns.items.RegisterCallback(name,updateItemState,"any");
C_Timer.After(2,function()
module:onevent("BE_DUMMY_EVENT");
end);
end
if ns.eventPlayerEnteredWorld and not triggerLocked then
triggerLocked = true
--if event=="ARTIFACT_XP_UPDATE" or event=="ARTIFACT_MAX_RANKS_UPDATE" or event=="ARTIFACT_UPDATE" then
C_Timer.After(.15,UpdateNumArtifact)
end
end
-- function module.optionspanel(panel) end
-- function module.onmousewheel(self,direction) end
-- function module.ontooltip(tooltip) end
function module.onenter(self)
if (ns.tooltipChkOnShowModifier(false)) then return; end
tt = ns.acquireTooltip({ttName, ttColumns, "LEFT", "RIGHT", "RIGHT", "LEFT", "LEFT","RIGHT", "CENTER", "LEFT", "LEFT", "LEFT"},{false},{self});
createTooltip(tt);
end
-- function module.onleave(self) end
-- function module.onclick(self,button) end
-- function module.ondblclick(self,button) end
-- final module registration --
-------------------------------
ns.modules[name] = module;