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.
1061 lines
44 KiB
1061 lines
44 KiB
|
|
-- module independent variables --
|
|
----------------------------------
|
|
local addon, ns = ...;
|
|
local C,L,I = ns.LC.color,ns.L,ns.I;
|
|
if not ns.IsRetailClient() then return end
|
|
|
|
|
|
-- module own local variables and local cached functions --
|
|
-----------------------------------------------------------
|
|
local name = "Professions"; -- TRADE_SKILLS L["ModDesc-Professions"]
|
|
local ttName,ttName2,ttColumns,ttColumns2,tt,tt2,module = name.."TT",name.."TT2",2,3;
|
|
local professions,cdSpells,skillNameById,toonDB,locked = {},{},{};
|
|
local faction_recipes,PATTERN_SKILL_RANK_UP = {factionId=1,standing=2,itemId=3,spellId=4,rank=5};
|
|
local expansionSkillLines,friendStandingLabel
|
|
do
|
|
local arg1pattern, arg2pattern = "'%%s'","%%d";
|
|
if LOCALE_deDE then
|
|
arg1pattern, arg2pattern = "%%1%$s","%%2%$d"
|
|
end
|
|
PATTERN_SKILL_RANK_UP = ERR_SKILL_UP_SI:gsub(arg1pattern, "(.+)"):gsub(arg2pattern, "(%%d+)")
|
|
end
|
|
local cd_groups = { -- %s cooldown group
|
|
"Transmutation", -- L["Transmutation cooldown group"]
|
|
"Jewels", -- L["Jewels cooldown group"]
|
|
"Leather" -- L["Leather cooldown group"]
|
|
}
|
|
|
|
|
|
-- register icon names and default files --
|
|
-------------------------------------------
|
|
I[name] = {iconfile="Interface\\Icons\\INV_Misc_Book_09.png",coords={0.05,0.95,0.05,0.95}}; --IconName::Professions--
|
|
|
|
|
|
-- some local functions --
|
|
--------------------------
|
|
local function cdReset(id,more)
|
|
local cd = 0;
|
|
more.days = more.days or 0;
|
|
more.hours = more.hours or 0;
|
|
cd = cd + more.days*86400 + more.hours*3600;
|
|
if (not toonDB.cooldown_locks[id]) then
|
|
toonDB.cooldown_locks[id] = time();
|
|
elseif (toonDB.cooldown_locks[id]) and (toonDB.cooldown_locks[id]+cd<time()) then
|
|
return false;
|
|
end
|
|
return cd, toonDB.cooldown_locks[id];
|
|
end
|
|
|
|
local cdResetTypes = {
|
|
function(id) -- get duration directly from GetSpellCooldown :: blizzard didn't update return values after reload.
|
|
local start, stop = GetSpellCooldown(id);
|
|
return stop - (GetTime()-start), time();
|
|
end,
|
|
function(id) -- use GetSpellCooldown to test and use GetQuestResetTime as duration time
|
|
return GetQuestResetTime(), time();
|
|
end,
|
|
function(id) -- 3 days
|
|
return cdReset(id,{days=3});
|
|
end,
|
|
function(id) -- 20 hours
|
|
return cdReset(id,{hours=20});
|
|
end,
|
|
function(id) -- 6 days & 20 hours
|
|
return cdReset(id,{hours=20,days=6});
|
|
end
|
|
}
|
|
|
|
local function OnLearnRecipe(bag,slot,itemId,info) -- info {exp=<expansionIndex>,index=<index>,professionID=<professionID>}
|
|
local recipeItemID = faction_recipes[ info.exp ][ info.professionID ][ info.index ][ faction_recipes.itemId ];
|
|
if recipeItemID and recipeItemID==itemId then
|
|
toonDB.unlearnedRecipes[recipeItemID]=nil;
|
|
end
|
|
end
|
|
|
|
local function chkExpiredCooldowns()
|
|
toonDB.hasCooldowns = false;
|
|
|
|
-- check for expired cooldowns
|
|
local nCooldowns = 0;
|
|
for i,v in pairs(toonDB.cooldowns) do
|
|
if (type(v)=="table") and (v.timeLeft) and (v.timeLeft-(time()-v.lastUpdate)<=0) then
|
|
toonDB.cooldowns[i]=nil;
|
|
else
|
|
nCooldowns=nCooldowns+1;
|
|
toonDB.hasCooldowns=true;
|
|
end
|
|
end
|
|
end
|
|
|
|
local function chkCooldownSpells(skillId,icon)
|
|
if cdSpells[skillId] then
|
|
local cooldown,idOrGroup,timeLeft,lastUpdate,_name
|
|
local spellId, cdGroup, cdType = 1,2,3;
|
|
for _,cd in pairs(cdSpells[skillId]) do
|
|
cooldown = GetSpellCooldown(cd[spellId]);
|
|
if cooldown and cooldown>0 then
|
|
idOrGroup = (cd[cdGroup]>0) and "cd.group."..cd[cdGroup] or cd[spellId];
|
|
_name = (cd[cdGroup]>0) and cd_groups[cdGroup].." cooldown group" or select(1,GetSpellInfo(cd[spellId]));
|
|
timeLeft,lastUpdate = cdResetTypes[cd[cdType]](cd[spellId]);
|
|
|
|
if (toonDB.cooldowns[idOrGroup] and (timeLeft~=false) and floor(toonDB.cooldowns[idOrGroup].timeLeft)~=floor(timeLeft)) or (not toonDB.cooldowns[idOrGroup]) then
|
|
toonDB.cooldowns[idOrGroup] = {name=_name,icon=icon,timeLeft=timeLeft,lastUpdate=lastUpdate};
|
|
toonDB.hasCooldowns = true;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local UpdateFactionRecipesHook
|
|
do
|
|
local alreadyShown,ticker = {}
|
|
local function UpdateFactionRecipes(self)
|
|
local skillLine,pInfo = nil,ProfessionsFrame.GetProfessionInfo(); -- too slow
|
|
if pInfo then skillLine = pInfo.parentProfessionID or false end
|
|
if not skillLine then return end
|
|
ticker:Cancel();
|
|
if not (skillLine and alreadyShown[skillLine]==nil) then return end
|
|
local count,known,unknown = 0,0,0;
|
|
for expansionIndex, recipes in pairs(faction_recipes) do
|
|
if tonumber(expansionIndex) and recipes[skillLine] then
|
|
for index,recipe in ipairs(recipes[skillLine]) do
|
|
if recipe[faction_recipes.spellId]>0 then
|
|
local info = C_TradeSkillUI.GetRecipeInfo(recipe[faction_recipes.spellId]);
|
|
if info and info.learned==true then
|
|
toonDB.unlearnedRecipes[recipe[faction_recipes.itemId] ] = nil;
|
|
known=known+1;
|
|
else
|
|
toonDB.unlearnedRecipes[recipe[faction_recipes.itemId] ] = true;
|
|
ns.UseContainerItemHook.registerItemID(name,recipe[faction_recipes.itemId],OnLearnRecipe,{exp=expansionIndex,index=index, professionID = skillLine});
|
|
unknown=unknown+1;
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
alreadyShown[skillLine] = true;
|
|
end
|
|
function UpdateFactionRecipesHook()
|
|
ProfessionsFrame:HookScript("OnShow",function() ticker = C_Timer.NewTicker(.2,UpdateFactionRecipes); end);
|
|
end
|
|
if ProfessionsFrame then
|
|
-- client 10.1; ProfessionsFrame loaded early
|
|
-- client 10.1.5; AddOn Blizzard_Professions loading on demand
|
|
UpdateFactionRecipesHook()
|
|
UpdateFactionRecipesHook=nil;
|
|
end
|
|
end
|
|
|
|
local function updateTradeSkills()
|
|
wipe(professions)
|
|
|
|
local lst = {GetProfessions()}; -- prof1, prof2, arch, fish, cook
|
|
for order,index in pairs(lst) do
|
|
local skillName, texture, rank, maxRank, numSpells, spelloffset, skillLine, rankModifier, specializationIndex, specializationOffset, skillLineName
|
|
if index then
|
|
skillName, texture, rank, maxRank, numSpells, spelloffset, skillLine, rankModifier, specializationIndex, specializationOffset, skillLineName = GetProfessionInfo(index);
|
|
end
|
|
if skillName then
|
|
local _, spellId = GetSpellBookItemInfo(1 + spelloffset, BOOKTYPE_PROFESSION);
|
|
professions[order] = {
|
|
skillName = skillName,
|
|
skillNameFull = skillLineName,
|
|
skillIcon = texture,
|
|
skillId = skillLine,
|
|
spellId = spellId,
|
|
numSkill = rank or 0,
|
|
maxSkill = maxRank or 0,
|
|
skillModifier = rankModifier or 0,
|
|
};
|
|
chkCooldownSpells(skillLine,texture);
|
|
chkExpiredCooldowns();
|
|
skillNameById[skillLine] = skillName;
|
|
else
|
|
professions[order] = false;
|
|
end
|
|
end
|
|
|
|
-- class skills
|
|
for spellId,t in pairs({[1804]={"ROGUE",0,true},[53428]={"DEATHKNIGHT",1,false}})do
|
|
if ns.player.class==t[1] then
|
|
local spellName,_,icon = GetSpellInfo(spellId);
|
|
local skill,maxSkill = 0,0;
|
|
if IsSpellKnown(spellId) then
|
|
if t[1]=="ROGUE" then
|
|
skill = UnitLevel("player") * 5;
|
|
maxSkill = skill;
|
|
else
|
|
skill,maxSkill = t[2],t[2];
|
|
end
|
|
end
|
|
tinsert(professions,{
|
|
skillName = spellName,
|
|
skillNameFull = spellName,
|
|
skillIcon = icon,
|
|
skillId = false,
|
|
spellId = spellId,
|
|
numSkill = skill,
|
|
maxSkill = maxSkill,
|
|
disabled = t[3]
|
|
});
|
|
end
|
|
end
|
|
end
|
|
|
|
--[=[ - TradeSkillFrame does not exists in dragonflight; new functon coming soon.
|
|
local function updateCooldownAndRecipeLists(skillLineID,rebuildCooldowns) -- on hooked TradeSkillFrame:RefreshTitle()
|
|
local factionRecipeIDs = {};
|
|
-- create recipe spellId list
|
|
for expansionIndex,recipes in pairs(faction_recipes) do
|
|
if not tonumber(recipes) and recipes[skillLineID] then
|
|
for _,recipeInfo in ipairs(recipes[skillLineID]) do
|
|
factionRecipeIDs[recipeInfo[faction_recipes.spellId]] = recipeInfo[faction_recipes.itemId];
|
|
end
|
|
end
|
|
end
|
|
--[[
|
|
local rebuildCooldowns = true;
|
|
if dataDB.recipeCooldowns[skillLineID]==nil then
|
|
dataDB.recipeCooldowns[skillLineID] = {};
|
|
rebuildCooldowns = true;
|
|
end
|
|
--]]
|
|
local learnedRecipes = {};
|
|
for i, recipeId in ipairs(C_TradeSkillUI.GetAllRecipeIDs()) do
|
|
-- status of recipes buyable from faction vendors
|
|
if factionRecipeIDs[recipeId] then
|
|
local recipeInfo = C_TradeSkillUI.GetRecipeInfo(recipeId);
|
|
if recipeInfo then
|
|
local isUnlearned = nil;
|
|
if not recipeInfo.learned then
|
|
isUnlearned = true;
|
|
end
|
|
toonDB.unlearnedRecipes[factionRecipeIDs[recipeId]] = isUnlearned;
|
|
end
|
|
end
|
|
-- spell cooldowns
|
|
--[[
|
|
if rebuildCooldowns then
|
|
--local cooldown, isDayCooldown, charges, maxCharges = C_TradeSkillUI.GetRecipeCooldown(recipeId);
|
|
local _,_,cooldown = GetSpellCooldown(recipeId);
|
|
--learnedRecipes[recipeId] = recipeInfo.learned
|
|
if recipeId==143011 then
|
|
ns:debug(name,recipeId,cooldown);
|
|
end
|
|
if cooldown then
|
|
dataDB.recipeCooldowns[skillLineID][recipeId] = {isDayCooldown, charges, maxCharges};
|
|
-- /dump C_TradeSkillUI.GetRecipeCooldown(GetMouseFocus().tradeSkillInfo.recipeID)
|
|
-- 143011
|
|
end
|
|
end
|
|
--]]
|
|
end
|
|
end
|
|
--]=]
|
|
---------------------------
|
|
|
|
local function updateBroker()
|
|
local inTitle = {};
|
|
|
|
for place=1, 4 do
|
|
local profIndex = ns.profile[name].inTitle[place];
|
|
if profIndex and professions[profIndex] and professions[profIndex].skillIcon and professions[profIndex].numSkill and professions[profIndex].maxSkill then
|
|
local modifier,color = "","gray2";
|
|
if professions[profIndex].numSkill~=professions[profIndex].maxSkill then
|
|
color = "ffff"..string.format("%02x",255*(professions[profIndex].numSkill/professions[profIndex].maxSkill)).."00";
|
|
end
|
|
if professions[profIndex].skillModifier and professions[profIndex].skillModifier>0 then
|
|
modifier = C("green","+"..professions[profIndex].skillModifier);
|
|
end
|
|
table.insert(inTitle, ("%s/%s|T%s:0|t"):format(C(color,professions[profIndex].numSkill)..modifier,C(color,professions[profIndex].maxSkill),professions[profIndex].skillIcon));
|
|
end
|
|
end
|
|
|
|
local obj = ns.LDB:GetDataObjectByName(module.ldbName);
|
|
obj.text = (#inTitle==0) and TRADE_SKILLS or table.concat(inTitle," ");
|
|
end
|
|
|
|
local function CreateTooltip2(self, content)
|
|
local content,expansion,tsId,recipes,factions = unpack(content);
|
|
tt2 = ns.acquireTooltip({ttName2, ttColumns2, "LEFT","RIGHT","CENTER"},{true,true},{self, "horizontal", tt});
|
|
|
|
if content=="skill-list" then
|
|
--
|
|
elseif content=="faction-recipes" then
|
|
tt2:AddLine(
|
|
C("ltblue",L["Recipes from faction vendors"].." ("..skillNameById[tsId]..")"),
|
|
C("ltblue",QUEST_TOOLTIP_REQUIREMENTS:gsub(HEADER_COLON:trim(),"")),
|
|
C("ltblue",L["Buyable"])
|
|
);
|
|
tt2:AddSeparator();
|
|
|
|
local factionID,factionName,currentStanding,standingID,_ = 0;
|
|
local c = C("ltgray"," [%d]");
|
|
for _, recipeData in ipairs(recipes) do
|
|
local factionId, standing, itemId, spellId, recipeRank = unpack(recipeData);
|
|
if skillNameById[tsId] then
|
|
local Name = GetSpellInfo(spellId);
|
|
if Name then
|
|
-- faction header
|
|
if factionID~=recipeData[1] then
|
|
factionID = factionId;
|
|
factionName,_,currentStanding = GetFactionInfoByID(factionID);
|
|
local currentStandingStr = "Error";
|
|
if factions[factionID].isMajor then
|
|
local info = C_MajorFactions.GetMajorFactionData(factionID)
|
|
if info then
|
|
currentStandingStr = MAJOR_FACTION_RENOWN_LEVEL_TOAST:format(info.renownLevel);
|
|
currentStanding = info.renownLevel;
|
|
end
|
|
else
|
|
local friendInfo = C_GossipInfo.GetFriendshipReputation(factionID);
|
|
if friendInfo and friendInfo.friendshipFactionID~=0 then
|
|
local ranks = C_GossipInfo.GetFriendshipReputationRanks(factionID);
|
|
currentStandingStr = friendInfo.reaction..c:format(ranks.currentLevel);
|
|
currentStanding = ranks.currentLevel;
|
|
else
|
|
currentStandingStr = _G["FACTION_STANDING_LABEL"..currentStanding];
|
|
end
|
|
end
|
|
tt2:AddLine(C("ltgray",factionName:gsub("%-%\r%\n","")),C("ltgray",currentStandingStr));
|
|
end
|
|
-- recipe
|
|
local color,buyable = "red",NO;
|
|
local standingText = ""
|
|
if factions[factionID].isMajor then
|
|
standingText = MAJOR_FACTION_RENOWN_LEVEL_TOAST:format(standing);
|
|
elseif friendStandingLabel[factionID] then
|
|
standingText = friendStandingLabel[factionID][standing]..c:format(standing);
|
|
else
|
|
standingText = _G["FACTION_STANDING_LABEL"..standing];
|
|
end
|
|
if toonDB.unlearnedRecipes[itemId]==nil then
|
|
color,buyable = "ltgreen",ALREADY_LEARNED;
|
|
elseif currentStanding>=standing then
|
|
color,buyable = "green",YES;
|
|
end
|
|
local stars = "";
|
|
if recipeRank then
|
|
stars = " "..("|Tinterface\\common\\reputationstar:12:12:0:0:32:32:2:14:2:14|t"):rep(recipeRank);
|
|
end
|
|
tt2:AddLine(" "..C("ltyellow",Name)..stars,C(color,standingText),C(color,buyable));
|
|
end
|
|
end
|
|
end
|
|
|
|
tt2:SetCell(tt2:AddLine(),1,C("orange",ns.strWrap(L["ProfessionFactionRecipeInfo"],80)),nil,nil,3);
|
|
end
|
|
|
|
ns.roundupTooltip(tt2, true);
|
|
end
|
|
|
|
local function AddFactionRecipeLines(tt,expansion,recipesByProfession)
|
|
local faction,trade_skill,factionName,factionId,standingID,_ = 0,0;
|
|
local factions,tskills = {},{};
|
|
|
|
tt:AddLine(C("gray",_G["EXPANSION_NAME"..expansion]));
|
|
for skillId, recipes in pairs(recipesByProfession) do
|
|
if skillNameById[skillId] then
|
|
local count = {0,0,0}; -- <learned>,<buyable>,<total>
|
|
for _,recipe in ipairs(recipes) do
|
|
if not factions[recipe[1]] then -- fill factions table
|
|
factions[recipe[1]] = {};
|
|
factions[recipe[1]].name,_,factions[recipe[1]].standing = GetFactionInfoByID(recipe[1]);
|
|
if C_Reputation.IsMajorFaction(recipe[1]) then
|
|
local info = C_MajorFactions.GetMajorFactionData(recipe[1])
|
|
if info then
|
|
factions[recipe[1]].isMajor = true;
|
|
factions[recipe[1]].standing = info.renownLevel;
|
|
factions[recipe[1]].standingText = MAJOR_FACTION_RENOWN_LEVEL_TOAST:format(info.renownLevel);
|
|
end
|
|
elseif factions[recipe[1]].standing then
|
|
factions[recipe[1]].standingText = _G["FACTION_STANDING_LABEL"..factions[recipe[1]].standing];
|
|
else
|
|
factions[recipe[1]].standingText = "Error";
|
|
end
|
|
end
|
|
if toonDB.unlearnedRecipes[recipe[3]]==nil then
|
|
count[1] = count[1]+1; -- learned
|
|
end
|
|
if recipe[2]==factions[recipe[1]].standing then
|
|
count[2] = count[2]+1; -- buyable
|
|
end
|
|
count[3] = count[3]+1; -- total
|
|
end
|
|
local l=tt:AddLine(" "..C(count[1]==count[3] and "gray2" or "ltyellow",skillNameById[skillId]));
|
|
tt:SetCell(l,2,("%d/%d"):format(count[1],count[3]));
|
|
tt:SetLineScript(l,"OnEnter",CreateTooltip2,{"faction-recipes",expansion,skillId,recipes,factions});
|
|
end
|
|
end
|
|
end
|
|
|
|
local function expansionSkillLines_OnEnter(self,skillId)
|
|
if not expansionSkillLines then
|
|
expansionSkillLines = {}
|
|
local list = C_TradeSkillUI.GetAllProfessionTradeSkillLines();
|
|
for i=1, #list do
|
|
local info = C_TradeSkillUI.GetProfessionInfoBySkillLineID(list[i]);
|
|
if info.parentProfessionID then
|
|
expansionSkillLines[info.parentProfessionID] = expansionSkillLines[info.parentProfessionID] or {};
|
|
tinsert(expansionSkillLines[info.parentProfessionID],list[i]);
|
|
end
|
|
end
|
|
end
|
|
|
|
if not expansionSkillLines[skillId] then
|
|
return
|
|
end
|
|
|
|
tt2 = ns.acquireTooltip({ttName2, ttColumns2, "LEFT","RIGHT","CENTER"},{true,true},{self, "horizontal", tt});
|
|
|
|
if C_TradeSkillUI.GetProfessionInfoBySkillLineID then
|
|
for i=1, #expansionSkillLines[skillId] do
|
|
local skillInfo = C_TradeSkillUI.GetProfessionInfoBySkillLineID(expansionSkillLines[skillId][i]);
|
|
if skillInfo then
|
|
local color,text = "ltgray",L["Learnable"];
|
|
if skillInfo.skillLevel and skillInfo.maxSkillLevel and skillInfo.maxSkillLevel~=0 then
|
|
local percentSkillLevel = skillInfo.skillLevel/skillInfo.maxSkillLevel;
|
|
if percentSkillLevel==1 then
|
|
color = "gray2";
|
|
else
|
|
color = "ffff"..string.format("%02x",255*percentSkillLevel).."00";
|
|
end
|
|
text = skillInfo.skillLevel..'/'..skillInfo.maxSkillLevel;
|
|
end
|
|
tt2:AddLine(C("ltyellow",skillInfo.expansionName),C(color,text));
|
|
end
|
|
end
|
|
else
|
|
for i=1, #expansionSkillLines[skillId] do
|
|
local skillLineDisplayName, skillLineRank, skillLineMaxRank, skillLineModifier, parentSkillLineID = C_TradeSkillUI.GetTradeSkillLineInfoByID(expansionSkillLines[skillId][i]);
|
|
if skillLineDisplayName then
|
|
local color,text = "ltgray",L["Learnable"];
|
|
if skillLineRank and skillLineMaxRank and skillLineMaxRank~=0 then
|
|
local skillPercent = skillLineRank/skillLineMaxRank;
|
|
if skillPercent==1 then -- on max skill
|
|
color = "gray2";
|
|
else
|
|
color = "ffff"..string.format("%02x",255*skillPercent).."00";
|
|
end
|
|
text = skillLineRank..'/'..skillLineMaxRank;
|
|
end
|
|
tt2:AddLine(C("ltyellow",skillLineDisplayName),C(color,text));
|
|
end
|
|
end
|
|
end
|
|
ns.roundupTooltip(tt2, true);
|
|
end
|
|
|
|
local function expansionSkillLines_OnLeave(self)
|
|
--
|
|
end
|
|
|
|
local function createTooltip(tt)
|
|
if not (tt and tt.key and tt.key==ttName) then return end -- don't override other LibQTip tooltips...
|
|
local iconnameLocale = "|T%s:12:12:0:0:64:64:2:62:4:62|t %s";
|
|
|
|
if tt.lines~=nil then tt:Clear(); end
|
|
tt:AddHeader(C("dkyellow",TRADE_SKILLS));
|
|
|
|
tt:AddLine(C("ltblue",NAME),C("ltblue",SKILL),C("ltblue",ABILITIES));
|
|
tt:AddSeparator();
|
|
if #professions>0 then
|
|
for i,v in ipairs(professions) do
|
|
if v then
|
|
local color1,color2,modifier,nameStr = "ltyellow","white","",v.skillNameFull or v.skillName or UNKNOWN;
|
|
if v.maxSkill==0 then
|
|
color1,color2 = "gray","gray";
|
|
else
|
|
local skillPercent = v.numSkill/v.maxSkill;
|
|
if skillPercent==1 then -- on max skill
|
|
color2 = "gray2";
|
|
else
|
|
color2 = "ffff"..string.format("%02x",255*skillPercent).."00";
|
|
end
|
|
if v.skillModifier and v.skillModifier>0 then
|
|
modifier = C("green","+"..v.skillModifier);
|
|
end
|
|
if v.skillNameFull and v.skillName and v.skillNameFull~=v.skillName then
|
|
nameStr = "";
|
|
local str = {strsplit(";",(v.skillNameFull:gsub(v.skillName,";%1;")))};
|
|
for i=1, #str do
|
|
if str[i]==v.skillName then
|
|
nameStr = nameStr..C(color1,v.skillName);
|
|
elseif str[i]~="" then
|
|
nameStr = nameStr..C("gray2",str[i]);
|
|
end
|
|
end
|
|
else
|
|
nameStr = C(color1,nameStr);
|
|
end
|
|
end
|
|
local l = tt:AddLine((iconnameLocale):format(v.skillIcon or ns.icon_fallback,nameStr),C(color2,v.numSkill)..modifier..C(color2,"/"..v.maxSkill));
|
|
tt:SetLineScript(l,"OnEnter",expansionSkillLines_OnEnter,v.skillId);
|
|
--tt:SetLineScript(l,"OnLeave",expansionSkillLines_OnLeave);
|
|
end
|
|
end
|
|
|
|
-- link to second tooltip
|
|
local showFactionRecipesHeader,showFactionRecipes = false,{
|
|
{"Legion",6,false},{"BFA",7,false},{"Shadow",8,false},{"DF",9,false},
|
|
};
|
|
for i=1, #showFactionRecipes do
|
|
local e = showFactionRecipes[i];
|
|
if ns.toon.level==GetMaxLevelForExpansionLevel(e[2]) and ns.profile[name]["show"..e[1].."FactionRecipes"] then
|
|
if not showFactionRecipesHeader then
|
|
tt:AddSeparator(4,0,0,0,0);
|
|
tt:AddLine(C("ltblue",L["Recipes from faction vendors by expansion"]));
|
|
tt:AddSeparator();
|
|
showFactionRecipesHeader = true;
|
|
end
|
|
-- AddFactionRecipeLines(tt, <ExpansionIndex>, <List of recipes of the expansion>)
|
|
AddFactionRecipeLines(tt,e[2],faction_recipes[e[2]]);
|
|
end
|
|
end
|
|
else
|
|
tt:AddLine(C("gray",L["No professions learned..."]));
|
|
end
|
|
|
|
if (ns.profile[name].showCooldowns) then
|
|
local lst,sep,cd1={},false,0;
|
|
|
|
-- current toon cooldowns
|
|
local _, durationHeader = ns.DurationOrExpireDate(0,false,"Duration","Expire date"); -- L["Duration"], L["Expire date"]
|
|
if toonDB.hasCooldowns then
|
|
for i,v in pairs(toonDB.cooldowns) do
|
|
if ( (v.timeLeft-(time()-v.lastUpdate)) > 0) then
|
|
if (cd1==0) then
|
|
tinsert(lst,{type="line",data={C("ltblue",ns.player.name),C("ltblue",L[durationHeader])}});
|
|
tinsert(lst,{type="sep",data={nil}});
|
|
end
|
|
tinsert(lst,{type="cdLine",data=v});
|
|
cd1=cd1+1;
|
|
end
|
|
end
|
|
end
|
|
|
|
-- cooldowns of other toons
|
|
for i,toonNameRealm,toonName,toonRealm,toonData,isCurrent in ns.pairsToons(name,{currentFirst=true,forceSameRealm=true}) do
|
|
local hasHeader = false;
|
|
if toonData.professions and toonData.professions.cooldowns and toonData.professions.hasCooldowns==true then
|
|
local isOutdated = true;
|
|
for spellid, spellData in pairs(toonData.professions.cooldowns) do
|
|
if ( (spellData.timeLeft-(time()-spellData.lastUpdate)) > 0) then
|
|
if (not hasHeader) then
|
|
if (cd1>0) or (sep) then
|
|
tinsert(lst,{type="sep",data={4,0,0,0,0}});
|
|
end
|
|
tinsert(lst,{type="line",data={C("ltblue",ns.scm(toonName))..ns.showRealmName(name,toonRealm),C("ltblue",L[durationHeader])}});
|
|
tinsert(lst,{type="sep",data={nil}});
|
|
hasHeader = true;
|
|
sep=true;
|
|
end
|
|
tinsert(lst,{type="cdLine",data=spellData});
|
|
isOutdated = false;
|
|
end
|
|
end
|
|
if isOutdated then -- is outdated; reset cooldown data
|
|
toonData.professions = {cooldowns={},hasCooldowns=false};
|
|
end
|
|
end
|
|
end
|
|
|
|
if (#lst>0) then
|
|
tt:AddSeparator(4,0,0,0,0);
|
|
tt:AddHeader(C("dkyellow",L["Cooldowns"]));
|
|
for i,v in ipairs(lst) do
|
|
if (v.type=="sep") then
|
|
tt:AddSeparator(unpack(v.data));
|
|
elseif (v.type=="line") then
|
|
tt:AddLine(unpack(v.data));
|
|
elseif (v.type=="cdLine") then
|
|
tt:AddLine(iconnameLocale:format(GetItemIcon(v.data.name) or v.data.icon or ns.icon_fallback,C("ltyellow",v.data.name)),"~ "..ns.DurationOrExpireDate(v.data.timeLeft,v.data.lastUpdate));
|
|
end
|
|
end
|
|
end
|
|
end -- / .showCooldowns
|
|
|
|
if (ns.profile.GeneralOptions.showHints) then
|
|
tt:AddSeparator(4,0,0,0,0)
|
|
local l,c = tt:AddLine()
|
|
local _,_,mod = ns.DurationOrExpireDate();
|
|
ns.AddSpannedLine(tt,C("copper",L["Hold "..mod]).." || "..C("green",L["Show expire date instead of duration"]));
|
|
ns.ClickOpts.ttAddHints(tt,name);
|
|
end
|
|
ns.roundupTooltip(tt);
|
|
end
|
|
|
|
|
|
-- module functions and variables --
|
|
------------------------------------
|
|
module = {
|
|
events = {
|
|
"VARIABLES_LOADED",
|
|
"PLAYER_LOGIN",
|
|
"SKILL_LINES_CHANGED",
|
|
|
|
-- for faction recipes
|
|
"NEW_RECIPE_LEARNED",
|
|
|
|
-- for sub skillLines
|
|
--"CHAT_MSG_SKILL",
|
|
--"TRADE_SKILL_LIST_UPDATE",
|
|
|
|
-- for archaeology
|
|
"ARTIFACT_UPDATE",
|
|
|
|
--"CURRENCY_DISPLAY_UPDATE",
|
|
--"BAG_UPDATE_DELAYED",
|
|
|
|
"CHAT_MSG_SKILL",
|
|
"CHAT_MSG_SYSTEM"
|
|
},
|
|
config_defaults = {
|
|
enabled = true,
|
|
showCooldowns = true,
|
|
showDigSiteStatus = true,
|
|
showLegionFactionRecipes = false,
|
|
showBfAFactionRecipes = false,
|
|
showShadowFactionRecipes = false,
|
|
showDFFactionRecipes = true,
|
|
inTitle = {},
|
|
showAllFactions=true,
|
|
showRealmNames=true,
|
|
showCharsFrom="2"
|
|
},
|
|
clickOptionsRename = {
|
|
["profmenu"] = "1_open_character_info",
|
|
["menu"] = "2_open_menu"
|
|
},
|
|
clickOptions = {
|
|
["profmenu"] = {"Profession menu","module","ProfessionMenu"}, -- L["Profession menu"]
|
|
["menu"] = "OptionMenuCustom"
|
|
}
|
|
|
|
}
|
|
|
|
ns.ClickOpts.addDefaults(module,{
|
|
profmenu = "_LEFT",
|
|
menu = "_RIGHT"
|
|
});
|
|
|
|
function module.ProfessionMenu(self,button,modName,actName)
|
|
if (tt~=nil) then ns.hideTooltip(tt); end
|
|
ns.EasyMenu:InitializeMenu();
|
|
ns.EasyMenu:AddEntry({ label = L["Open"], title = true });
|
|
ns.EasyMenu:AddEntry({ separator = true });
|
|
for i,v in pairs(professions) do
|
|
if v and v.spellId and not v.disabled then
|
|
ns.EasyMenu:AddEntry({
|
|
label = v.skillName,
|
|
icon = v.skillIcon,
|
|
func = function() securecall("CastSpellByID",v.spellId); end,
|
|
disabled = not (v.numSkill and v.numSkill>0)
|
|
});
|
|
end
|
|
end
|
|
ns.EasyMenu:ShowMenu(self);
|
|
end
|
|
|
|
local function OptionMenu_TitleSet(place,obj)
|
|
local db = ns.profile[name].inTitle;
|
|
db[place] = (db[place]~=obj) and obj or false;
|
|
updateBroker();
|
|
end
|
|
|
|
function module.OptionMenu(self,button,modName,actName)
|
|
if (tt~=nil) then ns.hideTooltip(tt); end
|
|
ns.EasyMenu:InitializeMenu();
|
|
ns.EasyMenu:AddEntry({ label = L["In title"], title = true });
|
|
local numProfs,numLearned = (ns.player.class=="ROGUE") and 7 or 6,0;
|
|
for i=1, numProfs do
|
|
if (professions[i]) then
|
|
numLearned = numLearned+1;
|
|
end
|
|
end
|
|
for I=1, 3 do
|
|
local d,e,p = ns.profile[name].inTitle;
|
|
if (d[I]) and (professions[d[I]]) then
|
|
e=professions[d[I]];
|
|
p=ns.EasyMenu:AddEntry({ label = (C("dkyellow","%s%d:").." |T%s:20:20:0:0|t %s"):format(L["Place"], I, e.skillIcon, C("ltblue",e.skillName)), arrow = true, disabled=(numLearned==0) });
|
|
ns.EasyMenu:AddEntry({
|
|
label = (C("ltred","%s").." |T%s:20:20:0:0|t %s"):format(CALENDAR_VIEW_EVENT_REMOVE,e.skillIcon,C("ltblue",e.skillName)),
|
|
func = function()
|
|
OptionMenu_TitleSet(I,nil);
|
|
end
|
|
},p);
|
|
ns.EasyMenu:AddEntry({ separator=true },p);
|
|
else
|
|
p=ns.EasyMenu:AddEntry({ label = (C("dkyellow","%s%d:").." %s"):format(L["Place"],I,L["Add a profession"]), arrow = true, disabled=(numLearned==0) });
|
|
end
|
|
for i=1, numProfs do
|
|
local v = professions[i];
|
|
if (v) then
|
|
ns.EasyMenu:AddEntry({
|
|
label = v.skillName,
|
|
icon = v.skillIcon,
|
|
func = function() OptionMenu_TitleSet(I,i) end,
|
|
disabled = (not v.skillName)
|
|
},p);
|
|
end
|
|
end
|
|
end
|
|
ns.EasyMenu:AddConfig(name,true);
|
|
ns.EasyMenu:ShowMenu(self);
|
|
end
|
|
|
|
function module.options()
|
|
return {
|
|
broker = nil,
|
|
tooltip = {
|
|
showLegionFactionRecipes={ type="toggle", order=1, name=L["EmissaryVendorRecipes"].." ("..EXPANSION_NAME6..")", desc=L["EmissaryVendorRecipesDesc"], width="full" },
|
|
showBfAFactionRecipes={ type="toggle", order=2, name=L["EmissaryVendorRecipes"].." ("..EXPANSION_NAME7..")", desc=L["EmissaryVendorRecipesDesc"], width="full" },
|
|
showShadowFactionRecipes={ type="toggle", order=3, name=L["EmissaryVendorRecipes"].." ("..EXPANSION_NAME8..")", desc=L["EmissaryVendorRecipesDesc"], width="full" },
|
|
showDFFactionRecipes = { type="toggle", order=4, name=L["EmissaryVendorRecipes"].." ("..EXPANSION_NAME9..")", desc=L["EmissaryVendorRecipesDesc"], width="full" },
|
|
showCooldowns={ type="toggle", order=10, name=L["Show cooldowns"], desc=L["Show/Hide profession cooldowns from all characters."] },
|
|
showAllFactions=11,
|
|
showRealmNames=12,
|
|
showCharsFrom=13,
|
|
},
|
|
misc = nil,
|
|
}
|
|
end
|
|
|
|
function module.init()
|
|
-- [<tradeSkillId>] = { {<factionId>, <standingId>, <itemId>, <spellId>[, <recipeStars>]}, ... }
|
|
faction_recipes[6] = { -- legion
|
|
-- Alchemy
|
|
[171] = {{1859,7,142120,229218}},
|
|
-- Blacksmithing
|
|
[164] = {{1828,8,123948,182982},{1828,8,123953,182987},{1828,8,123955,182989},{1828,6,136697,209497},{1948,6,136698,209498},{1948,8,123951,182985},{1948,8,123954,182988}},
|
|
-- Enchanting
|
|
[333] = {{1859,8,128600,191013},{1859,8,128602,191015},{1859,8,128603,191016},{1859,8,128609,191022},{1883,8,128593,191006},{1883,6,128599,191012},{1883,8,128601,191014},{1883,8,128608,191021}},
|
|
-- Engineering
|
|
[202] = {{1894,6,137713,199007},{1894,6,137714,199008},{1894,8,137715,199009},{1894,8,137716,199010}},
|
|
-- Inscription
|
|
[773] = {{1894,7,137773,192897},{1894,7,137777,192901},{1894,7,137781,192905},{1894,7,142107,229183},{1900,7,137774,192898},{1900,7,137779,192903},{1900,7,137780,192904}},
|
|
-- Jewelcrafting
|
|
[755] = {{1828,6,137839,195924},{1828,8,137844,195929},{1828,8,137846,195931},{1828,8,137855,195940},{1859,8,137850,195935},{1894,8,137849,195934}},
|
|
-- Leatherworking
|
|
[165] = {{1828,7,142408,230954},{1828,8,142409,230955},{1883,6,137883,194718},{1883,8,137895,194730},{1883,8,137896,194731},{1883,8,137898,194733},{1948,6,137910,194753},{1948,6,137915,194758},{1948,8,137927,194770},{1948,8,137928,194771}},
|
|
-- Tailoring
|
|
[197] = {{1859,8,137973,185954},{1859,8,137976,185957},{1859,8,137979,185960},{1900,8,137977,185958},{1900,8,137978,185959},{1900,8,137980,185961},{1900,6,138015,208353}},
|
|
-- Cooking
|
|
[185] = {{1894,7,142331,230046}},
|
|
};
|
|
-- since BfA some recipes are available for alliance or horde only.
|
|
if ns.player.faction=="Alliance" then
|
|
faction_recipes[7] = { -- bfa
|
|
-- Alchemy
|
|
[171] = {{2159,7,162138,252378,3},{2159,7,162132,252350,3},{2159,7,163320,279170,3},{2159,7,162128,252336,3},{2159,7,162139,252381,3},{2162,7,162133,252353,3},{2162,7,162255,252384,3},{2162,7,163318,279167,3},{2162,7,162129,252340,3},{2161,7,162135,252359,3},{2161,7,163314,279161,3},{2161,7,162131,252346,3},{2161,7,162256,252390,3},{2160,7,162134,252356,3},{2160,7,163316,279164,3},{2160,7,162254,252387,3},{2160,7,162130,252343,3},{2163,7,162137,252370,3},{2163,7,162136,252363,3}},
|
|
-- Blacksmithing
|
|
[164] = {{2159,7,162275,253158,3},{2159,7,162670,278133,3},{2159,7,162261,253118,3},{2159,7,162276,253161,3}},
|
|
-- Enchanting
|
|
[333] = {{2159,7,162302,255098,3},{2159,7,162306,265112,3},{2162,7,162303,255099,3},{2162,7,162313,268909,3},{2162,7,162312,268915,3},{2161,7,162305,255101,3},{2161,7,162318,255143,3},{2161,7,162320,268879,3},{2160,7,162304,255100,3},{2160,7,162316,255112,3},{2160,7,162317,268903,3},{2163,7,162301,255097,3},{2163,7,162298,255094,3}},
|
|
-- Engineering
|
|
[202] = {{2159,6,162323,272057,2},{2159,7,162344,264967,3},{2159,7,162346,255459,3},{2159,7,162345,253152,3},{2159,7,162324,272058,3},{2162,6,162325,272060,2},{2162,7,162341,256084,3},{2162,7,162337,255409,3},{2162,7,162342,256156,3},{2162,7,162326,272061,3},{2161,6,162329,272066,2},{2161,7,162322,265102,3},{2161,7,162330,272067,3},{2160,6,162327,272063,2},{2160,7,162328,272064,3}},
|
|
-- Inscription
|
|
[773] = {{2162,6,162363,256282,2},{2161,6,162361,256279,2},{2160,6,162359,256276,2},{2163,6,162373,256298,2},{2163,6,162371,256295,2},{2163,7,162377,256246,3},{2163,7,162376,256237,3},{2163,7,162023,276059,0},{2163,7,162352,256249,3},{2163,7,162358,256234,3}},
|
|
-- Jewelcrafting
|
|
[755] = {{2159,7,162378,256515,3},{2162,7,162379,256517,3},{2162,7,162382,256257,3},{2162,7,162385,256260,3},{2161,7,162381,256521,3},{2160,7,162380,256519,3}},
|
|
-- Leatherworking
|
|
[165] = {{2161,7,162412,256789,3},{2160,7,162414,256784,3},{2160,7,162413,256781,3}},
|
|
-- Tailoring
|
|
[197] = {{2161,7,162427,257116,3},{2161,7,162421,257127,3},{2163,6,163026,257129,2}},
|
|
-- Cooking
|
|
[185] = {{2163,6,162288,259422,2},{2163,7,162292,259432,3},{2163,7,162293,259435,3},{2163,7,162287,259420,3},{2163,7,162289,259423,3},{2163,8,166806,290472,2},{2163,8,166263,287110,2},{2163,8,166367,288029,3},{2163,8,166368,288033,3}},
|
|
};
|
|
elseif ns.player.faction=="Horde" then
|
|
faction_recipes[7] = { -- bfa
|
|
-- Alchemy
|
|
[171] = {{2157,7,162701,252378,3},{2157,7,162695,252350,3},{2157,7,163320,279170,3},{2157,7,162691,252336,3},{2157,7,162702,252381,3},{2103,7,162696,252353,3},{2103,7,162704,252384,3},{2103,7,163317,279167,3},{2103,7,162692,252340,3},{2158,7,162698,252359,3},{2158,7,163313,279161,3},{2158,7,162694,252346,3},{2158,7,162705,252390,3},{2156,7,162697,252356,3},{2156,7,163315,279164,3},{2156,7,162703,252387,3},{2156,7,162693,252343,3},{2163,7,162137,252370,3},{2163,7,162136,252363,3}},
|
|
-- Blacksmithing
|
|
[164] = {{2157,7,162707,253158,3},{2157,7,162774,278133,3},{2157,7,162706,253118,3},{2157,7,162708,253161,3}},
|
|
-- Enchanting
|
|
[333] = {{2157,7,162716,255098,3},{2157,7,162720,265112,3},{2103,7,162717,255099,3},{2103,7,162722,268909,3},{2103,7,162721,268915,3},{2158,7,162719,255101,3},{2158,7,162725,255143,3},{2158,7,162726,268879,3},{2156,7,162718,255100,3},{2156,7,162723,255112,3},{2156,7,162724,268903,3},{2163,7,162301,255097,3},{2163,7,162298,255094,3}},
|
|
-- Engineering
|
|
[202] = {{2157,6,162728,272057,2},{2157,7,162744,264967,3},{2157,7,162746,255459,3},{2157,7,162745,253152,3},{2157,7,162729,272058,3},{2103,6,162730,272060,2},{2103,7,162742,256084,3},{2103,7,162741,255409,3},{2103,7,162743,256156,3},{2103,7,162731,272061,3},{2158,6,162734,272066,2},{2158,7,162727,265102,3},{2158,7,162735,272067,3},{2156,6,162732,272063,2},{2156,7,162733,272064,3}},
|
|
-- Inscription
|
|
[773] = {{2103,6,162753,256285,2},{2158,6,162755,256291,2},{2156,6,162754,256288,2},{2163,6,162373,256298,2},{2163,6,162371,256295,2},{2163,7,162377,256246,3},{2163,7,162376,256237,3},{2163,7,162023,276059,0},{2163,7,162352,256249,3},{2163,7,162358,256234,3}},
|
|
-- Jewelcrafting
|
|
[755] = {{2157,7,162760,256515,3},{2103,7,162761,256517,3},{2103,7,162764,256257,3},{2103,7,162765,256260,3},{2158,7,162763,256521,3},{2156,7,162762,256519,3}},
|
|
-- Leatherworking
|
|
[165] = {{2158,7,162766,256789,3},{2156,7,162768,256784,3},{2156,7,162767,256781,3}},
|
|
-- Tailoring
|
|
[197] = {{2158,7,162772,257116,3},{2158,7,162769,257127,3},{2163,6,163026,257129,2}},
|
|
-- Cooking
|
|
[185] = {{2163,6,162288,259422,2},{2163,7,162292,259432,3},{2163,7,162293,259435,3},{2163,7,162287,259420,3},{2163,7,162289,259423,3},{2163,8,166806,290472,2},{2163,8,166263,287110,2},{2163,8,166367,288029,3},{2163,8,166368,288033,3}},
|
|
};
|
|
end
|
|
faction_recipes[8] = { -- https://www.wowhead.com/items/recipes
|
|
-- Alchemy
|
|
[171] = {
|
|
{2465, 5, 183106, 307087},
|
|
{2439, 5, 182660, 307143},
|
|
},
|
|
-- Blacksmithing
|
|
[164] = {
|
|
{2407, 6, 183094, 322590},
|
|
{2410, 6, 183095, 322593},
|
|
},
|
|
-- Enchanting
|
|
[333] = {
|
|
{2465, 6, 183096, 309644},
|
|
},
|
|
-- Engineering
|
|
[202] = {
|
|
--{2465, 6, 183069, 309644},
|
|
{2407, 8, 183097, 331007},
|
|
{2410, 6, 183858, 310535},
|
|
--{,, 182666, 309636},
|
|
--{,, 183866, 343682},
|
|
},
|
|
-- Inscription
|
|
[773] = {
|
|
{2407, 5, 183098, 311424},
|
|
{2407, 7, 183103, 311409},
|
|
{2465, 7, 183093, 311410},
|
|
{2410, 7, 183104, 311411},
|
|
{2413, 7, 183102, 311412},
|
|
},
|
|
-- Jewelcrafting
|
|
[755] = {
|
|
{2413, 6, 183099, 311870},
|
|
},
|
|
-- Leatherworking
|
|
[165] = {
|
|
{2465, 6, 183100, 324088},
|
|
-- {2413, 7, 183839, 308897}, -- no source
|
|
},
|
|
-- Tailoring
|
|
[197] = {
|
|
{2410, 6, 183101, 310898},
|
|
},
|
|
-- Cooking
|
|
[185] = {
|
|
{2413, 7, 182668, 308403},
|
|
},
|
|
}
|
|
|
|
-- [<tradeSkillId>] = { {<factionId>, <standingId>, <itemId>, <spellId>[, <recipeStars>]}, ... }
|
|
faction_recipes[9] = {
|
|
-- Alchemy
|
|
[171]={{2503,13,191547,370677},{2503,22,191588,370725},{2510,14,191545,370676},{2544,3,191590,370729},{2544,4,191586,370723},{2544,4,191593,370732},{2544,4,191594,370733},{2550,3,191579,370708}},
|
|
-- Blacksmithing
|
|
[164]={{2503,13,194477,367594},{2503,13,194478,367589},{2503,13,194480,367588},{2503,18,194497,371367},{2503,18,194499,371369},{2503,22,198713,377281},{2510,14,194479,367590},{2510,14,194482,367592},{2510,19,194495,371365},{2510,19,194498,371368},{2510,19,194500,371371},{2544,3,194493,371349},{2544,4,194506,371682}},
|
|
-- Enchanting
|
|
[333]={{2503,8,199813,389419},{2503,8,199814,389479},{2507,9,199811,389403},{2507,9,199812,389480},{2510,11,199817,389405},{2510,11,199818,389484},{2511,10,199815,389404},{2511,10,199816,389416},{2544,4,199802,389513},{2544,4,199803,389525},{2544,4,199804,389508}},
|
|
-- Inscription
|
|
[773]={{2503,15,198902,383583},{2503,22,198937,383591},{2507,15,198901,383582},{2507,19,198788,383593},{2507,21,198909,383565},{2507,21,198909,383565},{2510,15,198892,383575},{2510,23,198941,383590},{2510,28,198912,383569},{2511,13,198894,383577},{2511,25,198940,383588},{2544,2,200599,390847},{2544,2,200600,390848},{2544,2,200601,390849},{2544,2,200602,390850},{2544,2,200603,390851},{2544,2,200604,390852},{2544,2,200605,390853},{2544,4,198943,383550},{2544,4,198947,383552},{2550,4,198895,383578}},
|
|
-- Engineering
|
|
[202]={--[[{2507,5,198719,388279},]]{2507,9,198781,382343},{2507,9,198784,382322},{2507,15,198782,382339},{2507,15,198783,382340},{2507,21,198785,382332},{2510,11,199246,382344},{2510,19,199244,382341},{2510,19,199245,382342},{2544,2,199290,382404},{2544,3,199242,382338},{2544,3,199243,382337},{2544,3,199289,382403},{2544,4,199285,382399},{2544,4,199286,382400},{2544,4,199295,384313},{2544,5,199240,382335}},
|
|
-- Jewelcrafting
|
|
[755]={{2507,9,194605,374446},{2507,9,194606,374447},{2507,9,194613,374456},{2507,9,194614,374457},{2507,13,194632,374486},{2507,13,194635,374493},{2507,15,194661,374540},{2511,10,194602,374443},{2511,10,194603,374444},{2511,10,194610,374453},{2511,10,194611,374454},{2511,10,194726,377804},{2511,15,194633,374488},{2511,15,194634,374490},{2511,18,194660,374538},{2511,18,194663,374543},{2544,4,194662,374542}},
|
|
-- Leatherworking
|
|
[165]={{2503,13,193870,375157},{2503,13,193878,375153},{2503,18,198457,375194},{2503,18,198462,375195},{2503,18,198463,375196},{2503,18,198464,375190},{2503,22,197982,381849},{2511,15,193875,375144},{2511,15,193876,375146},{2511,18,198458,375192},{2511,18,198459,375189},{2511,18,198461,375193},{2511,18,198465,375191},{2511,23,194311,375172},{2511,29,197981,381848},{2544,5,198618,381547},{2550,4,201733,375161}},
|
|
-- Tailoring
|
|
[197]={{2507,15,194289,376548},{2507,15,194291,376552},{2507,15,194294,376531},{2507,15,194295,376532},{2507,17,194268,376570},{2507,17,194281,376568},{2507,19,194285,376529},{2507,21,194283,376565},{2510,14,194279,376501},{2510,14,194280,376505},{2510,19,194288,376544},{2510,19,194290,376550},{2510,19,194292,376554},{2510,23,194287,376561},{2510,28,194282,376567},{2544,4,194286,376536},{2544,4,194293,376534},{2550,3,194265,376541},{2550,4,194261,376539}},
|
|
-- Cooking
|
|
[185]={{2507,13,198101,381373},{2511,15,198102,381375}}
|
|
}
|
|
|
|
friendStandingLabel = {}
|
|
if LOCALE_deDE then
|
|
friendStandingLabel[2544] = {"Neutral","Bevorzugt","Respektiert","Geschätzt","Hochverehrt"}
|
|
friendStandingLabel[2550] = {"Leer","Niedrig","Mittel","Hoch","Maximum"}
|
|
elseif LOCALE_esES or LOCALE_esMX then
|
|
friendStandingLabel[2544] = {"Neutral","Preferido","Respetado","Valorado","Estimado"}
|
|
friendStandingLabel[2550] = {"Vacío","Bajo","Medio","Alto","Máximo"}
|
|
elseif LOCALE_frFR then
|
|
friendStandingLabel[2544] = {"Indifférence","Bienveillance","Respect","Estime","Admiration"}
|
|
friendStandingLabel[2550] = {"Vide","Faible","Moyenne","Élevée","Maximum"}
|
|
elseif LOCALE_itIT then
|
|
friendStandingLabel[2544] = {"Neutrale","Preferito","Rispettato","Apprezzato","Stimato"}
|
|
friendStandingLabel[2550] = {"Vuota","Bassa","Media","Alta","Massima"}
|
|
elseif LOCALE_ptBR or LOCALE_ptPT then
|
|
friendStandingLabel[2544] = {"Neutro","Preferido","Prezado","Valioso","Estimado"}
|
|
friendStandingLabel[2550] = {"Vazio","Baixo","Médio","Alto","Máximo"}
|
|
elseif LOCALE_ruRU then
|
|
friendStandingLabel[2544] = {"Равнодушие","Симпатия","Расположение","Признание","Почитание"}
|
|
friendStandingLabel[2550] = {"Пусто","Низкий","Средний","Высокий","Максимальный"}
|
|
elseif LOCALE_koKR then
|
|
friendStandingLabel[2544] = {"중립","선호함","존중","소중함","존경함"}
|
|
friendStandingLabel[2550] = {"없음","낮음","보통","높음","최대"}
|
|
elseif LOCALE_zhCN or LOCALE_zhTW then
|
|
friendStandingLabel[2544] = {"中立","偏爱","尊重","重视","崇尚"}
|
|
friendStandingLabel[2550] = {"空","低","中","高","最大"}
|
|
else
|
|
friendStandingLabel[2544] = {"Neutral","Preferred","Respected","Valued","Esteemed"}
|
|
friendStandingLabel[2550] = {"Empty","Low","Medium","High","Maximum"}
|
|
end
|
|
|
|
|
|
cdSpells = {
|
|
-- [<skillLine|tradeSkillId>] = { {<spellID|recipeID>,<Cd Group>,<Cd type>}, ... }
|
|
[171] = { -- Alchemy
|
|
-- classic
|
|
{11479,1,2},{11480,1,2},{17559,1,2},{17560,1,2},{17561,1,2},{17562,1,2},{17563,1,2},{17564,1,2},{17565,1,2},{17566,1,2},
|
|
-- bc
|
|
{28566,1,2},{28567,1,2},{28568,1,2},{28569,1,2},{28580,1,2},{28581,1,2},{28582,1,2},{28583,1,2},{28584,1,2},{28585,1,2},
|
|
-- wotlk
|
|
{52776,1,2},{52780,1,2},{53771,1,2},{53773,1,2},{53774,1,2},{53775,1,2},{53777,1,2},{53779,1,2},{53781,1,2},{53782,1,2},{53783,1,2},{53784,1,2},{54020,1,2},
|
|
-- cata
|
|
{60893,0,1}, -- Alchemy Research // 3 days QuestResetTime?
|
|
{66658,1,2},{66659,1,2},{66660,1,2},{66662,1,2},{66663,1,2},{66664,1,2},{78866,1,2},{80243,0,2},{80244,1,2},
|
|
-- wod
|
|
{114780,1,2},{114783,0,2},{156587,0,2},{168042,0,2},{175880,0,2},
|
|
-- legion
|
|
-- bfa
|
|
},
|
|
[333] = { -- Enchanting
|
|
-- cata
|
|
{116499,0,2},
|
|
-- wod
|
|
{169092,0,2},{177043,0,2},{178241,0,2},
|
|
},
|
|
[755] = { -- Jewelcrafting
|
|
{47280,0,2},{62242,0,2},{73478,0,2},{131593,2,2},{131695,2,2},{131690,2,2},{131686,2,2},{131691,2,2},{131688,2,2},{140050,0,2},
|
|
-- wod
|
|
{170700,0,2},{170832,0,2},{176087,0,2},
|
|
},
|
|
[197] = { -- Tailoring
|
|
{75141,0,1},{75142,0,1},{75144,0,1},{75145,0,1},{75146,0,1},{125557,0,2},{143011,0,2},
|
|
-- wod
|
|
{168835,0,2},{169669,0,2},{176058,0,2},
|
|
},
|
|
[773] = { -- Inscription
|
|
{61288,0,2},{61177,0,2},{89244,0,2},{86654,0,2},{112996,0,2},
|
|
-- wod
|
|
{169081,0,2},{177045,0,2},{178240,0,2},
|
|
},
|
|
[164] = { -- Blacksmithing
|
|
{138646,0,2},{143255,0,2},
|
|
-- wod
|
|
{171690,0,2},{171718,0,2},{176090,0,2},
|
|
},
|
|
[165] = { -- Leatherworking
|
|
{140040,3,2},{140041,3,2},{142976,0,2},
|
|
-- wod
|
|
{171391,0,2},{171713,0,2},{176089,0,2},
|
|
},
|
|
[202] = { -- Engineering
|
|
{139176,0,2},
|
|
-- wod
|
|
{169080,0,2},{177054,0,2},{178242,0,2},
|
|
}
|
|
};
|
|
|
|
--[[
|
|
tradeSkillExpansionSpells = {
|
|
[164] = { -- Blacksmithing
|
|
264437, 264439, 264441, 264443, 264445, 264447, 264449, 265804, 309828,
|
|
},
|
|
[197] = { -- Tailoring
|
|
264619, 264621, 264623, 264625, 264627, 264629, 264631, 265816, 310950,
|
|
},
|
|
[755] = { -- Jewelcrafting
|
|
264534, 264537, 264539, 264542, 264544, 264546, 264548, 264811, 311967,
|
|
},
|
|
[773] = { -- Inscription
|
|
264496, 264498, 264500, 264502, 264504, 264506, 264508, 265809, 309804,
|
|
},
|
|
[165] = { -- Leatherworking
|
|
264579, 264581, 264583, 264585, 264588, 264590, 264592, 265813, 309038,
|
|
},
|
|
[202] = { -- Engineering
|
|
264479, 264481, 264483, 264485, 164487, 264490, 264492, 265807, 310539,
|
|
},
|
|
[333] = { -- Enchanting
|
|
264460, 264462, 264464, 264467, 264469, 264471, 264473, 265805, 309833,
|
|
},
|
|
[171] = { -- Alchemy
|
|
264213, 264220, 264243, 264245, 264247, 264250, 264255, 265787, 309822,
|
|
},
|
|
[186] = { -- Mining
|
|
265840, 265842, 265844, 265846, 265848, 265850, 265852, 267482, 325019,
|
|
},
|
|
[182] = { -- Herbalism
|
|
265822, 265824, 265826, 265828, 265830, 265832, 265833, 265836, 300932,
|
|
}
|
|
}
|
|
--]]
|
|
|
|
-- skillLineDisplayName, skillLineRank, skillLineMaxRank, skillLineModifier, parentSkillLineID = C_TradeSkillUI.GetTradeSkillLineInfoByID(skillLineID)
|
|
end
|
|
|
|
function module.onevent(self,event,arg1,...)
|
|
if event=="BE_UPDATE_CFG" and arg1 and arg1:find("^ClickOpt") then
|
|
ns.ClickOpts.update(name);
|
|
return;
|
|
elseif event=="VARIABLES_LOADED" then
|
|
if ns.toon[name]==nil then
|
|
ns.toon[name]={};
|
|
end
|
|
toonDB = ns.toon[name];
|
|
if toonDB.unlearnedRecipes==nil then
|
|
toonDB.unlearnedRecipes = {}
|
|
end
|
|
if toonDB.cooldowns==nil then
|
|
toonDB.cooldowns = {};
|
|
end
|
|
if toonDB.cooldown_locks==nil then
|
|
toonDB.cooldown_locks = {};
|
|
end
|
|
elseif event=="ADDON_LOADED" then
|
|
if arg1=="Blizzard_Professions" then
|
|
if UpdateFactionRecipesHook then
|
|
UpdateFactionRecipesHook();
|
|
UpdateFactionRecipesHook=nil;
|
|
end
|
|
self:UnregisterEvent("ADDON_LOADED")
|
|
end
|
|
elseif event=="NEW_RECIPE_LEARNED" then
|
|
local id = tonumber(arg1)
|
|
if id and toonDB.unlearnedRecipes[id] then
|
|
toonDB.unlearnedRecipes[id] = nil;
|
|
end
|
|
elseif event=="PLAYER_LOGIN" or ns.eventPlayerEnteredWorld then
|
|
if not toonDB then
|
|
if ns.toon[name]==nil then
|
|
ns.toon[name]={};
|
|
end
|
|
toonDB = ns.toon[name];
|
|
if toonDB.unlearnedRecipes==nil then
|
|
toonDB.unlearnedRecipes = {}
|
|
end
|
|
if toonDB.cooldowns==nil then
|
|
toonDB.cooldowns = {};
|
|
end
|
|
if toonDB.cooldown_locks==nil then
|
|
toonDB.cooldown_locks = {};
|
|
end
|
|
end
|
|
updateTradeSkills();
|
|
updateBroker();
|
|
end
|
|
end
|
|
|
|
if not ProfessionsFrame then
|
|
tinsert(module.events,"ADDON_LOADED");
|
|
end
|
|
|
|
-- function module.optionspanel(panel) end
|
|
-- function module.onmousewheel(self,direction) end
|
|
-- function module.ontooltip(tt) end
|
|
|
|
function module.onenter(self)
|
|
if (ns.tooltipChkOnShowModifier(false)) then return; end
|
|
tt = ns.acquireTooltip({ttName, ttColumns, "LEFT", "RIGHT"},{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;
|
|
|