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.

356 lines
11 KiB

-- module independent variables --
----------------------------------
local addon, ns = ...
local C, L, I = ns.LC.color, ns.L, ns.I
if ns.client_version<4 then return end
-- module own local variables and local cached functions --
-----------------------------------------------------------
local name = "Difficulty" -- L["Difficulty"] L["ModDesc-Difficulty"]
L["ModDesc-"..name] = L["Display current group and instance modes"];
local ttName, ttColumns, tt, module,createTooltip = name.."TT", 4
local mode,roleCount = 0,", T: %d, H: %d, D: %d";
local modes = {
{name=SOLO, short="S", color="ltgray"}, -- 1
{name=GROUP, short="G", color="quality2"}, -- 2
{name=RAID, short="R", color="quality4"}, -- 3
}
local diff = {
dungeons = {
{id=1,long=PLAYER_DIFFICULTY1,short=L["DifficultyNormalShort"],color="quality2"},
{id=2,long=PLAYER_DIFFICULTY2,short=L["DifficultyHeroicShort"],color="quality3"},
{id=23,long=PLAYER_DIFFICULTY6,short=L["DifficultyMythicShort"],color="quality4"}
},
raids = {
{id=14,long=PLAYER_DIFFICULTY1,short=L["DifficultyNormalShort"],color="quality2"}, -- 9 / 14
{id=15,long=PLAYER_DIFFICULTY2,short=L["DifficultyHeroicShort"],color="quality3"},
{id=16,long=PLAYER_DIFFICULTY6,short=L["DifficultyMythicShort"],color="quality4"},
},
classic = {
{id=3,altId=5,long=RAID_DIFFICULTY1,short="10",color="quality2"}, -- 3 / 5
{id=4,altId=6,long=RAID_DIFFICULTY2,short="25",color="quality3"}, -- 4 / 6
}
};
local specials = {
{rid=9,cid=5,legacy={long=RAID_DIFFICULTY_40PLAYER,short="40",color="quality4"}},
}
-- register icon names and default files --
-------------------------------------------
--I[name] = {iconfile="Interface\\Addons\\"..addon.."\\media\\LFG-Eye-Green", coords={0.5 , 0.625 , 0 , 0.25}}
I[name] = {iconfile="interface\\lfgframe\\ui-lfg-icon-heroic", coords={0,0.55,0,0.55}}
-- some local functions --
--------------------------
local function mIf(a,b,c)
if(type(b)=="table")then
for i,v in ipairs(b)do
if (a==v) then return true; end
end
elseif (a==b) then return true;
elseif (c and a==c) then return true; end
return false;
end
local function CanChange()
local inGroupOrRaid = (IsInGroup() or IsInRaid());
return not inGroupOrRaid or (inGroupOrRaid and UnitIsGroupLeader("player"));
end
local function switchGroupType(self, disabled, button)
securecall(IsInRaid() and "ConvertToParty" or "ConvertToRaid");
end
local function instanceReset(self)
if CanChange() then
securecall("ResetInstances");
end
end
local function _SetDungeonDifficultyID(self,id)
if CanChange() then
securecall("SetDungeonDifficultyID",id);
end
end
local function _SetRaidDifficulties(self,values)
if CanChange() then
securecall("SetRaidDifficulties",unpack(values));
end
end
local function _SetOptOutOfLoot(self,optOut)
securecall("SetOptOutOfLoot", not optOut );
end
local function _SetLootSpecialization(self,specId)
securecall("SetLootSpecialization",specId);
end
local function updateBroker()
local short = {}
local mode = modes[(IsInRaid() and 3) or (IsInGroup() and 2) or 1];
local ids = { {"dungeons",GetDungeonDifficultyID()}, {"raids",GetRaidDifficultyID()}, {"classic",GetLegacyRaidDifficultyID()} };
local dungeonID,raidID,legacyID = GetDungeonDifficultyID(), GetRaidDifficultyID(), GetLegacyRaidDifficultyID();
local inInstance, instanceType = IsInInstance();
tinsert(short,C(mode.color,mode.short));
for _,id in pairs(ids)do
for _,v in ipairs(diff[id[1]])do
if(mIf(id[2],v.id))then
tinsert(short,C(v.color,v.short));
end
end
end
(ns.LDB:GetDataObjectByName(ns.modules[name].ldbName) or {}).text = #short>0 and table.concat(short,", ") or L[name];
end
function createTooltip(tt)
if not (tt and tt.key and tt.key==ttName) then return end -- don't override other LibQTip tooltips...
local mode = modes[(IsInRaid() and 3) or (IsInGroup() and 2) or 1];
local dungeonID,raidID,legacyID = GetDungeonDifficultyID(), GetRaidDifficultyID(), GetLegacyRaidDifficultyID();
local inInstance, instanceType = IsInInstance();
local inGroupOrRaid = (IsInGroup() or IsInRaid());
local enabled = CanChange();
tt:Clear();
local l = tt:AddHeader(C("dkyellow",L[name]));
-- group mode and convert option
local groupMode = mode.name;
if enabled and inGroupOrRaid then
groupMode = groupMode.." ["..CONVERT.."]";
tt:SetCell(l,2, C("ltgray",CONVERT), nil, "RIGHT",0);
tt:SetCellScript(l,2,"OnMouseUp",switchGroupType);
else
tt:SetCell(l,2,C(mode.color,groupMode),nil,"RIGHT",0);
end
--l=tt:AddLine(C("ltblue",L["Group leader"]),"?");
-- group tanks
-- group assists?
tt:AddSeparator(4,0,0,0,0);
l = tt:AddLine(C("ltblue",UNIT_FRAME_DROPDOWN_SUBSECTION_TITLE_INSTANCE));
tt:SetCell(l,3,C(enabled and "ltgray" or "dkgray",RESET_INSTANCES), nil, "RIGHT", 2);
if enabled then
tt:SetCellScript(l,3,"OnMouseUp",instanceReset);
end
tt:AddSeparator();
local custom_instance,custom_raid,custom_legacy=nil,nil,nil;
for i,v in ipairs(specials)do
if(v.rid==raidID and v.cid==legacyID and v.legacy~=nil)then
custom_legacy=v.legacy;
end
end
--- dungeons
l = tt:AddLine(C("ltyellow",LFG_TYPE_DUNGEON..HEADER_COLON));
for i,v in ipairs(diff.dungeons)do
local color = enabled and "ltgray" or "dkgray";
if(mIf(dungeonID,v.id)) then
color = enabled and v.color or "white";
end
tt:SetCell(l,i+1,C(color,v.long));
if (enabled and not mIf(dungeonID,v.id)) then
tt:SetCellScript(l,i+1,"OnMouseUp",_SetDungeonDifficultyID,v.id);
end
end
--- raids
l = tt:AddLine(C("ltyellow",RAID..HEADER_COLON));
for i,v in ipairs(diff.raids) do
local color = enabled and "ltgray" or "dkgray";
if(mIf(raidID,v.id))then
color = enabled and v.color or "white";
end
tt:SetCell(l,i+1,C(color,v.long));
if (enabled and not mIf(raidID,v.id)) then
tt:SetCellScript(l,i+1,"OnMouseUp",_SetRaidDifficulties,{true,v.id});
end
end
--- legacy raid size
l = tt:AddLine(C("ltyellow",UNIT_FRAME_DROPDOWN_SUBSECTION_TITLE_LEGACY_RAID..HEADER_COLON));
local I=0;
for i,v in ipairs(diff.classic) do
local color = enabled and "ltgray" or "dkgray";
local _mIf = mIf(legacyID,v.id,v.altId);
if(custom_legacy and _mIf)then
color = enabled and "dkgreen" or "ltgray";
elseif(_mIf)then
color = enabled and "green" or "white";
end
tt:SetCell(l,i+1,C(color,v.long));
if ((enabled and not _mIf) or custom_legacy) then
tt:SetCellScript(l,i+1,"OnMouseUp",_SetRaidDifficulties,{false,v.id});
end
I=i+2;
end
if(custom_legacy)then
tt:SetCell(l,I,C("green",custom_legacy.long));
end
--- loot types & loot specialization
tt:AddSeparator(4,0,0,0,0);
l = tt:AddLine(C("ltblue",UNIT_FRAME_DROPDOWN_SUBSECTION_TITLE_LOOT));
local optOut = (GetOptOutOfLoot());
tt:SetCell(l,3,C("ltgray",OPT_OUT_LOOT_TITLE:format(C("white", optOut and YES or NO ))),nil,"RIGHT",2);
tt:SetCellScript(l,3,"OnMouseUp",_SetOptOutOfLoot,optOut);
tt:AddSeparator();
l=tt:AddLine(C("ltyellow",SPECIALIZATION..HEADER_COLON));
local lootSpec = GetLootSpecialization();
local cell=2;
for i=1, GetNumSpecializations() do -- add loot specs
if(cell>ttColumns) then cell=2; l=tt:AddLine(" "); end
local specId,specName,_,specIcon,_,specRole = GetSpecializationInfo(i);
tt:SetCell(l, cell, C(lootSpec==specId and "green" or "ltgray",specName));
if(i~=lootSpec)then
tt:SetCellScript(l, cell, "OnMouseUp",_SetLootSpecialization,specId);
end
cell=cell+1;
end
-- add auto loot spec
if (cell+1 > ttColumns) then cell=2; l=tt:AddLine(" "); end
local specName,curSpec,_ = UNKNOWN,GetSpecialization();
if curSpec then _,specName = GetSpecializationInfo(curSpec); end
tt:SetCell(l, cell, C(lootSpec==0 and "green" or "ltgray", LOOT_SPECIALIZATION_DEFAULT:format(specName)), nil, nil, 2);
if lootSpec~=0 then
tt:SetCellScript(l,2,"OnMouseUp",_SetLootSpecialization,0);
end
if (ns.profile.GeneralOptions.showHints) then
tt:AddSeparator(4,0,0,0,0)
ns.ClickOpts.ttAddHints(tt,name);
end
ns.roundupTooltip(tt);
end
-- module variables for registration --
---------------------------------------
module = {
--icon_suffix = "",
events = {
"GROUP_ROSTER_UPDATE",
"PARTY_LEADER_CHANGED",
"PARTY_LOOT_METHOD_CHANGED",
"PLAYER_ENTERING_WORLD",
"PLAYER_FLAGS_CHANGED",
"PLAYER_DIFFICULTY_CHANGED",
"PLAYER_SPECIALIZATION_CHANGED",
"PLAYER_LOOT_SPEC_UPDATED",
"CHAT_MSG_SYSTEM"
},
updateinterval = nil, -- 10
config_defaults = {
enabled = false
},
clickOptionsRename = nil,
clickOptions = {
["rollneed"] = {ROLL..CHAT_HEADER_SUFFIX..NEED, "module", "roll"},
["rollgreed"] = {ROLL..CHAT_HEADER_SUFFIX..GREED,"module","roll"},
["resetinstances"] = {RESET_INSTANCES,"module","instanceReset"},
}
}
ns.ClickOpts.addDefaults(module,{
rollneed = "_RIGHT",
rollgreed = "_LEFT",
instanceReset = "__NONE",
resetinstances = "__NONE",
});
function module.roll(self,button,...)
if button=="LeftButton" then
RandomRoll(1,50); -- greed
elseif button=="RightButton" then
RandomRoll(1,100); -- need
end
end
module.instanceReset = instanceReset;
-- function module.options() return {}; end
-- function module.init() end
function module.onevent(self,event,...)
local update = false;
if event=="BE_UPDATE_CFG" then
local arg1 = ...;
if arg1 and arg1:find("^ClickOpt") then
ns.ClickOpts.update(name);
return;
end
elseif (event=="PLAYER_ENTERING_WORLD") then
update = true
elseif (event=="GROUP_ROSTER_UPDATE") then
update = true
elseif (event=="PARTY_LOOT_METHOD_CHANGED") then
update = true;
elseif (event=="PLAYER_SPECIALIZATION_CHANGED") then
update = true
elseif (event=="PLAYER_LOOT_SPEC_UPDATED") then
update = true;
elseif (event=="PLAYER_DIFFICULTY_CHANGED") then
local nameA, instanceType, difficultyID, difficultyName, maxPlayers, dynamicDifficulty, isDynamic, instanceMapID, instanceGroupSize = GetInstanceInfo();
local nameB, groupType, isHeroic, isChallengeMode, displayHeroic, displayMystic, toggleDifficultyID = GetDifficultyInfo(difficultyID);
update="INSTANCE"
elseif (event=="CHAT_MSG_SYSTEM") then
update = true
end
if update==true then
updateBroker();
elseif update=="INSTANCE" then
local obj = ns.LDB:GetDataObjectByName(ns.modules[name].ldbName)
local short,roleCountPattern = {},"%s/%s/%s"
local mode = (IsInRaid() and 3) or (IsInGroup() and 2) or 1
local m=modes[mode]
local roleCount = "";
if mode>1 then
local counts = GetGroupMemberCounts();
if counts and counts.TANK and counts.HEALER and counts.DAMAGER then
roleCount = roleCountPattern:format(counts.TANK,counts.HEALER,counts.DAMAGER);
end
end
tinsert(short,C(m.color,m.short)..roleCount);
end
if (update) and (tt) then
createTooltip(tt)
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", "LEFT", "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
ns.modules[name] = module;