local name, addon = ... local tank = UnitName("player") local L = GetLocale() == 'deDE' and { ['New Tank'] = function(tank) return string.format("Neuer Tank: |cffffff00%s|r",tank) end, ["Taunted Fail"] = function(src,dest,spell) dest = dest or "" return string.format("|cffff0000Achtung!|r Spott von %s auf %s fehlgeschlagen (%s).",src or "",dest or "",spell or "") end, ["Taunted"] = function(src,dest,spell) dest = dest or "" return string.format("%s hat %s mit %s gespottet.",src,dest,spell) end, ['Tank'] = "Tank", } or { ['New Tank'] = function(tank) return string.format("New Tank: |cffffff00%s|r",tank) end, ["Taunted Fail"] = function(src,dest,spell) dest = dest or "" return string.format("|cffff0000Danger!|r Taunt of %s failed on %s (%s).",src or "",dest or "",spell or "") end, ["Taunted"] = function(src,dest,spell) dest = dest or "" return string.format("%s taunted %s using %s.",src,dest,spell) end, ['Tank'] = "Tank", } local spamDelay = 10 local spamShow = false local realm = GetRealmName() local taunts = { [355] = true, -- Warrior taunt [49576] = true, -- DK death grip [56222] = true, -- DK dark command [62124] = true, -- Paladin hand of reckoning [31789] = true, -- Paladin righteous defense [6795] = true, -- Druid growl [20736] = true, -- Hunter distracting shot [2649] = true,-- Hunter pet growl rank 1 [17735] = true, -- Warlock pet suffering rank 1 [115543] = true, -- Monk Glyph of the ox [115546] = true, -- Monk provoke [185245] = true, -- demon hunter Torment } local dontspam = { [2649] = true,-- Hunter pet growl rank 1 [17735] = true, -- Warlock pet suffering rank 1 } local spammer = {} local function getUnitId(name) if(GetNumGroupMembers() > 0) then for i = 1,MAX_RAID_MEMBERS do if(UnitName(format("raid%i",i)) == name) then return format("raid%i",i) end end else for i = 1,4 do if(UnitName(format("party%i",i)) == name) then return format("party%i",i) end end for i = 1,4 do if(UnitName(format("party%ipet",i)) == name) then return format("party%ipet",i) end end end if(name == UnitName('pet')) then return 'pet' end return "player" end local function nameCompare(n1,n2) local name1,realm1 = UnitName(getUnitId(n1)) local name2,realm2 = UnitName(getUnitId(n2)) realm1 = realm1 or realm realm2 = realm2 or realm if(name1 == name2 and realm1 == realm2) then return true end return false end local function OnUpdate() local spots = 0 for k in pairs(spammer) do spots = spots + spammer[k]['count'] end addon:OnText(name, spots) end function addon:CLParse(event, data, prefix, suffix) -- local event,timestamp, eventtype, hideCaster, sourceGUID, sourceName, sourceFlags, sourceRaidFlags, destGUID, destName, destFlags, destRaidFlags, spellId,spellName,spellSchool = ... local dest = data[13] if(not taunts[dest]) then return end local name = data[6] if not (UnitPlayerOrPetInParty(name) or UnitPlayerOrPetInRaid(name) or UnitIsUnit("player",name) or UnitIsUnit("pet",name)) then return end if(data[3] == "SPELL_CAST_SUCCESS") then spammer[name] = spammer[name] or { ['count'] = 0, ['lastMessage'] = - spamDelay} spammer[name]['count'] = spammer[name]['count'] + 1 if(spammer[name]['count'] > spammer[name]['lastMessage'] + spamDelay) then spamShow = true spammer[name]['lastMessage'] = spammer[name]['count'] end if nameCompare(name,tank) and addon['db']['profile']['ignoreTanks'] then return end if(not dontspam[data[13]] or spamShow) then addon:Print(L["Taunted"](name,data[10],data[14])) end spamShow = false else addon:Print(L["Taunted Fail"](name,data[10],data[14])) end OnUpdate() end function addon:RAID_ROSTER_UPDATE(event, ...) local oldtank = tank tank = nil if(GetNumGroupMembers()) then for i = 1,MAX_RAID_MEMBERS do local name, _, _, _, _, _, _, _, _, role, _, combatRole = GetRaidRosterInfo(i) if(name and (role == "maintank" or combatRole == 'TANK')) then local c,r = UnitName(format("raid%i",i)) if(r and r~='') then tank = format("%s-%s",c,r) else tank = c end break end end else for i = 1,4 do local isTank, isHeal, isDPS = UnitGroupRolesAssigned(format("party%i",i)) if(isTank) then local c,r = UnitName(format("party%i",i)) if(r and r~='') then tank = format("%s-%s",c,r) else tank = c end break end end end if(not tank) then local c,r = UnitName("player") tank = c end if(oldtank and oldtank ~= tank) then addon:Print(L["New Tank"](tank)) end end local function tooltip(GameTooltip) GameTooltip:AddLine(name) GameTooltip:AddDoubleLine(format("|cff00ff00%s|r",L["Tank"]),format("|cffffffff%s|r",tank)) if(spammer) then for k in pairs(spammer) do GameTooltip:AddDoubleLine(k,format("|cffffffff%i|r",spammer[k]['count'])) end end end function addon:PLAYER_ENTERING_WORLD(event,...) self:UnregisterEvent(event) addon['db'] = LibStub("AceDB-3.0"):New(format("%sDB",name)) addon:InitConfig(name, true, { ['type'] = "data source", ['OnTooltipShow'] = tooltip, }) addon:AddConfigEntry(name, 'toggle', 'ignoreTanks', 'Ignore Tanks', 'Dont show taunts of tanks.', 1) LibStub("LibCombatLog"):Embed(addon) addon:RegisterCLEvent({"SPELL_CAST_SUCCESS","SPELL_MISSED"},"CLParse") self:RegisterEvent("RAID_ROSTER_UPDATE") OnUpdate() end addon['frame'] = addon:RegisterFunc({'PLAYER_ENTERING_WORLD'},"OnEvent", function(self, event, ...) if(type(addon[event]) == 'function') then addon[event](self, event, ...) end end)