--[[
-- Blizzard Combat Log
-- by Alexander Yoshi
--
-- This is a prototype combat log designed to serve the
-- majority of needs for WoW players. The new and improved
-- combat log event formatting should allow for the community
-- to develop even better combat logs in the future.
--
-- Thanks to:
-- Chris Heald & Xinhuan - Code Optimization Support
--
--]]
-- Version
-- Constant -- Incrementing this number will erase saved filter settings!!
COMBATLOG_FILTER_VERSION = 4.1;
-- Saved Variable
Blizzard_CombatLog_Filter_Version = 0;
-- Define the log
COMBATLOG = ChatFrame2;
-- BUFF / DEBUFF
AURA_TYPE_BUFF = "BUFF";
AURA_TYPE_DEBUFF = "DEBUFF"
-- Message Limit
COMBATLOG_LIMIT_PER_FRAME = 1;
COMBATLOG_HIGHLIGHT_MULTIPLIER = 1.5;
-- Default Colors
COMBATLOG_DEFAULT_COLORS = {
-- Unit names
unitColoring = {
[COMBATLOG_FILTER_MINE] = {a=1.0,r=0.70,g=0.70,b=0.70}; --{a=1.0,r=0.14,g=1.00,b=0.15};
[COMBATLOG_FILTER_MY_PET] = {a=1.0,r=0.70,g=0.70,b=0.70}; --{a=1.0,r=0.14,g=0.80,b=0.15};
[COMBATLOG_FILTER_FRIENDLY_UNITS] = {a=1.0,r=0.34,g=0.64,b=1.00};
[COMBATLOG_FILTER_HOSTILE_UNITS] = {a=1.0,r=0.75,g=0.05,b=0.05};
[COMBATLOG_FILTER_HOSTILE_PLAYERS] = {a=1.0,r=0.75,g=0.05,b=0.05};
[COMBATLOG_FILTER_NEUTRAL_UNITS] = {a=1.0,r=0.75,g=0.05,b=0.05}; -- {a=1.0,r=0.80,g=0.80,b=0.14};
[COMBATLOG_FILTER_UNKNOWN_UNITS] = {a=1.0,r=0.75,g=0.75,b=0.75};
};
-- School coloring
schoolColoring = {
[SCHOOL_MASK_NONE] = {a=1.0,r=1.00,g=1.00,b=1.00};
[SCHOOL_MASK_PHYSICAL] = {a=1.0,r=1.00,g=1.00,b=0.00};
[SCHOOL_MASK_HOLY] = {a=1.0,r=1.00,g=0.90,b=0.50};
[SCHOOL_MASK_FIRE] = {a=1.0,r=1.00,g=0.50,b=0.00};
[SCHOOL_MASK_NATURE] = {a=1.0,r=0.30,g=1.00,b=0.30};
[SCHOOL_MASK_FROST] = {a=1.0,r=0.50,g=1.00,b=1.00};
[SCHOOL_MASK_SHADOW] = {a=1.0,r=0.50,g=0.50,b=1.00};
[SCHOOL_MASK_ARCANE] = {a=1.0,r=1.00,g=0.50,b=1.00};
};
-- Defaults
defaults = {
spell = {a=1.0,r=1.00,g=1.00,b=1.00};
damage = {a=1.0,r=1.00,g=1.00,b=0.00};
};
-- Line coloring
eventColoring = {
};
-- Highlighted events
highlightedEvents = {
["PARTY_KILL"] = true;
};
};
COMBATLOG_DEFAULT_SETTINGS = {
-- Settings
fullText = true;
textMode = TEXT_MODE_A;
timestamp = false;
timestampFormat = TEXT_MODE_A_TIMESTAMP;
unitColoring = false;
sourceColoring = true;
destColoring = true;
lineColoring = true;
lineHighlighting = true;
abilityColoring = false;
abilityActorColoring = false;
abilitySchoolColoring = false;
abilityHighlighting = true;
actionColoring = false;
actionActorColoring = false;
actionHighlighting = false;
amountColoring = false;
amountActorColoring = false;
amountSchoolColoring = false;
amountHighlighting = true;
schoolNameColoring = false;
schoolNameActorColoring = false;
schoolNameHighlighting = true;
noMeleeSwingColoring = false;
missColoring = true;
braces = false;
unitBraces = true;
sourceBraces = true;
destBraces = true;
spellBraces = false;
itemBraces = true;
showHistory = true;
lineColorPriority = 1; -- 1 = source->dest->event, 2 = dest->source->event, 3 = event->source->dest
unitIcons = true;
hideBuffs = false;
hideDebuffs = false;
--unitTokens = true;
};
--
-- Combat Log Icons
--
COMBATLOG_ICON_RAIDTARGET1 = "|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_1.blp:0|t";
COMBATLOG_ICON_RAIDTARGET2 = "|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_2.blp:0|t";
COMBATLOG_ICON_RAIDTARGET3 = "|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_3.blp:0|t";
COMBATLOG_ICON_RAIDTARGET4 = "|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_4.blp:0|t";
COMBATLOG_ICON_RAIDTARGET5 = "|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_5.blp:0|t";
COMBATLOG_ICON_RAIDTARGET6 = "|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_6.blp:0|t";
COMBATLOG_ICON_RAIDTARGET7 = "|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_7.blp:0|t";
COMBATLOG_ICON_RAIDTARGET8 = "|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_8.blp:0|t";
--
-- Default Event List
--
COMBATLOG_EVENT_LIST = {
["ENVIRONMENTAL_DAMAGE"] = true,
["SWING_DAMAGE"] = true,
["SWING_MISSED"] = true,
["RANGE_DAMAGE"] = true,
["RANGE_MISSED"] = true,
["SPELL_CAST_START"] = false,
["SPELL_CAST_SUCCESS"] = false,
["SPELL_CAST_FAILED"] = false,
["SPELL_MISSED"] = true,
["SPELL_DAMAGE"] = true,
["SPELL_HEAL"] = true,
["SPELL_ENERGIZE"] = true,
["SPELL_DRAIN"] = true,
["SPELL_LEECH"] = true,
["SPELL_SUMMON"] = true,
["SPELL_RESURRECT"] = true,
["SPELL_CREATE"] = true,
["SPELL_INSTAKILL"] = true,
["SPELL_INTERRUPT"] = true,
["SPELL_EXTRA_ATTACKS"] = true,
["SPELL_DURABILITY_DAMAGE"] = false,
["SPELL_DURABILITY_DAMAGE_ALL"] = false,
["SPELL_AURA_APPLIED"] = false,
["SPELL_AURA_APPLIED_DOSE"] = false,
["SPELL_AURA_REMOVED"] = false,
["SPELL_AURA_REMOVED_DOSE"] = false,
["SPELL_AURA_BROKEN"] = false,
["SPELL_AURA_BROKEN_SPELL"] = false,
["SPELL_AURA_REFRESH"] = false,
["SPELL_DISPEL"] = true,
["SPELL_STOLEN"] = true,
["ENCHANT_APPLIED"] = true,
["ENCHANT_REMOVED"] = true,
["SPELL_PERIODIC_MISSED"] = true,
["SPELL_PERIODIC_DAMAGE"] = true,
["SPELL_PERIODIC_HEAL"] = true,
["SPELL_PERIODIC_ENERGIZE"] = true,
["SPELL_PERIODIC_DRAIN"] = true,
["SPELL_PERIODIC_LEECH"] = true,
["SPELL_DISPEL_FAILED"] = true,
["DAMAGE_SHIELD"] = false,
["DAMAGE_SHIELD_MISSED"] = false,
["DAMAGE_SPLIT"] = false,
["PARTY_KILL"] = true,
["UNIT_DIED"] = true,
["UNIT_DESTROYED"] = true,
["SPELL_BUILDING_DAMAGE"] = true,
["SPELL_BUILDING_HEAL"] = true,
};
COMBATLOG_FLAG_LIST = {
[COMBATLOG_FILTER_MINE] = true,
[COMBATLOG_FILTER_MY_PET] = true,
[COMBATLOG_FILTER_FRIENDLY_UNITS] = true,
[COMBATLOG_FILTER_HOSTILE_UNITS] = true,
[COMBATLOG_FILTER_HOSTILE_PLAYERS] = true,
[COMBATLOG_FILTER_NEUTRAL_UNITS] = true,
[COMBATLOG_FILTER_UNKNOWN_UNITS] = true,
};
EVENT_TEMPLATE_FORMATS = {
["SPELL_AURA_APPLIED_BUFF"] = TEXT_MODE_A_STRING_2,
["SPELL_AURA_APPLIED"] = TEXT_MODE_A_STRING_2,
["SPELL_AURA_REFRESH_BUFF"] = TEXT_MODE_A_STRING_2,
["SPELL_AURA_REFRESH"] = TEXT_MODE_A_STRING_2,
["SPELL_CAST_START"] = TEXT_MODE_A_STRING_2,
["SPELL_CAST_SUCCESS"] = TEXT_MODE_A_STRING_2
};
--
-- Creates an empty filter
--
function Blizzard_CombatLog_InitializeFilters( settings )
settings.filters =
{
[1] = {
eventList = {};
};
};
end
--
-- Generates a new event list from the COMBATLOG_EVENT_LIST global
--
-- I wish there was a better way built in to do this.
--
-- Returns:
-- An array, indexed by the events, with a value of true
--
function Blizzard_CombatLog_GenerateFullEventList ( )
local eventList = {}
for event, v in pairs ( COMBATLOG_EVENT_LIST ) do
eventList[event] = true;
end
return eventList;
end
function Blizzard_CombatLog_GenerateFullFlagList(flag)
local flagList = {};
for k, v in pairs(COMBATLOG_FLAG_LIST) do
if ( flag ) then
flagList[k] = true
else
flagList[k] = false;
end
end
return flagList;
end
--
-- Default CombatLog Filter
-- This table is used to create new CombatLog filters
--
DEFAULT_COMBATLOG_FILTER_TEMPLATE = {
-- Descriptive Information
hasQuickButton = true;
quickButtonDisplay = {
solo = true;
party = true;
raid = true;
};
-- Default Color and Formatting Options
settings = CopyTable(COMBATLOG_DEFAULT_SETTINGS);
-- Coloring
colors = CopyTable(COMBATLOG_DEFAULT_COLORS);
-- The actual client filters
filters = {
[1] = {
eventList = Blizzard_CombatLog_GenerateFullEventList();
sourceFlags = {
[COMBATLOG_FILTER_MINE] = true,
[COMBATLOG_FILTER_MY_PET] = true;
};
destFlags = nil;
};
[2] = {
eventList = Blizzard_CombatLog_GenerateFullEventList();
sourceFlags = nil;
destFlags = {
[COMBATLOG_FILTER_MINE] = true,
[COMBATLOG_FILTER_MY_PET] = true;
};
};
};
};
local CombatLogUpdateFrame = CreateFrame("Frame", "CombatLogUpdateFrame", UIParent)
local _G = getfenv(0)
local bit_bor = _G.bit.bor
local bit_band = _G.bit.band
local tinsert = _G.tinsert
local tremove = _G.tremove
local math_floor = _G.math.floor
local format = _G.format
local gsub = _G.gsub
local strsub = _G.strsub
local strreplace = _G.strreplace;
-- Make all the constants upvalues. This prevents the global environment lookup + table lookup each time we use one (and they're used a lot)
local COMBATLOG_OBJECT_AFFILIATION_MINE = COMBATLOG_OBJECT_AFFILIATION_MINE
local COMBATLOG_OBJECT_AFFILIATION_PARTY = COMBATLOG_OBJECT_AFFILIATION_PARTY
local COMBATLOG_OBJECT_AFFILIATION_RAID = COMBATLOG_OBJECT_AFFILIATION_RAID
local COMBATLOG_OBJECT_AFFILIATION_OUTSIDER = COMBATLOG_OBJECT_AFFILIATION_OUTSIDER
local COMBATLOG_OBJECT_AFFILIATION_MASK = COMBATLOG_OBJECT_AFFILIATION_MASK
local COMBATLOG_OBJECT_REACTION_FRIENDLY = COMBATLOG_OBJECT_REACTION_FRIENDLY
local COMBATLOG_OBJECT_REACTION_NEUTRAL = COMBATLOG_OBJECT_REACTION_NEUTRAL
local COMBATLOG_OBJECT_REACTION_HOSTILE = COMBATLOG_OBJECT_REACTION_HOSTILE
local COMBATLOG_OBJECT_REACTION_MASK = COMBATLOG_OBJECT_REACTION_MASK
local COMBATLOG_OBJECT_CONTROL_PLAYER = COMBATLOG_OBJECT_CONTROL_PLAYER
local COMBATLOG_OBJECT_CONTROL_NPC = COMBATLOG_OBJECT_CONTROL_NPC
local COMBATLOG_OBJECT_CONTROL_MASK = COMBATLOG_OBJECT_CONTROL_MASK
local COMBATLOG_OBJECT_TYPE_PLAYER = COMBATLOG_OBJECT_TYPE_PLAYER
local COMBATLOG_OBJECT_TYPE_NPC = COMBATLOG_OBJECT_TYPE_NPC
local COMBATLOG_OBJECT_TYPE_PET = COMBATLOG_OBJECT_TYPE_PET
local COMBATLOG_OBJECT_TYPE_GUARDIAN = COMBATLOG_OBJECT_TYPE_GUARDIAN
local COMBATLOG_OBJECT_TYPE_OBJECT = COMBATLOG_OBJECT_TYPE_OBJECT
local COMBATLOG_OBJECT_TYPE_MASK = COMBATLOG_OBJECT_TYPE_MASK
local COMBATLOG_OBJECT_TARGET = COMBATLOG_OBJECT_TARGET
local COMBATLOG_OBJECT_FOCUS = COMBATLOG_OBJECT_FOCUS
local COMBATLOG_OBJECT_MAINTANK = COMBATLOG_OBJECT_MAINTANK
local COMBATLOG_OBJECT_MAINASSIST = COMBATLOG_OBJECT_MAINASSIST
local COMBATLOG_OBJECT_RAIDTARGET1 = COMBATLOG_OBJECT_RAIDTARGET1
local COMBATLOG_OBJECT_RAIDTARGET2 = COMBATLOG_OBJECT_RAIDTARGET2
local COMBATLOG_OBJECT_RAIDTARGET3 = COMBATLOG_OBJECT_RAIDTARGET3
local COMBATLOG_OBJECT_RAIDTARGET4 = COMBATLOG_OBJECT_RAIDTARGET4
local COMBATLOG_OBJECT_RAIDTARGET5 = COMBATLOG_OBJECT_RAIDTARGET5
local COMBATLOG_OBJECT_RAIDTARGET6 = COMBATLOG_OBJECT_RAIDTARGET6
local COMBATLOG_OBJECT_RAIDTARGET7 = COMBATLOG_OBJECT_RAIDTARGET7
local COMBATLOG_OBJECT_RAIDTARGET8 = COMBATLOG_OBJECT_RAIDTARGET8
local COMBATLOG_OBJECT_NONE = COMBATLOG_OBJECT_NONE
local COMBATLOG_OBJECT_SPECIAL_MASK = COMBATLOG_OBJECT_SPECIAL_MASK
local COMBATLOG_FILTER_ME = COMBATLOG_FILTER_ME
local COMBATLOG_FILTER_MINE = COMBATLOG_FILTER_MINE
local COMBATLOG_FILTER_MY_PET = COMBATLOG_FILTER_MY_PET
local COMBATLOG_FILTER_FRIENDLY_UNITS = COMBATLOG_FILTER_FRIENDLY_UNITS
local COMBATLOG_FILTER_HOSTILE_UNITS = COMBATLOG_FILTER_HOSTILE_UNITS
local COMBATLOG_FILTER_HOSTILE_PLAYERS = COMBATLOG_FILTER_HOSTILE_PLAYERS
local COMBATLOG_FILTER_NEUTRAL_UNITS = COMBATLOG_FILTER_NEUTRAL_UNITS
local COMBATLOG_FILTER_UNKNOWN_UNITS = COMBATLOG_FILTER_UNKNOWN_UNITS
local COMBATLOG_FILTER_EVERYTHING = COMBATLOG_FILTER_EVERYTHING
local COMBATLOG = COMBATLOG
local AURA_TYPE_BUFF = AURA_TYPE_BUFF
local AURA_TYPE_DEBUFF = AURA_TYPE_DEBUFF
local SPELL_POWER_MANA = SPELL_POWER_MANA
local SPELL_POWER_RAGE = SPELL_POWER_RAGE
local SPELL_POWER_FOCUS = SPELL_POWER_FOCUS
local SPELL_POWER_ENERGY = SPELL_POWER_ENERGY
local SPELL_POWER_HAPPINESS = SPELL_POWER_HAPPINESS
local SPELL_POWER_RUNES = SPELL_POWER_RUNES
local SPELL_POWER_RUNIC_POWER = SPELL_POWER_RUNIC_POWER
local SCHOOL_MASK_NONE = SCHOOL_MASK_NONE
local SCHOOL_MASK_PHYSICAL = SCHOOL_MASK_PHYSICAL
local SCHOOL_MASK_HOLY = SCHOOL_MASK_HOLY
local SCHOOL_MASK_FIRE = SCHOOL_MASK_FIRE
local SCHOOL_MASK_NATURE = SCHOOL_MASK_NATURE
local SCHOOL_MASK_FROST = SCHOOL_MASK_FROST
local SCHOOL_MASK_SHADOW = SCHOOL_MASK_SHADOW
local SCHOOL_MASK_ARCANE = SCHOOL_MASK_ARCANE
local COMBATLOG_LIMIT_PER_FRAME = COMBATLOG_LIMIT_PER_FRAME
local COMBATLOG_HIGHLIGHT_MULTIPLIER = COMBATLOG_HIGHLIGHT_MULTIPLIER
local COMBATLOG_DEFAULT_COLORS = COMBATLOG_DEFAULT_COLORS
local COMBATLOG_DEFAULT_SETTINGS = COMBATLOG_DEFAULT_SETTINGS
local COMBATLOG_ICON_RAIDTARGET1 = COMBATLOG_ICON_RAIDTARGET1
local COMBATLOG_ICON_RAIDTARGET2 = COMBATLOG_ICON_RAIDTARGET2
local COMBATLOG_ICON_RAIDTARGET3 = COMBATLOG_ICON_RAIDTARGET3
local COMBATLOG_ICON_RAIDTARGET4 = COMBATLOG_ICON_RAIDTARGET4
local COMBATLOG_ICON_RAIDTARGET5 = COMBATLOG_ICON_RAIDTARGET5
local COMBATLOG_ICON_RAIDTARGET6 = COMBATLOG_ICON_RAIDTARGET6
local COMBATLOG_ICON_RAIDTARGET7 = COMBATLOG_ICON_RAIDTARGET7
local COMBATLOG_ICON_RAIDTARGET8 = COMBATLOG_ICON_RAIDTARGET8
local COMBATLOG_EVENT_LIST = COMBATLOG_EVENT_LIST
local CombatLog_OnEvent -- for later
local CombatLog_Object_IsA = CombatLog_Object_IsA
-- Create a dummy CombatLogQuickButtonFrame for line 803 of FloatingChatFrame.lua. It causes inappropriate show/hide behavior. Instead, we'll use our own frame display handling.
-- If there are more than 2 combat log frames, then the CombatLogQuickButtonFrame gets tied to the last frame tab's visibility status. Yuck! Let's just instead tie it to the combat log's tab.
local CombatLogQuickButtonFrame, CombatLogQuickButtonFrameProgressBar, CombatLogQuickButtonFrameTexture
_G.CombatLogQuickButtonFrame = CreateFrame("Frame", "CombatLogQuickButtonFrame", UIParent)
-- For debugging, remove for final commit
local function debug(...)
local a,b,c,d,e,f,g,h,i,j,k = ...
if select("#", ...) == 1 then
b, a = a, "%s"
end
ChatFrame1:AddMessage(a:format(
tostring(b),
tostring(c),
tostring(d),
tostring(e),
tostring(f),
tostring(g),
tostring(i),
tostring(j),
tostring(k)
))
end
local Blizzard_CombatLog_Update_QuickButtons
local Blizzard_CombatLog_Filters
local Blizzard_CombatLog_CurrentSettings
local Blizzard_CombatLog_PreviousSettings
--
-- Persistant Variables
--
--
-- Default Filters
--
Blizzard_CombatLog_Filter_Defaults = {
-- All of the filters
filters = {
[1] = {
-- Descriptive Information
name = QUICKBUTTON_NAME_SELF;
hasQuickButton = true;
quickButtonName = QUICKBUTTON_NAME_SELF;
quickButtonDisplay = {
solo = true;
party = true;
raid = true;
};
tooltip = QUICKBUTTON_NAME_SELF_TOOLTIP;
-- Default Color and Formatting Options
settings = CopyTable(COMBATLOG_DEFAULT_SETTINGS);
-- Coloring
colors = CopyTable(COMBATLOG_DEFAULT_COLORS);
-- The actual client filters
filters = {
[1] = {
eventList = {
["ENVIRONMENTAL_DAMAGE"] = true,
["SWING_DAMAGE"] = true,
["SWING_MISSED"] = true,
["RANGE_DAMAGE"] = true,
["RANGE_MISSED"] = true,
--["SPELL_CAST_START"] = true,
--["SPELL_CAST_SUCCESS"] = true,
--["SPELL_CAST_FAILED"] = true,
["SPELL_MISSED"] = true,
["SPELL_DAMAGE"] = true,
["SPELL_HEAL"] = true,
["SPELL_ENERGIZE"] = true,
["SPELL_DRAIN"] = true,
["SPELL_LEECH"] = true,
["SPELL_INSTAKILL"] = true,
["SPELL_INTERRUPT"] = true,
["SPELL_EXTRA_ATTACKS"] = true,
--["SPELL_DURABILITY_DAMAGE"] = true,
--["SPELL_DURABILITY_DAMAGE_ALL"] = true,
["SPELL_AURA_APPLIED"] = true,
["SPELL_AURA_APPLIED_DOSE"] = true,
["SPELL_AURA_REMOVED"] = true,
["SPELL_AURA_REMOVED_DOSE"] = true,
["SPELL_AURA_BROKEN"] = true,
["SPELL_AURA_BROKEN_SPELL"] = true,
["SPELL_AURA_REFRESH"] = true,
["SPELL_DISPEL"] = true,
["SPELL_STOLEN"] = true,
["ENCHANT_APPLIED"] = true,
["ENCHANT_REMOVED"] = true,
["SPELL_PERIODIC_MISSED"] = true,
["SPELL_PERIODIC_DAMAGE"] = true,
["SPELL_PERIODIC_HEAL"] = true,
["SPELL_PERIODIC_ENERGIZE"] = true,
["SPELL_PERIODIC_DRAIN"] = true,
["SPELL_PERIODIC_LEECH"] = true,
["SPELL_DISPEL_FAILED"] = true,
--["DAMAGE_SHIELD"] = true,
--["DAMAGE_SHIELD_MISSED"] = true,
--["DAMAGE_SPLIT"] = true,
["PARTY_KILL"] = true,
["UNIT_DIED"] = true,
["UNIT_DESTROYED"] = true
};
sourceFlags = {
[COMBATLOG_FILTER_MINE] = true,
[COMBATLOG_FILTER_MY_PET] = true;
};
destFlags = nil;
};
[2] = {
eventList = {
--["ENVIRONMENTAL_DAMAGE"] = true,
["SWING_DAMAGE"] = true,
["SWING_MISSED"] = true,
["RANGE_DAMAGE"] = true,
["RANGE_MISSED"] = true,
--["SPELL_CAST_START"] = true,
--["SPELL_CAST_SUCCESS"] = true,
--["SPELL_CAST_FAILED"] = true,
["SPELL_MISSED"] = true,
["SPELL_DAMAGE"] = true,
["SPELL_HEAL"] = true,
["SPELL_ENERGIZE"] = true,
["SPELL_DRAIN"] = true,
["SPELL_LEECH"] = true,
["SPELL_INSTAKILL"] = true,
["SPELL_INTERRUPT"] = true,
["SPELL_EXTRA_ATTACKS"] = true,
--["SPELL_DURABILITY_DAMAGE"] = true,
--["SPELL_DURABILITY_DAMAGE_ALL"] = true,
--["SPELL_AURA_APPLIED"] = true,
--["SPELL_AURA_APPLIED_DOSE"] = true,
--["SPELL_AURA_REMOVED"] = true,
--["SPELL_AURA_REMOVED_DOSE"] = true,
["SPELL_DISPEL"] = true,
["SPELL_STOLEN"] = true,
["ENCHANT_APPLIED"] = true,
["ENCHANT_REMOVED"] = true,
--["SPELL_PERIODIC_MISSED"] = true,
--["SPELL_PERIODIC_DAMAGE"] = true,
--["SPELL_PERIODIC_HEAL"] = true,
--["SPELL_PERIODIC_ENERGIZE"] = true,
--["SPELL_PERIODIC_DRAIN"] = true,
--["SPELL_PERIODIC_LEECH"] = true,
["SPELL_DISPEL_FAILED"] = true,
--["DAMAGE_SHIELD"] = true,
--["DAMAGE_SHIELD_MISSED"] = true,
--["DAMAGE_SPLIT"] = true,
["PARTY_KILL"] = true,
["UNIT_DIED"] = true,
["UNIT_DESTROYED"] = true
};
sourceFlags = nil;
destFlags = {
[COMBATLOG_FILTER_MINE] = true,
[COMBATLOG_FILTER_MY_PET] = true;
};
};
};
};
[2] = {
-- Descriptive Information
name = QUICKBUTTON_NAME_EVERYTHING;
hasQuickButton = true;
quickButtonName = QUICKBUTTON_NAME_EVERYTHING;
quickButtonDisplay = {
solo = true;
party = true;
raid = true;
};
tooltip = QUICKBUTTON_NAME_EVERYTHING_TOOLTIP;
-- Settings
settings = CopyTable(COMBATLOG_DEFAULT_SETTINGS);
-- Coloring
colors = CopyTable(COMBATLOG_DEFAULT_COLORS);
-- The actual client filters
filters = {
[1] = {
eventList = Blizzard_CombatLog_GenerateFullEventList();
sourceFlags = Blizzard_CombatLog_GenerateFullFlagList(true);
destFlags = nil;
};
[2] = {
eventList = Blizzard_CombatLog_GenerateFullEventList();
sourceFlags = nil;
destFlags = Blizzard_CombatLog_GenerateFullFlagList(true);
};
};
};
[3] = {
-- Descriptive Information
name = QUICKBUTTON_NAME_ME;
hasQuickButton = true;
quickButtonName = QUICKBUTTON_NAME_ME;
quickButtonDisplay = {
solo = true;
party = true;
raid = true;
};
tooltip = QUICKBUTTON_NAME_ME_TOOLTIP;
-- Settings
settings = CopyTable(COMBATLOG_DEFAULT_SETTINGS);
-- Coloring
colors = CopyTable(COMBATLOG_DEFAULT_COLORS);
-- The actual client filters
filters = {
[1] = {
eventList = Blizzard_CombatLog_GenerateFullEventList();
sourceFlags = Blizzard_CombatLog_GenerateFullFlagList(false);
destFlags = nil;
};
[2] = {
eventList = Blizzard_CombatLog_GenerateFullEventList();
sourceFlags = nil;
destFlags = {
[COMBATLOG_FILTER_MINE] = true,
[COMBATLOG_FILTER_MY_PET] = true;
};
};
};
};
[4] = {
-- Descriptive Information
name = QUICKBUTTON_NAME_KILLS;
hasQuickButton = false;
quickButtonName = QUICKBUTTON_NAME_KILLS;
quickButtonDisplay = {
solo = true;
party = true;
raid = true;
};
tooltip = QUICKBUTTON_NAME_KILLS_TOOLTIP;
-- Settings
settings = CopyTable(COMBATLOG_DEFAULT_SETTINGS);
-- Coloring
colors = CopyTable(COMBATLOG_DEFAULT_COLORS);
-- The actual client filters
filters = {
[1] = {
eventList = {
["PARTY_KILL"] = true,
["UNIT_DIED"] = true,
["UNIT_DESTROYED"] = true
};
sourceFlags = Blizzard_CombatLog_GenerateFullFlagList(true);
destFlags = nil;
};
[2] = {
eventList = {
["PARTY_KILL"] = true,
["UNIT_DIED"] = true,
["UNIT_DESTROYED"] = true
};
sourceFlags = nil;
destFlags = Blizzard_CombatLog_GenerateFullFlagList(true);
};
};
};
};
-- Current Filter
currentFilter = 1;
};
local Blizzard_CombatLog_Filters = Blizzard_CombatLog_Filter_Defaults;
_G.Blizzard_CombatLog_Filters = Blizzard_CombatLog_Filters
-- Combat Log Filter Resetting Code
--
-- args:
-- config - the configuration array we are about to apply
--
function Blizzard_CombatLog_ApplyFilters(config)
if ( not config ) then
return;
end
CombatLogResetFilter()
-- Loop over all associated filters
local eventList;
for k,v in pairs(config.filters) do
local eList
-- Only use the first filter's eventList
eventList = config.filters[1].eventList;
if ( eventList ) then
for k2,v2 in pairs(eventList) do
if ( v2 == true ) then
eList = eList and (eList .. "," .. k2) or k2
end
end
end
local sourceFlags, destFlags;
if ( v.sourceFlags ) then
sourceFlags = 0;
for k2, v2 in pairs(v.sourceFlags) do
-- Support for GUIDs
if ( type (k2) == "string" ) then
sourceFlags = k2;
break;
end
-- Otherwise OR bits
if ( v2 ) then
sourceFlags = bit_bor(sourceFlags, k2);
end
end
end
if ( v.destFlags ) then
destFlags = 0;
for k2, v2 in pairs(v.destFlags) do
-- Support for GUIDs
if ( type (k2) == "string" ) then
destFlags = k2;
break;
end
-- Otherwise OR bits
if ( v2 ) then
destFlags = bit_bor(destFlags, k2);
end
end
end
if ( type(sourceFlags) == "string" and destFlags == 0 ) then
destFlags = nil;
end
if ( type(destFlags) == "string" and sourceFlags == 0 ) then
sourceFlags = nil;
end
-- This is a HACK!!! Need filters to be able to accept empty or zero sourceFlags or destFlags
if ( sourceFlags == 0 or destFlags == 0 ) then
CombatLogAddFilter("", COMBATLOG_FILTER_MINE, nil);
else
CombatLogAddFilter(eList, sourceFlags, destFlags);
end
end
end
--
-- Combat Log Repopulation Code
--
-- Message Limit
COMBATLOG_MESSAGE_LIMIT = 300;
--
-- Repopulate the combat log with message history
--
function Blizzard_CombatLog_Refilter()
local count = CombatLogGetNumEntries();
COMBATLOG:SetMaxLines(COMBATLOG_MESSAGE_LIMIT);
-- count should be between 1 and COMBATLOG_MESSAGE_LIMIT
count = max(1, min(count, COMBATLOG_MESSAGE_LIMIT));
CombatLogSetCurrentEntry(0);
-- Clear the combat log
COMBATLOG:Clear();
-- Moved setting the max value here, since we don't really need to reset the max every frame, do we?
-- We can't add events while refiltering (:AddFilter short circuits) so this should be safe optimization.
CombatLogQuickButtonFrameProgressBar:SetMinMaxValues(0, count);
CombatLogQuickButtonFrameProgressBar:SetValue(0);
CombatLogQuickButtonFrameProgressBar:Show();
-- Enable the distributed frame
CombatLogUpdateFrame.refiltering = true;
CombatLogUpdateFrame:SetScript("OnUpdate", Blizzard_CombatLog_RefilterUpdate)
Blizzard_CombatLog_RefilterUpdate()
end
--
-- This is a single frame "step" in the refiltering process
--
function Blizzard_CombatLog_RefilterUpdate()
local valid = CombatLogGetCurrentEntry(); -- CombatLogAdvanceEntry(0);
-- Clear the combat log
local total = 0;
while (valid and total < COMBATLOG_LIMIT_PER_FRAME) do
-- Log to the window
local text, r, g, b, a = CombatLog_OnEvent(Blizzard_CombatLog_CurrentSettings, CombatLogGetCurrentEntry());
-- NOTE: be sure to pass in nil for the color id or the color id may override the r, g, b values for this message
COMBATLOG:AddMessage( text, r, g, b, nil, true );
-- count can be
-- positive to advance from oldest to newest
-- negative to advance from newest to oldest
valid = CombatLogAdvanceEntry(-1)
total = total + 1;
end
-- Show filtering progress bar
CombatLogQuickButtonFrameProgressBar:SetValue(CombatLogQuickButtonFrameProgressBar:GetValue() + total);
if ( not valid or (CombatLogQuickButtonFrameProgressBar:GetValue() >= COMBATLOG_MESSAGE_LIMIT) ) then
CombatLogUpdateFrame.refiltering = false
CombatLogUpdateFrame:SetScript("OnUpdate", nil)
CombatLogQuickButtonFrameProgressBar:Hide();
end
end
--
-- Checks for an event over all filters
--
function Blizzard_CombatLog_HasEvent ( settings, ... )
-- If this actually happens, we have data corruption issues.
if ( not settings.filters ) then
settings.filters = {}
end
for _, filter in pairs (settings.filters) do
if ( filter.eventList ) then
for i = 1, select("#", ...) do
local event = select(i, ...)
if ( filter.eventList[event] == true ) then
return true
end
end
end
end
end
--
-- Checks for an event over all filters
--
function Blizzard_CombatLog_EnableEvent ( settings, ... )
-- If this actually happens, we have data corruption issues.
if ( not settings.filters ) then
settings.filters = Blizzard_CombatLog_InitializeFilters( settings );
end
for _, filter in pairs (settings.filters) do
if ( not filter.eventList ) then
filter.eventList = {};
end
for i = 1, select("#", ...) do
filter.eventList[select(i, ...)] = true;
end
end
end
--
-- Checks for an event over all filters
--
function Blizzard_CombatLog_DisableEvent ( settings, ... )
-- If this actually happens, we have data corruption issues.
if ( not settings.filters ) then
settings.filters = {}
end
for _, filter in pairs (settings.filters) do
if ( filter.eventList ) then
for i = 1, select("#", ...) do
filter.eventList[select(i, ...)] = false;
end
end
end
end
--
-- Creates the action menu popup
--
do
local eventType
local actionMenu = {
[1] = {
text = "string.format(BLIZZARD_COMBAT_LOG_MENU_SPELL_HIDE, eventType)",
func = function () Blizzard_CombatLog_SpellMenuClick ("HIDE", nil, nil, eventType); end;
},
};
function Blizzard_CombatLog_CreateActionMenu(eventType_arg)
-- Update upvalues
eventType = eventType_arg
actionMenu[1].text = string.format(BLIZZARD_COMBAT_LOG_MENU_SPELL_HIDE, eventType_arg);
return actionMenu
end
end
--
-- Creates the spell menu popup
--
do
local spellName, spellId, eventType
local spellMenu = {
[1] = {
text = "string.format(BLIZZARD_COMBAT_LOG_MENU_SPELL_LINK, spellName)",
func = function () Blizzard_CombatLog_SpellMenuClick ("LINK", spellName, spellId, eventType); end;
},
};
local spellMenu2 = {
[2] = {
text = "string.format(BLIZZARD_COMBAT_LOG_MENU_SPELL_HIDE, eventType)",
func = function () Blizzard_CombatLog_SpellMenuClick ("HIDE", spellName, spellId, eventType); end;
},
[3] = {
text = "------------------";
disabled = true;
},
};
function Blizzard_CombatLog_CreateSpellMenu(spellName_arg, spellId_arg, eventType_arg)
-- Update upvalues
spellName, spellId, eventType = spellName_arg, spellId_arg, eventType_arg;
-- Update menu text and filters
spellMenu[1].text = string.format(BLIZZARD_COMBAT_LOG_MENU_SPELL_LINK, spellName);
if ( eventType ) then
spellMenu2[2].text = string.format(BLIZZARD_COMBAT_LOG_MENU_SPELL_HIDE, eventType);
-- Copy the table references over
spellMenu[2] = spellMenu2[2];
if ( DEBUG ) then
spellMenu[3] = spellMenu2[3];
-- These 2 calls update the menus in their respective do-end blocks
spellMenu[4] = Blizzard_CombatLog_FormattingMenu(Blizzard_CombatLog_Filters.currentFilter);
spellMenu[5] = Blizzard_CombatLog_MessageTypesMenu(Blizzard_CombatLog_Filters.currentFilter);
end
else
-- Remove the table references, they are still stored in their various closures
spellMenu[2] = nil;
spellMenu[3] = nil;
spellMenu[4] = nil;
spellMenu[5] = nil;
end
return spellMenu;
end
end
--
-- Temporary Menu
--
do
-- This big table currently only has one upvalue: Blizzard_CombatLog_CurrentSettings
local messageTypesMenu = {
text = "Message Types";
hasArrow = true;
menuList = {
[1] = {
text = "Melee";
hasArrow = true;
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SWING_DAMAGE", "SWING_MISSED"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SWING_DAMAGE", "SWING_MISSED" );
end;
menuList = {
[1] = {
text = "Damage";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SWING_DAMAGE");end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SWING_DAMAGE" );
end;
};
[2] = {
text = "Failure";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SWING_MISSED"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SWING_MISSED" );
end;
};
};
};
[2] = {
text = "Ranged";
hasArrow = true;
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "RANGE_DAMAGE", "RANGE_MISSED"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "RANGED_DAMAGE", "RANGED_MISSED" );
end;
menuList = {
[1] = {
text = "Damage";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "RANGE_DAMAGE"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "RANGE_DAMAGE" );
end;
};
[2] = {
text = "Failure";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "RANGE_MISSED"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "RANGE_MISSED" );
end;
};
};
};
[3] = {
text = "Spells";
hasArrow = true;
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SPELL_DAMAGE", "SPELL_MISSED", "SPELL_HEAL", "SPELL_ENERGIZE", "SPELL_DRAIN", "SPELL_LEECH", "SPELL_INTERRUPT", "SPELL_EXTRA_ATTACKS", "SPELL_CAST_START", "SPELL_CAST_SUCCESS", "SPELL_CAST_FAILED", "SPELL_INSTAKILL", "SPELL_DURABILITY_DAMAGE" ); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SPELL_DAMAGE", "SPELL_MISSED", "SPELL_HEAL", "SPELL_ENERGIZE", "SPELL_DRAIN", "SPELL_LEECH", "SPELL_INTERRUPT", "SPELL_EXTRA_ATTACKS", "SPELL_CAST_START", "SPELL_CAST_SUCCESS", "SPELL_CAST_FAILED", "SPELL_INSTAKILL", "SPELL_DURABILITY_DAMAGE" );
end;
menuList = {
[1] = {
text = "Damage";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SPELL_DAMAGE"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SPELL_DAMAGE" );
end;
};
[2] = {
text = "Failure";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SPELL_MISSED"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SPELL_MISSED" );
end;
};
[3] = {
text = "Heals";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SPELL_HEAL"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SPELL_HEAL" );
end;
};
[4] = {
text = "Power Gains";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SPELL_ENERGIZE"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SPELL_ENERGIZE" );
end;
};
[4] = {
text = "Drains";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SPELL_DRAIN", "SPELL_LEECH"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SPELL_DRAIN", "SPELL_LEECH" );
end;
};
[5] = {
text = "Interrupts";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SPELL_INTERRUPT"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SPELL_INTERRUPT" );
end;
};
[6] = {
text = "Extra Attacks";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SPELL_EXTRA_ATTACKS"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SPELL_EXTRA_ATTACKS" );
end;
};
[7] = {
text = "Casting";
hasArrow = true;
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SPELL_CAST_START", "SPELL_CAST_SUCCESS", "SPELL_CAST_FAILED"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SPELL_CAST_START", "SPELL_CAST_SUCCESS", "SPELL_CAST_FAILED");
end;
menuList = {
[1] = {
text = "Start";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SPELL_CAST_START"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SPELL_CAST_START" );
end;
};
[2] = {
text = "Success";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SPELL_CAST_SUCCESS"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SPELL_CAST_SUCCESS" );
end;
};
[3] = {
text = "Failed";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SPELL_CAST_FAILED"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SPELL_CAST_FAILED" );
end;
};
};
};
[8] = {
text = "Special";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SPELL_INSTAKILL", "SPELL_DURABILITY_DAMAGE"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SPELL_INSTAKILL", "SPELL_DURABILITY_DAMAGE" );
end;
};
};
};
[4] = {
text = "Auras";
hasArrow = true;
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SPELL_AURA_APPLIED", "SPELL_AURA_BROKEN", "SPELL_AURA_REFRESH", "SPELL_AURA_BROKEN_SPELL", "SPELL_AURA_APPLIED_DOSE", "SPELL_AURA_REMOVED", "SPELL_AURA_REMOVED_DOSE", "SPELL_DISPEL", "SPELL_STOLEN", "ENCHANT_APPLIED", "ENCHANT_REMOVED" ); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SPELL_AURA_APPLIED", "SPELL_AURA_BROKEN", "SPELL_AURA_REFRESH", "SPELL_AURA_BROKEN_SPELL", "SPELL_AURA_APPLIED_DOSE", "SPELL_AURA_REMOVED", "SPELL_AURA_REMOVED_DOSE", "SPELL_DISPEL", "SPELL_STOLEN", "ENCHANT_APPLIED", "ENCHANT_REMOVED" );
end;
menuList = {
[1] = {
text = "Applied";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SPELL_AURA_APPLIED", "SPELL_AURA_BROKEN", "SPELL_AURA_REFRESH", "SPELL_AURA_BROKEN_SPELL", "SPELL_AURA_APPLIED_DOSE"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SPELL_AURA_APPLIED", "SPELL_AURA_BROKEN", "SPELL_AURA_REFRESH", "SPELL_AURA_BROKEN_SPELL", "SPELL_AURA_APPLIED_DOSE", "ENCHANT_APPLIED" );
end;
};
[2] = {
text = "Removed";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SPELL_AURA_REMOVED", "SPELL_AURA_REMOVED_DOSE", "ENCHANT_REMOVED" ); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SPELL_AURA_REMOVED", "SPELL_AURA_REMOVED_DOSE" );
end;
};
[3] = {
text = "Dispelled";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SPELL_DISPEL"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SPELL_DISPEL" );
end;
};
[4] = {
text = "Stolen";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SPELL_STOLEN"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SPELL_STOLEN" );
end;
};
};
};
[5] = {
text = "Periodics";
hasArrow = true;
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SPELL_PERIODIC_DAMAGE", "SPELL_PERIODIC_MISSED", "SPELL_PERIODIC_DRAIN", "SPELL_PERIODIC_ENERGIZE", "SPELL_PERIODIC_HEAL", "SPELL_PERIODIC_LEECH" ); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SPELL_PERIODIC_DAMAGE", "SPELL_PERIODIC_MISSED", "SPELL_PERIODIC_DRAIN", "SPELL_PERIODIC_ENERGIZE", "SPELL_PERIODIC_HEAL", "SPELL_PERIODIC_LEECH" );
end;
menuList = {
[1] = {
text = "Damage";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SPELL_PERIODIC_DAMAGE"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SPELL_PERIODIC_DAMAGE" );
end;
};
[2] = {
text = "Failure";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SPELL_PERIODIC_MISSED" ); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SPELL_PERIODIC_MISSED" );
end;
};
[3] = {
text = "Heals";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SPELL_PERIODIC_HEAL"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SPELL_PERIODIC_HEAL" );
end;
};
[4] = {
text = "Other";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "SPELL_PERIODIC_DRAIN", "SPELL_PERIODIC_ENERGIZE", "SPELL_PERIODIC_LEECH"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "SPELL_PERIODIC_DRAIN", "SPELL_PERIODIC_ENERGIZE", "SPELL_PERIODIC_LEECH" );
end;
};
};
};
[6] = {
text = "Other";
hasArrow = true;
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "PARTY_KILL", "UNIT_DIED", "UNIT_DESTROYED", "DAMAGE_SPLIT", "ENVIRONMENTAL_DAMAGE" ); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "PARTY_KILL", "UNIT_DIED", "UNIT_DESTROYED", "DAMAGE_SPLIT", "ENVIRONMENTAL_DAMAGE" );
end;
menuList = {
[1] = {
text = "Kills";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "PARTY_KILL"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "PARTY_KILL" );
end;
};
[2] = {
text = "Deaths";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "UNIT_DIED", "UNIT_DESTROYED"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "UNIT_DIED", "UNIT_DESTROYED" );
end;
};
[3] = {
text = "Damage Split";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "DAMAGE_SPLIT"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "DAMAGE_SPLIT" );
end;
};
[4] = {
text = "Environmental Damage";
checked = function() return Blizzard_CombatLog_HasEvent (Blizzard_CombatLog_CurrentSettings, "ENVIRONMENTAL_DAMAGE"); end;
keepShownOnClick = true;
func = function ( self, arg1, arg2, checked )
Blizzard_CombatLog_MenuHelper ( checked, "ENVIRONMENTAL_DAMAGE" );
end;
};
};
};
};
};
-- functions I see do pass in arguments, update upvalues as necessary.
function Blizzard_CombatLog_MessageTypesMenu()
return messageTypesMenu;
end
end
--
-- Temporary Menu
--
do
local filterId
local filter
local currentFilter
local formattingMenu = {
text = "Formatting";
hasArrow = true;
menuList = {
{
text = "Full Text";
checked = function() return filter.fullText; end;
func = function(self, arg1, arg2, checked)
filter.fullText = checked;
Blizzard_CombatLog_QuickButton_OnClick(currentFilter)
end;
keepShownOnClick = true;
},
{
text = "Timestamp";
checked = function() return filter.timestamp; end;
func = function(self, arg1, arg2, checked)
filter.timestamp = checked;
Blizzard_CombatLog_QuickButton_OnClick(currentFilter)
end;
keepShownOnClick = true;
},
{
text = "Unit Name Coloring";
checked = function() return filter.unitColoring; end;
func = function(self, arg1, arg2, checked)
filter.unitColoring = checked;
Blizzard_CombatLog_QuickButton_OnClick(currentFilter)
end;
keepShownOnClick = true;
},
{
text = "Line Coloring";
checked = function() return filter.lineColoring; end;
func = function(self, arg1, arg2, checked)
filter.lineColoring = checked;
Blizzard_CombatLog_QuickButton_OnClick(currentFilter)
end;
keepShownOnClick = true;
},
{
text = "Line Highlighting";
checked = function() return filter.lineHighlighting; end;
func = function(self, arg1, arg2, checked)
filter.lineHighlighting = checked;
Blizzard_CombatLog_QuickButton_OnClick(currentFilter)
end;
keepShownOnClick = true;
},
{
text = "Ability Coloring";
checked = function() return filter.abilityColoring; end;
func = function(self, arg1, arg2, checked)
filter.abilityColoring = checked;
Blizzard_CombatLog_QuickButton_OnClick(currentFilter)
end;
keepShownOnClick = true;
},
{
text = "Ability-by-School Coloring";
checked = function() return filter.abilitySchoolColoring; end;
--disabled = not filter.abilityColoring;
func = function(self, arg1, arg2, checked)
filter.abilitySchoolColoring = checked;
Blizzard_CombatLog_QuickButton_OnClick(currentFilter)
end;
keepShownOnClick = true;
},
{
text = "Ability-by-Actor Coloring";
checked = function() return filter.abilityActorColoring; end;
func = function(self, arg1, arg2, checked)
filter.abilityActorColoring = checked;
Blizzard_CombatLog_QuickButton_OnClick(currentFilter)
end;
keepShownOnClick = true;
},
{
text = "Ability Highlighting";
checked = function() return filter.abilityHighlighting; end;
func = function(self, arg1, arg2, checked)
filter.abilityHighlighting = checked;
Blizzard_CombatLog_QuickButton_OnClick(currentFilter)
end;
keepShownOnClick = true;
},
{
text = "Action Coloring";
checked = function() return filter.actionColoring; end;
func = function(self, arg1, arg2, checked)
filter.actionColoring = checked;
Blizzard_CombatLog_QuickButton_OnClick(currentFilter)
end;
keepShownOnClick = true;
},
{
text = "Action-by-School Coloring";
checked = function() return filter.actionSchoolColoring; end;
func = function(self, arg1, arg2, checked)
filter.actionSchoolColoring = checked;
Blizzard_CombatLog_QuickButton_OnClick(currentFilter)
end;
keepShownOnClick = true;
},
{
text = "Action-by-Actor Coloring";
checked = function() return filter.actionActorColoring; end;
--disabled = not filter.abilityColoring;
func = function(self, arg1, arg2, checked)
filter.actionActorColoring = checked;
Blizzard_CombatLog_QuickButton_OnClick(currentFilter)
end;
keepShownOnClick = true;
},
{
text = "Action Highlighting";
checked = function() return filter.actionHighlighting; end;
--disabled = not filter.abilityColoring;
func = function(self, arg1, arg2, checked)
filter.actionHighlighting = checked;
Blizzard_CombatLog_QuickButton_OnClick(currentFilter)
end;
keepShownOnClick = true;
},
{
text = "Damage Coloring";
checked = function() return filter.amountColoring; end;
func = function(self, arg1, arg2, checked)
filter.amountColoring = checked;
Blizzard_CombatLog_QuickButton_OnClick(currentFilter)
end;
keepShownOnClick = true;
},
{
text = "Damage-by-School Coloring";
checked = function() return filter.amountSchoolColoring; end;
--disabled = not filter.amountColoring;
func = function(self, arg1, arg2, checked)
filter.amountSchoolColoring = checked;
Blizzard_CombatLog_QuickButton_OnClick(currentFilter)
end;
keepShownOnClick = true;
},
{
text = "Damage-by-Actor Coloring";
checked = function() return filter.amountActorColoring; end;
--disabled = not filter.amountColoring;
func = function(self, arg1, arg2, checked)
filter.amountActorColoring = checked;
Blizzard_CombatLog_QuickButton_OnClick(currentFilter)
end;
keepShownOnClick = true;
},
{
text = "Damage Highlighting";
checked = function() return filter.amountHighlighting; end;
func = function(self, arg1, arg2, checked)
filter.amountHighlighting = checked;
Blizzard_CombatLog_QuickButton_OnClick(currentFilter)
end;
keepShownOnClick = true;
},
{
text = "Color School Names";
checked = function() return filter.schoolNameColoring; end;
func = function(self, arg1, arg2, checked)
filter.schoolNameColoring = checked;
Blizzard_CombatLog_QuickButton_OnClick(currentFilter)
end;
keepShownOnClick = true;
},
{
text = "School Name Highlighting";
checked = function() return filter.schoolNameHighlighting; end;
func = function(self, arg1, arg2, checked)
filter.schoolNameHighlighting = checked;
Blizzard_CombatLog_QuickButton_OnClick(currentFilter)
end;
keepShownOnClick = true;
},
{
text = "White Swing Rule";
checked = function() return filter.noMeleeSwingColoring; end;
func = function(self, arg1, arg2, checked)
filter.noMeleeSwingColoring = checked;
Blizzard_CombatLog_QuickButton_OnClick(currentFilter)
end;
keepShownOnClick = true;
},
{
text = "Misses Colored Rule";
checked = function() return filter.missColoring; end;
func = function(self, arg1, arg2, checked)
filter.missColoring = checked;
Blizzard_CombatLog_QuickButton_OnClick(currentFilter)
end;
keepShownOnClick = true;
},
{
text = "Braces";
checked = function() return filter.braces; end;
func = function(self, arg1, arg2, checked)
filter.braces = checked;
Blizzard_CombatLog_QuickButton_OnClick(currentFilter)
end;
keepShownOnClick = true;
},
{
text = "Refiltering";
checked = function() return filter.showHistory; end;
func = function(self, arg1, arg2, checked)
filter.showHistory = checked;
Blizzard_CombatLog_QuickButton_OnClick(currentFilter)
end;
keepShownOnClick = true;
tooltipTitle = "Refiltering";
tooltipText = "This clears the chat frame and refills it with the last 500 events.";
},
};
};
function Blizzard_CombatLog_FormattingMenu(filterId_arg)
-- Update upvalues
filterId = filterId_arg;
filter = Blizzard_CombatLog_Filters.filters[filterId].settings;
currentFilter = Blizzard_CombatLog_Filters.currentFilter;
return formattingMenu;
end
end
--
-- Menu Option Helper Function
--
function Blizzard_CombatLog_MenuHelper ( checked, ... )
if ( not checked ) then
Blizzard_CombatLog_DisableEvent (Blizzard_CombatLog_CurrentSettings, ...);
else
Blizzard_CombatLog_EnableEvent (Blizzard_CombatLog_CurrentSettings, ...);
end
Blizzard_CombatLog_ApplyFilters(Blizzard_CombatLog_CurrentSettings);
if ( Blizzard_CombatLog_CurrentSettings.settings.showHistory ) then
Blizzard_CombatLog_Refilter();
end
end;
--
-- Blizzard_CombatLog_CreateTabMenu
--
-- Creates a context sensitive menu based on the current quick button
--
-- args:
-- settingsIndex - the filter settings to use
--
do
local filterId
local unitName, unitGUID, special
local tabMenu = {
[1] = {
text = BLIZZARD_COMBAT_LOG_MENU_EVERYTHING;
func = function () Blizzard_CombatLog_UnitMenuClick ("EVERYTHING", unitName, unitGUID, special); end;
},
[2] = {
text = BLIZZARD_COMBAT_LOG_MENU_SAVE;
func = function () Blizzard_CombatLog_UnitMenuClick ("SAVE", unitName, unitGUID, special); end;
},
[3] = {
text = BLIZZARD_COMBAT_LOG_MENU_RESET;
func = function () Blizzard_CombatLog_UnitMenuClick ("RESET", unitName, unitGUID, special); end;
},
[4] = {
text = "--------- Temporary Adjustments ---------";
disabled = true;
},
};
function Blizzard_CombatLog_CreateTabMenu ( filterId_arg )
-- Update upvalues
filterId = filterId_arg
-- Update menus
tabMenu[2].disabled = (Blizzard_CombatLog_PreviousSettings == Blizzard_CombatLog_CurrentSettings)
tabMenu[5] = Blizzard_CombatLog_FormattingMenu(filterId);
tabMenu[6] = Blizzard_CombatLog_MessageTypesMenu(filterId);
return tabMenu;
end
end
--
-- Temporary Menu
--
do
function Blizzard_CombatLog_CreateUnitMenu(unitName, unitGUID, special)
local displayName = unitName;
if ( (unitGUID == UnitGUID("player")) and (getglobal("COMBAT_LOG_UNIT_YOU_ENABLED") == "1") ) then
displayName = UNIT_YOU;
end
local unitMenu = {
[1] = {
text = string.format(BLIZZARD_COMBAT_LOG_MENU_BOTH, displayName); -- Dummy text
func = function () Blizzard_CombatLog_UnitMenuClick ("BOTH", unitName, unitGUID, special); end;
},
[2] = {
text = string.format(BLIZZARD_COMBAT_LOG_MENU_INCOMING, displayName);
func = function () Blizzard_CombatLog_UnitMenuClick ("INCOMING", unitName, unitGUID, special); end;
},
[3] = {
text = string.format(BLIZZARD_COMBAT_LOG_MENU_OUTGOING, displayName);
func = function () Blizzard_CombatLog_UnitMenuClick ("OUTGOING", unitName, unitGUID, special); end;
},
[4] = {
text = "------------------";
disabled = true;
},
[5] = {
text = BLIZZARD_COMBAT_LOG_MENU_EVERYTHING;
func = function () Blizzard_CombatLog_UnitMenuClick ("EVERYTHING", unitName, unitGUID, special); end;
},
[6] = {
text = BLIZZARD_COMBAT_LOG_MENU_SAVE;
func = function () Blizzard_CombatLog_UnitMenuClick ("SAVE", unitName, unitGUID, special); end;
disabled = not CanCreateFilters();
},
[7] = {
text = BLIZZARD_COMBAT_LOG_MENU_RESET;
func = function () Blizzard_CombatLog_UnitMenuClick ("RESET", unitName, unitGUID, special); end;
},
};
--[[
-- These 2 calls update the menus in their respective do-end blocks
unitMenu[9] = Blizzard_CombatLog_FormattingMenu(Blizzard_CombatLog_Filters.currentFilter);
unitMenu[10] = Blizzard_CombatLog_MessageTypesMenu(Blizzard_CombatLog_Filters.currentFilter);
]]
if ( unitGUID ~= UnitGUID("player") ) then
table.insert(unitMenu, 4, {
text = string.format(BLIZZARD_COMBAT_LOG_MENU_OUTGOING_ME, displayName);
func = function () Blizzard_CombatLog_UnitMenuClick ("OUTGOING_ME", unitName, unitGUID, special); end;
} );
end
return unitMenu
end
end
-- Create additional filter dropdown list
do
local menu = {};
function Blizzard_CombatLog_CreateFilterMenu()
local count = 1;
for index, value in pairs(menu) do
if ( not value ) then
value = {};
else
for k, v in pairs(value) do
value[k] = nil;
end
end
end
local selectedIndex = Blizzard_CombatLog_Filters.currentFilter;
local checked;
for index, value in ipairs(Blizzard_CombatLog_Filters.filters) do
if ( not value.onQuickBar ) then
if ( not menu[count] ) then
menu[count] = {};
end
menu[count].text = value.name;
menu[count].func = function () Blizzard_CombatLog_QuickButton_OnClick(index); end;
if ( selectedIndex == index ) then
checked = 1;
else
checked = nil;
end
menu[count].checked = checked;
count = count+1;
end
end
return menu;
end
end
--
-- Handle mini menu clicks
--
-- args:
-- event - "EVERYTHING" | "RESET" | "INCOMING" | "OUTGOING" | "BOTH"
-- unitName - string for the units name
-- unitGUID - unique global unit ID for the specific unit
-- special - bit code for special filters, such as raid targets
--
function Blizzard_CombatLog_UnitMenuClick(event, unitName, unitGUID, unitFlags)
-- ChatFrame1:AddMessage("Event: "..event.." N: "..tostring(unitName).." GUID: "..tostring(unitGUID).." Flags: "..tostring(unitFlags));
--
-- This code was for the context menus to support different formatting criteria
--
-- -- Apply the correct settings.
-- if ( Blizzard_CombatLog_Filters.contextMenu[event] ) then
-- Blizzard_CombatLog_CurrentSettings = Blizzard_CombatLog_Filters.contextMenu[event]
-- end
-- I'm not sure if we really want this feature for live
if ( event == "REVERT" ) then
local temp = Blizzard_CombatLog_CurrentSettings;
Blizzard_CombatLog_CurrentSettings = Blizzard_CombatLog_PreviousSettings;
Blizzard_CombatLog_PreviousSettings = temp;
temp = nil;
-- Apply the old filters
Blizzard_CombatLog_ApplyFilters(Blizzard_CombatLog_CurrentSettings);
elseif ( event == "SAVE" ) then
local dialog = StaticPopup_Show("COPY_COMBAT_FILTER");
dialog.data = Blizzard_CombatLog_CurrentSettings;
return;
elseif ( event == "RESET" ) then
Blizzard_CombatLog_PreviousSettings = Blizzard_CombatLog_CurrentSettings;
Blizzard_CombatLog_CurrentSettings = Blizzard_CombatLog_Filters.filters[Blizzard_CombatLog_Filters.currentFilter];
Blizzard_CombatLog_ApplyFilters(Blizzard_CombatLog_CurrentSettings);
else
-- Copy the current settings
Blizzard_CombatLog_PreviousSettings = Blizzard_CombatLog_CurrentSettings;
Blizzard_CombatLog_CurrentSettings = {};
for k,v in pairs( Blizzard_CombatLog_PreviousSettings ) do
Blizzard_CombatLog_CurrentSettings[k] = v;
end
-- Erase the filter criteria
Blizzard_CombatLog_CurrentSettings.filters = {}; -- We want to be careful not to destroy the active data, so the user can reset
if ( event == "EVERYTHING" ) then
-- Reset all filtering.
CombatLogResetFilter()
--Blizzard_CombatLog_CurrentSettings = Blizzard_CombatLog_Filters.contextMenu[event];
CombatLogAddFilter(nil, nil, nil)
tinsert ( Blizzard_CombatLog_CurrentSettings.filters, {} );
end
if ( event == "INCOMING" or event == "BOTH" ) then
if ( unitFlags ) then
tinsert ( Blizzard_CombatLog_CurrentSettings.filters, { destFlags = { [unitFlags] = true; } } );
else
tinsert ( Blizzard_CombatLog_CurrentSettings.filters, { destFlags = { [unitGUID] = true; } } );
end
end
if ( event == "OUTGOING" or event == "BOTH" ) then
if ( unitFlags ) then
tinsert ( Blizzard_CombatLog_CurrentSettings.filters, { sourceFlags = { [unitFlags] = true; } } );
else
tinsert ( Blizzard_CombatLog_CurrentSettings.filters, { sourceFlags = { [unitGUID] = true; } } );
end
end
if ( event == "OUTGOING_ME" ) then
if ( unitFlags ) then
tinsert ( Blizzard_CombatLog_CurrentSettings.filters, { sourceFlags = { [unitFlags] = true; }; destFlags = { [COMBATLOG_FILTER_MINE] = true; } } );
else
tinsert ( Blizzard_CombatLog_CurrentSettings.filters, { sourceFlags = { [unitGUID] = true; }; destFlags = { [COMBATLOG_FILTER_MINE] = true; } } );
end
end
-- If the context menu is not resetting, then we need to create an event list,
-- So that right click removal works when the user right clicks
--
-- Fill the event list
local fullEventList = Blizzard_CombatLog_GenerateFullEventList();
-- Insert to the active data
for k,v in pairs (Blizzard_CombatLog_CurrentSettings.filters) do
v.eventList = fullEventList;
end
-- Apply the generated filters
Blizzard_CombatLog_ApplyFilters(Blizzard_CombatLog_CurrentSettings);
-- Let the system know that this filter is temporary and unhighlight any quick buttons
Blizzard_CombatLog_CurrentSettings.isTemp = true;
Blizzard_CombatLog_Update_QuickButtons()
end
-- Reset the combat log text box! (Grats!)
Blizzard_CombatLog_Refilter();
end
--
-- Shows a simplified version of the menu if you right click on the quick button
--
-- This function isn't used anywhere yet. The QuickButtons doesn't have a event handler for right click yet.
function Blizzard_CombatLog_QuickButtonRightClick(event, filterId)
-- I'm not sure if we really want this feature for live
if ( event == "REVERT" ) then
local temp = Blizzard_CombatLog_CurrentSettings;
Blizzard_CombatLog_CurrentSettings = Blizzard_CombatLog_PreviousSettings;
Blizzard_CombatLog_PreviousSettings = temp;
temp = nil;
-- Apply the old filters
Blizzard_CombatLog_ApplyFilters(Blizzard_CombatLog_CurrentSettings);
elseif ( event == "RESET" ) then
Blizzard_CombatLog_PreviousSettings = Blizzard_CombatLog_CurrentSettings;
Blizzard_CombatLog_CurrentSettings = Blizzard_CombatLog_Filters.filters[filterId];
--CombatLogAddFilter(nil, nil, COMBATLOG_FILTER_MINE)
--CombatLogAddFilter(nil, COMBATLOG_FILTER_MINE, nil)
else
-- Copy the current settings
Blizzard_CombatLog_PreviousSettings = Blizzard_CombatLog_CurrentSettings;
Blizzard_CombatLog_CurrentSettings = {};
for k,v in pairs( Blizzard_CombatLog_Filters.filters[filterId] ) do
Blizzard_CombatLog_CurrentSettings[k] = v;
end
-- Erase the filter criteria
Blizzard_CombatLog_CurrentSettings.filters = {}; -- We want to be careful not to destroy the active data, so the user can reset
if ( event == "EVERYTHING" ) then
CombatLogAddFilter(nil, nil, nil)
table.insert ( Blizzard_CombatLog_CurrentSettings.filters, {} );
end
-- If the context menu is not resetting, then we need to create an event list,
-- So that right click removal works when the user right clicks
--
-- Fill the event list
local fullEventList = Blizzard_CombatLog_GenerateFullEventList();
-- Insert to the active data
for k,v in pairs (Blizzard_CombatLog_CurrentSettings.filters) do
v.eventList = fullEventList;
end
-- Apply the generated filters
Blizzard_CombatLog_ApplyFilters(Blizzard_CombatLog_CurrentSettings);
end
-- Reset the combat log text box! (Grats!)
Blizzard_CombatLog_Refilter();
end
--
-- Handle spell mini menu clicks
-- args:
-- action - "HIDE" | "LINK"
-- spellName - Spell or ability's name
-- spellId - Spell or ability's id (100, 520, 30000, etc)
-- event - the event type that generated this message
--
function Blizzard_CombatLog_SpellMenuClick(action, spellName, spellId, eventType)
if ( action == "HIDE" ) then
for k,v in pairs (Blizzard_CombatLog_CurrentSettings.filters) do
if ( type (v.eventList) ~= "table" ) then
v.eventList = Blizzard_CombatLog_GenerateFullEventList();
end
v.eventList[eventType] = false;
end
elseif ( action == "LINK" ) then
if ( ChatFrameEditBox:IsVisible() ) then
ChatEdit_InsertLink(GetSpellLink(spellId));
else
ChatFrame_OpenChat(GetSpellLink(spellId));
end
return;
end
-- Apply the newly reconstituted filters
Blizzard_CombatLog_ApplyFilters(Blizzard_CombatLog_CurrentSettings);
-- Reset the combat log text box! (Grats!)
Blizzard_CombatLog_Refilter();
end
--
-- Temporary Settings
--
Blizzard_CombatLog_CurrentSettings = Blizzard_CombatLog_Filters.filters[1];
Blizzard_CombatLog_PreviousSettings = Blizzard_CombatLog_CurrentSettings;
local Blizzard_CombatLog_UnitTokens = {};
--[[
-- Converts 4 floats into FF code
--
--]]
local function CombatLog_Color_FloatToText(r,g,b,a)
if ( type(r) == "table" ) then
r, g, b, a = r.r, r.g, r.b, r.a;
end
a = min(1, a or 1) * 255
r = min(1, r) * 255
g = min(1, g) * 255
b = min(1, b) * 255
-- local fmt = "%.2x";
return ("%.2x%.2x%.2x%.2x"):format(math_floor(a), math_floor(r), math_floor(g), math_floor(b))
end
_G.CombatLog_Color_FloatToText = CombatLog_Color_FloatToText
--
-- Gets the appropriate color for an event type
--
-- If this needs to return a new table per event (ie, the table gets modified), then just replace the "defaultColorArray" in the function with
-- a new table creation.
local defaultColorArray = {a=1.0,r=0.5,g=0.5,b=0.5}
local function CombatLog_Color_ColorArrayByEventType( event )
return Blizzard_CombatLog_CurrentSettings.colors.eventColoring[event] or defaultColorArray
end
_G.CombatLog_Color_ColorArrayByEventType = CombatLog_Color_ColorArrayByEventType
--
-- Gets the appropriate color for a unit type
--
local function CombatLog_Color_ColorArrayByUnitType(unitFlags, settings)
local array = nil;
if ( not settings ) then
settings = Blizzard_CombatLog_CurrentSettings;
end
for mask,colorArray in pairs( settings.colors.unitColoring ) do
if ( CombatLog_Object_IsA (unitFlags, mask) )then
array = colorArray;
break;
end
end
return array or defaultColorArray
end
_G.CombatLog_Color_ColorArrayByUnitType = CombatLog_Color_ColorArrayByUnitType
--
-- Gets the appropriate color for a spell school
--
local function CombatLog_Color_ColorArrayBySchool(school, settings)
if ( not settings ) then
settings = Blizzard_CombatLog_CurrentSettings;
end
if ( not school ) then
return settings.colors.schoolColoring.default;
end
return settings.colors.schoolColoring[school] or defaultColorArray
end
_G.CombatLog_Color_ColorArrayBySchool = CombatLog_Color_ColorArrayBySchool
--
-- Gets the appropriate color for a spell school
--
local highlightColorTable = {}
local function CombatLog_Color_HighlightColorArray(colorArray)
highlightColorTable.r = colorArray.r * COMBATLOG_HIGHLIGHT_MULTIPLIER;
highlightColorTable.g = colorArray.g * COMBATLOG_HIGHLIGHT_MULTIPLIER;
highlightColorTable.b = colorArray.b * COMBATLOG_HIGHLIGHT_MULTIPLIER;
highlightColorTable.a = colorArray.a;
return highlightColorTable
end
_G.CombatLog_Color_HighlightColorArray = CombatLog_Color_HighlightColorArray
--
-- Returns a string associated with a numeric power type
--
local function CombatLog_String_PowerType(powerType)
if ( not powerType ) then
return "";
elseif ( powerType == SPELL_POWER_MANA ) then
return MANA;
elseif ( powerType == SPELL_POWER_RAGE ) then
return RAGE;
elseif ( powerType == SPELL_POWER_ENERGY ) then
return ENERGY;
elseif ( powerType == SPELL_POWER_FOCUS ) then
return FOCUS;
elseif ( powerType == SPELL_POWER_HAPPINESS ) then
return HAPPINESS;
elseif ( powerType == SPELL_POWER_RUNES ) then
return RUNES;
elseif ( powerType == SPELL_POWER_RUNIC_POWER ) then
return RUNIC_POWER;
end
end
_G.CombatLog_String_PowerType = CombatLog_String_PowerType
local SCHOOL_STRINGS = {
STRING_SCHOOL_PHYSICAL,
STRING_SCHOOL_HOLY,
STRING_SCHOOL_FIRE,
STRING_SCHOOL_NATURE,
STRING_SCHOOL_FROST,
STRING_SCHOOL_SHADOW,
STRING_SCHOOL_ARCANE
}
local SchoolStringTable = {
-- Single Schools
[SCHOOL_MASK_PHYSICAL] = STRING_SCHOOL_PHYSICAL,
[SCHOOL_MASK_HOLY] = STRING_SCHOOL_HOLY,
[SCHOOL_MASK_FIRE] = STRING_SCHOOL_FIRE,
[SCHOOL_MASK_NATURE] = STRING_SCHOOL_NATURE,
[SCHOOL_MASK_FROST] = STRING_SCHOOL_FROST,
[SCHOOL_MASK_SHADOW] = STRING_SCHOOL_SHADOW,
[SCHOOL_MASK_ARCANE] = STRING_SCHOOL_ARCANE,
-- Physical and a Magical
[SCHOOL_MASK_PHYSICAL + SCHOOL_MASK_FIRE] = STRING_SCHOOL_FLAMESTRIKE,
[SCHOOL_MASK_PHYSICAL + SCHOOL_MASK_FROST] = STRING_SCHOOL_FROSTSTRIKE,
[SCHOOL_MASK_PHYSICAL + SCHOOL_MASK_ARCANE] = STRING_SCHOOL_SPELLSTRIKE,
[SCHOOL_MASK_PHYSICAL + SCHOOL_MASK_NATURE] = STRING_SCHOOL_STORMSTRIKE,
[SCHOOL_MASK_PHYSICAL + SCHOOL_MASK_SHADOW] = STRING_SCHOOL_SHADOWSTRIKE,
[SCHOOL_MASK_PHYSICAL + SCHOOL_MASK_HOLY] = STRING_SCHOOL_HOLYSTRIKE,
-- Two Magical Schools
[SCHOOL_MASK_FIRE + SCHOOL_MASK_FROST] = STRING_SCHOOL_FROSTFIRE,
[SCHOOL_MASK_FIRE + SCHOOL_MASK_ARCANE] = STRING_SCHOOL_SPELLFIRE,
[SCHOOL_MASK_FIRE + SCHOOL_MASK_NATURE] = STRING_SCHOOL_FIRESTORM,
[SCHOOL_MASK_FIRE + SCHOOL_MASK_SHADOW] = STRING_SCHOOL_SHADOWFLAME,
[SCHOOL_MASK_FIRE + SCHOOL_MASK_HOLY] = STRING_SCHOOL_HOLYFIRE,
[SCHOOL_MASK_FROST + SCHOOL_MASK_ARCANE] = STRING_SCHOOL_SPELLFROST,
[SCHOOL_MASK_FROST + SCHOOL_MASK_NATURE] = STRING_SCHOOL_FROSTSTORM,
[SCHOOL_MASK_FROST + SCHOOL_MASK_SHADOW] = STRING_SCHOOL_SHADOWFROST,
[SCHOOL_MASK_FROST + SCHOOL_MASK_HOLY] = STRING_SCHOOL_HOLYFROST,
[SCHOOL_MASK_ARCANE + SCHOOL_MASK_NATURE] = STRING_SCHOOL_SPELLSTORM,
[SCHOOL_MASK_ARCANE + SCHOOL_MASK_SHADOW] = STRING_SCHOOL_SPELLSHADOW,
[SCHOOL_MASK_ARCANE + SCHOOL_MASK_HOLY] = STRING_SCHOOL_DIVINE,
[SCHOOL_MASK_NATURE + SCHOOL_MASK_SHADOW] = STRING_SCHOOL_SHADOWSTORM,
[SCHOOL_MASK_NATURE + SCHOOL_MASK_HOLY] = STRING_SCHOOL_HOLYSTORM,
[SCHOOL_MASK_SHADOW + SCHOOL_MASK_HOLY] = STRING_SCHOOL_SHADOWLIGHT,
-- Three or more schools
[SCHOOL_MASK_FIRE + SCHOOL_MASK_FROST + SCHOOL_MASK_NATURE] = STRING_SCHOOL_ELEMENTAL,
[SCHOOL_MASK_FIRE + SCHOOL_MASK_FROST + SCHOOL_MASK_ARCANE + SCHOOL_MASK_NATURE + SCHOOL_MASK_SHADOW] = STRING_SCHOOL_CHROMATIC,
[SCHOOL_MASK_FIRE + SCHOOL_MASK_FROST + SCHOOL_MASK_ARCANE + SCHOOL_MASK_NATURE + SCHOOL_MASK_SHADOW + SCHOOL_MASK_HOLY] = STRING_SCHOOL_MAGIC,
[SCHOOL_MASK_PHYSICAL + SCHOOL_MASK_FIRE + SCHOOL_MASK_FROST + SCHOOL_MASK_ARCANE + SCHOOL_MASK_NATURE + SCHOOL_MASK_SHADOW + SCHOOL_MASK_HOLY] = STRING_SCHOOL_CHAOS,
};
local function CombatLog_String_SchoolString(school)
if ( not school or school == SCHOOL_MASK_NONE ) then
return STRING_SCHOOL_UNKNOWN;
end
local schoolString = SchoolStringTable[school];
return schoolString or STRING_SCHOOL_UNKNOWN
end
_G.CombatLog_String_SchoolString = CombatLog_String_SchoolString
local function CombatLog_String_DamageResultString( resisted, blocked, absorbed, critical, glancing, crushing, overhealing, textMode, spellId )
local resultStr;
-- Result String formatting
local useOverhealing = overhealing and overhealing > 0;
if ( resisted or blocked or absorbed or critical or glancing or crushing or useOverhealing ) then
resultStr = nil;
local tMode = "TEXT_MODE_"..textMode;
if ( resisted ) then
resultStr = format(TEXT_MODE_A_STRING_RESULT_RESIST, resisted);
end
if ( blocked ) then
if ( resultStr ) then
resultStr = resultStr.." "..format(TEXT_MODE_A_STRING_RESULT_BLOCK, blocked);
else
resultStr = format(TEXT_MODE_A_STRING_RESULT_BLOCK, blocked);
end
end
if ( absorbed ) then
if ( resultStr ) then
resultStr = resultStr.." "..format(TEXT_MODE_A_STRING_RESULT_ABSORB, absorbed);
else
resultStr = format(TEXT_MODE_A_STRING_RESULT_ABSORB, absorbed);
end
end
if ( glancing ) then
if ( resultStr ) then
resultStr = resultStr.." "..TEXT_MODE_A_STRING_RESULT_GLANCING;
else
resultStr = TEXT_MODE_A_STRING_RESULT_GLANCING;
end
end
if ( crushing ) then
if ( resultStr ) then
resultStr = resultStr.." "..TEXT_MODE_A_STRING_RESULT_CRUSHING;
else
resultStr = TEXT_MODE_A_STRING_RESULT_CRUSHING;
end
end
if ( useOverhealing ) then
if ( resultStr ) then
resultStr = resultStr.." "..format(TEXT_MODE_A_STRING_RESULT_OVERHEALING, overhealing);
else
resultStr = format(TEXT_MODE_A_STRING_RESULT_OVERHEALING, overhealing);
end
end
if ( critical ) then
local critString = TEXT_MODE_A_STRING_RESULT_CRITICAL;
if ( spellId ) then
critString = TEXT_MODE_A_STRING_RESULT_CRITICAL_SPELL;
end
if ( resultStr ) then
resultStr = resultStr.." "..critString;
else
resultStr = critString;
end
end
end
return resultStr;
end
_G.CombatLog_String_DamageResultString = CombatLog_String_DamageResultString
--
-- Get the appropriate raid icon for a unit
--
local function CombatLog_String_GetIcon ( unitFlags, direction )
-- Check for an appropriate icon for this unit
local raidTarget = bit_band(unitFlags, COMBATLOG_OBJECT_RAIDTARGET_MASK);
if ( raidTarget == 0 ) then
return "";
end
local iconString = "";
local icon = nil;
local iconBit = 0;
if ( raidTarget == COMBATLOG_OBJECT_RAIDTARGET1 ) then
icon = COMBATLOG_ICON_RAIDTARGET1;
iconBit = COMBATLOG_OBJECT_RAIDTARGET1;
elseif ( raidTarget == COMBATLOG_OBJECT_RAIDTARGET2 ) then
icon = COMBATLOG_ICON_RAIDTARGET2;
iconBit = COMBATLOG_OBJECT_RAIDTARGET2;
elseif ( raidTarget == COMBATLOG_OBJECT_RAIDTARGET3 ) then
icon = COMBATLOG_ICON_RAIDTARGET3;
iconBit = COMBATLOG_OBJECT_RAIDTARGET3;
elseif ( raidTarget == COMBATLOG_OBJECT_RAIDTARGET4 ) then
icon = COMBATLOG_ICON_RAIDTARGET4;
iconBit = COMBATLOG_OBJECT_RAIDTARGET4;
elseif ( raidTarget == COMBATLOG_OBJECT_RAIDTARGET5 ) then
icon = COMBATLOG_ICON_RAIDTARGET5;
iconBit = COMBATLOG_OBJECT_RAIDTARGET5;
elseif ( raidTarget == COMBATLOG_OBJECT_RAIDTARGET6 ) then
icon = COMBATLOG_ICON_RAIDTARGET6;
iconBit = COMBATLOG_OBJECT_RAIDTARGET6;
elseif ( raidTarget == COMBATLOG_OBJECT_RAIDTARGET7 ) then
icon = COMBATLOG_ICON_RAIDTARGET7;
iconBit = COMBATLOG_OBJECT_RAIDTARGET7;
elseif ( raidTarget == COMBATLOG_OBJECT_RAIDTARGET8 ) then
icon = COMBATLOG_ICON_RAIDTARGET8;
iconBit = COMBATLOG_OBJECT_RAIDTARGET8;
end
&nbs