DaVis/core.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)