local L = AceLibrary("AceLocale-2.2"):new("Grid")local GridRange = Grid:GetModule("GridRange")local GridRoster = Grid:GetModule("GridRoster")local GridStatusRole = Grid:GetModule("GridStatus"):NewModule("GridStatusRole")GridStatusRole.menuName = "Role"--roledb.role[guid] = "M/R/H" (Melee/Ranged/Healer)local roledb = { role = { }, unknown = { },}local inspect_ready = truelocal current_inspect = ""GridStatusRole.defaultDB = { debug = false, role = { text = "Role", enable = true, color = { r = 0.8, g = 0.8, b = 0.8, a = 0.8 }, priority = 99, class = false, range = false, },}GridStatusRole.options = falselocal roleOptions = { ["class"] = { type = 'toggle', name = "Use class color", desc = "Color by class", get = function() return GridStatusRole.db.profile.role.class end, set = function() GridStatusRole.db.profile.role.class = not GridStatusRole.db.profile.role.class GridStatusRole:UpdateAllUnits() end, },}function GridStatusRole:OnInitialize() self.super.OnInitialize(self) self:RegisterStatus('role', "Role", nil, true)endfunction GridStatusRole:OnStatusEnable(status) if status == "role" then self:RegisterEvent("UNIT_NAME_UPDATE", "UpdateUnit") --self:RegisterEvent("UNIT_PORTRAIT_UPDATE", "UpdateUnit") --self:RegisterEvent("UNIT_ENTERED_VEHICLE", "UpdateVehicle") --self:RegisterEvent("UNIT_EXITED_VEHICLE", "UpdateVehicle") self:RegisterEvent("PLAYER_ALIVE", "UpdatePlayer") --self:RegisterEvent("PARTY_MEMBERS_CHANGED", "UpdateAllUnits") self:RegisterEvent("Grid_UnitJoined", "UpdateGUID") self:RegisterEvent("Grid_UnitChanged", "UpdateGUID") self:RegisterEvent("Grid_UnitLeft", "UpdateGUID") self:RegisterEvent("Grid_ColorsChanged", "UpdateAllUnits") self:UpdateAllUnits() endend--[[ Update Functions ]]function GridStatusRole:UpdateVehicle(unitid) self:UpdateUnit(unitid) local pet_unit = unitid .. "pet" if UnitExists(pet_unit) then self:UpdateUnit(pet_unit) endendfunction GridStatusRole:UpdatePlayer() --guid = GridRoster:GetGUIDByName("Safina") local guid = UnitGUID("player") self:UpdateGUID(guid)endfunction GridStatusRole:UpdateUnit(unitid) local guid = UnitGUID(unitid) self:UpdateGUID(guid)endfunction GridStatusRole:UpdateGUID(guid) local settings = self.db.profile.role local name = GridRoster:GetNameByGUID(guid) local unitid = GridRoster:GetUnitidByGUID(guid) local owner_unitid = GridRoster:GetOwnerUnitidByUnitid(unitid) if not name or not settings.enable then return end local text = name local unit_role = GridStatusRole:GetUnitRole(guid) if owner_unitid then if UnitHasVehicleUI(owner_unitid) then local owner_guid = UnitGUID(owner_unitid) local owner_name = GridRoster:GetNameByGUID(owner_guid) text = owner_name end else if unit_role == nil then --print("UpdateGUID() has no role for " .. UnitName(unitid) .. ". Calling UpdateRole()") GridStatusRole:UpdateRole(guid) else text = format("%s: %s", unit_role, name) end end local color = settings.class and self.core:UnitColor(guid) or settings.color self.core:SendStatusGained(guid, "role", settings.priority, nil, color, text)endfunction GridStatusRole:UpdateAllUnits() roledb.role = {} roledb.unknown = {} for guid, unitid in GridRoster:IterateRoster() do self:UpdateGUID(guid) endend--[[ Inspect functions ]]--should make seperate timer to reset inspect_ready in case of inspect throttles.function GridStatusRole:RepeatNotifyInspect() if #roledb.unknown ~= 0 then for i,guid in ipairs(roledb.unknown) do if ( not GridRoster:IsGUIDInRaid(guid) ) then table.remove(roledb.unknown, i) else local unitid = GridRoster:GetUnitidByGUID(guid) if CanInspect(unitid) then GridStatusRole:SetNotifyInspect(guid) return end end end else self:CancelScheduledEvent("GridStatusRole_RoleCheck") endendfunction GridStatusRole:SetNotifyInspect(guid) if inspect_ready then local unitid = GridRoster:GetUnitidByGUID(guid) current_inspect = guid self:RegisterEvent("INSPECT_TALENT_READY", "GetNotifyInspect") NotifyInspect(unitid) endendfunction GridStatusRole:GetNotifyInspect() local guid = current_inspect local spec = GridStatusRole:FindSpec(guid) GridStatusRole:UpdateRole(guid, spec) GridStatusRole:UpdateGUID(guid) current_inspect = "" inspect_ready = true self:UnregisterEvent("INSPECT_TALENT_READY")end--[[ Spec Parser ]]function GridStatusRole:FindSpec(guid) local unitid = GridRoster:GetUnitidByGUID(guid) local pointsSpent = {} local specname = {} local inspect = 1 if GetUnitName(unitid) == GetUnitName("player") then inspect = 0 end local current_spec = GetActiveTalentGroup(inspect) local trees = GetNumTalentTabs(inspect) for i = 1, trees do specname[i], _, pointsSpent[i] = GetTalentTabInfo(i, inspect, 0, current_spec) end if #pointsSpent ~= 0 then if pointsSpent[1] > pointsSpent[2] and pointsSpent[1] > pointsSpent[3] then return specname[1] elseif pointsSpent[2] > pointsSpent[1] and pointsSpent[2] > pointsSpent[3] then return specname[2] else return specname[3] end endend--[[ Role Roster functions ]]function GridStatusRole:UpdateRole(guid, spec) local spec = spec local unitid = GridRoster:GetUnitidByGUID(guid) local _, class = UnitClass(unitid) if class == "WARRIOR" or class == "ROGUE" or class == "DEATHKNIGHT" then GridStatusRole:SetUnitRole(guid, "M") elseif class == "WARLOCK" or class == "HUNTER" or class == "MAGE" then GridStatusRole:SetUnitRole(guid, "R") end --if GUID is not of the above classes or the player himself --Then must be hybrid and must be inspected to discover role. if not spec then GridStatusRole:SetUnitUnknown(guid) return end if class == "PRIEST" then if spec == "Discipline" or spec == "Holy" then GridStatusRole:SetUnitRole(guid, "H") elseif spec == "Shadow" then GridStatusRole:SetUnitRole(guid, "R") end elseif class == "PALADIN" then if spec == "Holy" then GridStatusRole:SetUnitRole(guid, "H") elseif spec == "Retribution" or spec == "Protection" then GridStatusRole:SetUnitRole(guid, "M") end elseif class == "DRUID" then if spec == "Restoration" then GridStatusRole:SetUnitRole(guid, "H") elseif spec == "Balance" then GridStatusRole:SetUnitRole(guid, "R") elseif spec == "Feral Combat" then GridStatusRole:SetUnitRole(guid, "M") end elseif class == "SHAMAN" then if spec == "Elemental" then GridStatusRole:SetUnitRole(guid, "R") elseif spec == "Restoration" then GridStatusRole:SetUnitRole(guid, "H") elseif spec == "Enhancement" then GridStatusRole:SetUnitRole(guid, "M") end end if GridStatusRole:GetUnitRole(guid) then for i,unknown_guid in ipairs(roledb.unknown) do if unknown_guid == guid then table.remove(roledb.unknown, i) end end GridStatusRole:UpdateGUID(guid) endendfunction GridStatusRole:GetUnitRole(guid) return roledb.role[guid]endfunction GridStatusRole:SetUnitRole(guid, letter) roledb.role[guid] = letterendfunction GridStatusRole:SetUnitUnknown(guid) for index,unknown_guid in ipairs(roledb.unknown) do if unknown_guid == guid then return end end table.insert(roledb.unknown, guid) self:ScheduleRepeatingEvent("GridStatusRole_RoleCheck", self.RepeatNotifyInspect, 2, self) end