261 lines
9.3 KiB
Lua
261 lines
9.3 KiB
Lua
local name, addon = ...
|
|
addon.cTip = CreateFrame("GameTooltip",name.."Tooltip",nil,"GameTooltipTemplate")
|
|
local defaults,dmginc,options,db,guid = {},{}
|
|
local prefix = {"SWING","RANGE","SPELL","SPELL_PERIODIC","SPELL_BUILDING","ENVIRONMENTAL"}
|
|
local suffix = {"DAMAGE","HEAL"}
|
|
local subevents = {}
|
|
local spamDelay = 10
|
|
local spamShow = false
|
|
local realm = GetRealmName()
|
|
local tank = UnitName("player")
|
|
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
|
|
}
|
|
|
|
local InCombatGUIDS = {}
|
|
|
|
local dontspam = {
|
|
['2649'] = true,-- Hunter pet growl rank 1
|
|
['17735'] = true, -- Warlock pet suffering rank 1
|
|
}
|
|
|
|
local spammer = {}
|
|
|
|
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",
|
|
}
|
|
for _,a in pairs(prefix) do
|
|
for _,b in pairs(suffix) do
|
|
subevents[#subevents + 1] = format("%s_%s",a,b)
|
|
end
|
|
end
|
|
subevents[#subevents + 1] = "SPELL_CAST_START"
|
|
subevents[#subevents + 1] = "SPELL_CAST_SUCCESS"
|
|
subevents[#subevents + 1] = "SPELL_MISSED"
|
|
|
|
local f = CreateFrame("Frame",name,UIParent)
|
|
f.width = 350
|
|
f.height = 140
|
|
f:SetPoint("CENTER", UIParent, "CENTER", 0, 0)
|
|
f:SetSize(f.width, f.height)
|
|
-- Make movable/resizable
|
|
f:SetMovable(true)
|
|
f:SetResizable(enable)
|
|
f:SetMinResize(100, 100)
|
|
f:RegisterForDrag("LeftButton")
|
|
f:EnableMouse(true)
|
|
f:EnableMouseWheel(true)
|
|
f:SetScript("OnDragStart", f.StartMoving)
|
|
f:SetScript("OnDragStop", f.StopMovingOrSizing)
|
|
f:RegisterEvent("PLAYER_REGEN_DISABLED")
|
|
f:RegisterEvent("PLAYER_REGEN_ENABLED")
|
|
f:SetScript("OnEvent", function(self, event)
|
|
if(event=="PLAYER_REGEN_ENABLED") then
|
|
InCombatGUIDS = {}
|
|
else
|
|
addon:resetBars(dmginc)
|
|
end
|
|
end)
|
|
addon.davisframe = f
|
|
local function getPref(pref)
|
|
return db[pref[#pref]]
|
|
end
|
|
|
|
local function setPref(pref,value)
|
|
db[pref[#pref]] = value
|
|
end
|
|
|
|
local function NameIsTank(tank)
|
|
if(IsInRaid()) 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))
|
|
r = r or realm
|
|
if(c and r and format("%s-%s",c,r) == tank) then
|
|
return true
|
|
end
|
|
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))
|
|
r = r or realm
|
|
if(c and r and format("%s-%s",c,r) == tank) then
|
|
return true
|
|
end
|
|
end
|
|
end
|
|
return UnitGroupRolesAssigned("player")
|
|
end
|
|
end
|
|
|
|
function addon:CLParse(event, data, prefix, suffix)
|
|
-- local event,timestamp, eventtype, hideCaster, sourceGUID, sourceName, sourceFlags, sourceRaidFlags, destGUID, destName, destFlags, destRaidFlags, spellId,spellName,spellSchool = ...
|
|
-- 16 amount overkill school resisted blocked absorbed critical glancing crushing isOffHand multistrike
|
|
-- data = {...}
|
|
-- local prefix, suffix = unpack(addon:SplitCLEvent(data[3]))
|
|
if(data[3] == "SPELL_CAST_SUCCESS" or data[3] == "SPELL_MISSED") then
|
|
local name = tostring(data[6])
|
|
if not (UnitPlayerOrPetInParty(name) or UnitPlayerOrPetInRaid(name) or UnitIsUnit("player",name) or UnitIsUnit("pet",name)) then return end
|
|
if(taunts[tostring(data[13])]) then
|
|
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 NameIsTank(name) and addon['db']['profile']['ignoreTanks'] then return end
|
|
if(not dontspam[tostring(data[13])] or spamShow) then
|
|
-- addon['Print'](L["Taunted"](name,data[10],data[14]))
|
|
local coloredName,class = UnitClass(name)
|
|
if(class) then
|
|
coloredName = addon:classcolor(name,class)
|
|
end
|
|
addon:AddScrollMessage(L["Taunted"](GetPlayerLink(name,("[%s]"):format(coloredName)),data[10],GetSpellLink(data[13])))
|
|
end
|
|
spamShow = false
|
|
else
|
|
-- addon['Print'](L["Taunted Fail"](name,data[10],data[14]))
|
|
addon:AddScrollMessage(L["Taunted Fail"](name,data[10],GetSpellLink(data[13])))
|
|
-- scroll:AddMessage(L["Taunted Fail"](name,data[10],GetSpellLink(data[13])))
|
|
end
|
|
end
|
|
elseif(data[3] == "SPELL_CAST_START") then
|
|
local spells = addon:GetHeals()
|
|
local isHostile = bit.band(data[11],COMBATLOG_OBJECT_REACTION_HOSTILE)
|
|
local isNPC = bit.band(data[11],COMBATLOG_OBJECT_TYPE_NPC)
|
|
local isHostileS = bit.band(data[7],COMBATLOG_OBJECT_REACTION_HOSTILE)
|
|
local isNPCS = bit.band(data[7],COMBATLOG_OBJECT_TYPE_NPC)
|
|
if(spells[data[13]]) then
|
|
-- print("iNPC"..tostring(isNPC)..tostring(isNPCS)..GetSpellLink(data[13])..tostring(data[6])..tostring(data[10]))
|
|
end
|
|
if(spells[data[13]] and isHostile and tonumber(isNPCS)>0) then
|
|
-- local name, text, texture, startTimeMS, endTimeMS, isTradeSkill, castID, notInterruptible, spellId = UnitCastingInfo("unit")
|
|
addon:AddScrollMessage(("%s %s %s"):format(addon:colorize("Healalarm spellcast started","22ff44"),data[6],GetSpellLink(data[13])))
|
|
PlaySound(31754)
|
|
end
|
|
else
|
|
if(guid == data[9]) then
|
|
if(suffix == "DAMAGE") then
|
|
|
|
local offset = prefix == 'SWING' and 13 or 16
|
|
-- print(sp[#sp - 1],data[13],data[14],data[15],data[16],offset)
|
|
local isPhysical = bit.band(data[15],0x1)
|
|
local store = isPhysical>0 and "SWING" or "SPELL"
|
|
dmginc[store] = dmginc[store] or {
|
|
['amount'] = 0,
|
|
-- ['resisted'] = 0,
|
|
['blocked'] = 0,
|
|
['absorbed'] = 0,
|
|
}
|
|
if(prefix=="ENVIRONMENTAL" and data[13]=="Falling") then
|
|
dmginc[store]['amount'] = dmginc[store]['amount'] + tonumber(data[14] or 0)
|
|
else
|
|
dmginc[store]['amount'] = dmginc[store]['amount'] + tonumber(data[offset] or 0)
|
|
-- dmginc[store]['resisted'] = dmginc[store]['resisted'] + tonumber(data[offset+3] or 0)
|
|
dmginc[store]['blocked'] = dmginc[store]['blocked'] + tonumber(data[offset+4] or 0)
|
|
dmginc[store]['absorbed'] = dmginc[store]['absorbed'] + tonumber(data[offset+5] or 0)
|
|
end
|
|
addon:updateBars(dmginc)
|
|
end
|
|
elseif(suffix == "DAMAGE") then
|
|
local isHostile = bit.band(data[11],COMBATLOG_OBJECT_REACTION_HOSTILE)
|
|
local isNPC = bit.band(data[11],COMBATLOG_OBJECT_TYPE_NPC)
|
|
if(data[9] and isHostile>0 and isNPC>0) then
|
|
if(not InCombatGUIDS[data[9]]) then
|
|
InCombatGUIDS[data[9]] = true
|
|
if(data[5] == guid or UnitPlayerOrPetInRaid(data[6]) or UnitPlayerOrPetInParty(data[6])) then
|
|
-- print(data[13], #data)
|
|
if(#data == 25) then
|
|
|
|
addon:AddScrollMessage(format("%s %s pulled %s with %s",addon:colorize("WhoPulled?","ffff44"),data[6],data[10],GetSpellLink(data[13]) or data[13]))
|
|
else
|
|
addon:AddScrollMessage(format("%s %s pulled %s",addon:colorize("WhoPulled?","ffff44"),data[6],data[10]))
|
|
-- print("bodypull")
|
|
-- print(unpack(data))
|
|
end
|
|
end
|
|
end
|
|
end
|
|
else
|
|
if(suffix == "HEAL") then
|
|
local isHostile = bit.band(data[11],COMBATLOG_OBJECT_REACTION_HOSTILE)
|
|
local isNPC = bit.band(data[11],COMBATLOG_OBJECT_TYPE_NPC)
|
|
if(data[6] and isHostile>0 and isNPC>0) then
|
|
addon:AddHealer(data[6],data[13])
|
|
if(InCombatLockdown()) then
|
|
addon:AddScrollMessage(("%s %s %s"):format(addon:colorize("Healalarm ","ff0000"),data[6],GetSpellLink(data[13])))
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local function toggle(self, button)
|
|
if(button=="RightButton") then
|
|
if(InterfaceOptionsFrame:IsVisible() and not InCombatLockdown()) then
|
|
InterfaceOptionsFrame:Hide()
|
|
else
|
|
InterfaceOptionsFrame_OpenToCategory(name)
|
|
InterfaceOptionsFrame_OpenToCategory(name) -- Twice because of a bug in InterfaceOptionsFrame_OpenToCategory
|
|
end
|
|
else
|
|
if(addon.scrollframe:IsVisible()) then
|
|
addon.scrollframe:Hide()
|
|
else
|
|
addon.scrollframe:Show()
|
|
end
|
|
end
|
|
end
|
|
|
|
local function init()
|
|
LibStub("LibCombatLog"):Embed(addon)
|
|
addon:RegisterCLEvent(subevents,"CLParse")
|
|
options = addon:InitConfig(name, true, {
|
|
['type'] = "data source",
|
|
['OnClick'] = toggle,
|
|
['icon'] = "Interface\\Icons\\spell_holy_renew"
|
|
}, getPref, setPref)
|
|
db = addon['db']['profile'][name]
|
|
addon:AddConfigEntry(name, 'toggle', 'ignoreTanks', 'Ignore Tanks', 'Dont show taunts of tanks.', 1)
|
|
guid = UnitGUID("player")
|
|
end
|
|
addon:startup(name, name, init, true, defaults) |