zz_Taunted/taunted.lua

185 lines
5.4 KiB
Lua

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)