- TimeLine (plugin): now also shows marks symbolizing the player death.

- Added raid history panel. Open it through bookmark or /details history.
- Added support for skins for Player Detail Window.
- Added report history on report button.
- Added key bindings settings for report what is shown on window #1 or #2.
This commit is contained in:
Tercio
2015-05-27 18:19:41 -03:00
parent 6f6dfeeccc
commit 0f60a50e73
16 changed files with 1532 additions and 232 deletions
+3
View File
@@ -466,6 +466,9 @@
_detalhes.schedule_store_boss_encounter = true
end
_detalhes:SendEvent ("COMBAT_BOSS_DEFEATED", nil, _detalhes.tabela_vigente)
else
_detalhes:SendEvent ("COMBAT_BOSS_WIPE", nil, _detalhes.tabela_vigente)
end
--if (_detalhes:GetBossDetails (_detalhes.tabela_vigente.is_boss.mapid, _detalhes.tabela_vigente.is_boss.index) or ) then
+193 -9
View File
@@ -17,8 +17,6 @@ function _detalhes:UpdateGears()
end
------------------------------------------------------------------------------------------------------------
function _detalhes:SetDeathLogLimit (limit)
@@ -366,7 +364,9 @@ _detalhes.background_tasks_loop = _detalhes:ScheduleRepeatingTimer ("DoBackgroun
--> storage stuff ~storage
--global database
function _detalhes:OpenRaidStorage()
_detalhes.storage = {}
function _detalhes.storage:OpenRaidStorage()
--> check if the storage is already loaded
if (not IsAddOnLoaded ("Details_DataStorage")) then
local loaded, reason = LoadAddOn ("Details_DataStorage")
@@ -386,14 +386,178 @@ function _detalhes:OpenRaidStorage()
elseif (not db) then
return
end
--GlobalDatabase = {}
--UserChrStorage = {}
return db
end
function _detalhes.storage:GetBestFromPlayer (diff, encounter_id, role, playername)
local db = _detalhes.storage:OpenRaidStorage()
local best
local onencounter
if (not role) then
role = "damage"
end
role = string.lower (role)
if (role == "damager") then
role = "damage"
elseif (role == "healer") then
role = "healing"
end
local table = db [diff]
if (table) then
local encounters = table [encounter_id]
if (encounters) then
for index, encounter in ipairs (encounters) do
local player = encounter [role] and encounter [role] [playername]
if (player) then
if (best) then
if (player[1] > best[1]) then
onencounter = encounter
best = player
end
else
onencounter = encounter
best = player
end
end
end
end
end
return best, onencounter
end
function _detalhes.storage:ListDiffs()
local db = _detalhes.storage:OpenRaidStorage()
local t = {}
for diff, _ in pairs (db) do
tinsert (t, diff)
end
return t
end
function _detalhes.storage:ListEncounters (diff)
local db = _detalhes.storage:OpenRaidStorage()
local t = {}
if (diff) then
local table = db [diff]
if (table) then
for encounter_id, _ in pairs (table) do
tinsert (t, {diff, encounter_id})
end
end
else
for diff, table in pairs (db) do
for encounter_id, _ in pairs (table) do
tinsert (t, {diff, encounter_id})
end
end
end
return t
end
function _detalhes.storage:GetPlayerData (diff, encounter_id, playername)
local db = _detalhes.storage:OpenRaidStorage()
local t = {}
assert (type (playername) == "string", "PlayerName must be a string.")
if (not diff) then
for diff, table in pairs (db) do
if (encounter_id) then
local encounters = table [encounter_id]
if (encounters) then
for i = 1, #encounters do
local encounter = encounters [i]
local player = encounter.healing [playername] or encounter.damage [playername]
if (player) then
tinsert (t, player)
end
end
end
else
for encounter_id, encounters in pairs (table) do
for i = 1, #encounters do
local encounter = encounters [i]
local player = encounter.healing [playername] or encounter.damage [playername]
if (player) then
tinsert (t, player)
end
end
end
end
end
else
local table = db [diff]
if (table) then
if (encounter_id) then
local encounters = table [encounter_id]
if (encounters) then
for i = 1, #encounters do
local encounter = encounters [i]
local player = encounter.healing [playername] or encounter.damage [playername]
if (player) then
tinsert (t, player)
end
end
end
else
for encounter_id, encounters in pairs (table) do
for i = 1, #encounters do
local encounter = encounters [i]
local player = encounter.healing [playername] or encounter.damage [playername]
if (player) then
tinsert (t, player)
end
end
end
end
end
end
return t
end
function _detalhes.storage:GetEncounterData (diff, encounter_id, guild)
local db = _detalhes.storage:OpenRaidStorage()
if (not diff) then
return db
end
local data = db [diff]
assert (data, "Difficulty not found. Use: 14, 15 or 16.")
assert (type (encounter_id) == "number", "EncounterId must be a number.")
data = data [encounter_id]
local t = {}
if (not data) then
return t
end
for i = 1, #data do
local encounter = data [i]
if (guild) then
if (encounter.guild == guild) then
tinsert (t, encounter)
end
else
tinsert (t, encounter)
end
end
return t
end
local store_instances = {
[1205] = true, --Blackrock Foundry
@@ -498,7 +662,7 @@ function _detalhes:StoreEncounter (combat)
local role = UnitGroupRolesAssigned ("raid" .. i)
if (role == "DAMAGER") then
if (role == "DAMAGER" or role == "TANK") then
local player_name, player_realm = UnitName ("raid" .. i)
if (player_realm and player_realm ~= "") then
player_name = player_name .. "-" .. player_realm
@@ -532,6 +696,26 @@ function _detalhes:StoreEncounter (combat)
print ("|cFFFFFF00Details! Storage|r: encounter saved!")
local myrole = UnitGroupRolesAssigned ("player")
local mybest, onencounter = _detalhes.storage:GetBestFromPlayer (diff, encounter_id, myrole, _detalhes.playername)
print (myrole, mybest and mybest[1], mybest and mybest[2], mybest and mybest[3], onencounter and onencounter.date)
if (mybest) then
local done = 0
if (myrole == "DAMAGER" or myrole == "TANK") then
done = combat (1, _detalhes.playername) and combat (1, _detalhes.playername).total
elseif (myrole == "HEALER") then
done = combat (2, _detalhes.playername) and combat (2, _detalhes.playername).total
end
if (mybest[1] > done) then
print (Loc ["STRING_DETAILS1"] .. format (Loc ["STRING_SCORE_NOTBEST"], _detalhes:comma_value (done), mybest[1], onencounter.date, mybest[2]))
else
print (Loc ["STRING_DETAILS1"] .. format (Loc ["STRING_SCORE_BEST"], _detalhes:comma_value (done)))
end
end
end
end
@@ -660,7 +844,7 @@ function ilvl_core:InspectTimeOut (guid)
end
function ilvl_core:GetItemLevel (unitid, guid)
--> double check
--> ddouble check
if (UnitAffectingCombat ("player") or InCombatLockdown()) then
return
end
+14 -2
View File
@@ -84,6 +84,8 @@
local last_events_cache = {} --> placeholder
--> pets
local container_pets = {} --> place holder
--> ignore deaths
local ignore_death = {}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--> constants
@@ -1186,6 +1188,12 @@
if (tipo == "BUFF") then
------------------------------------------------------------------------------------------------
--> buff uptime
if (spellid == 27827) then --> spirit of redemption (holy priest)
parser:dead ("UNIT_DIED", time, who_serial, who_name, who_flags, alvo_serial, alvo_name, alvo_flags)
ignore_death [who_name] = true
return
end
if (_recording_buffs_and_debuffs) then
if (who_name == alvo_name and raid_members_cache [who_serial] and _in_combat) then
@@ -2547,6 +2555,11 @@
_in_combat
) then
if (ignore_death [alvo_name]) then
ignore_death [alvo_name] = nil
return
end
_current_misc_container.need_refresh = true
--> combat totals
@@ -3451,8 +3464,6 @@
end
function _detalhes:ClearParserCache()
--> clear cache | not sure if replacing the old table is the best approach
_table_wipe (damage_cache)
_table_wipe (damage_cache_pets)
@@ -3460,6 +3471,7 @@
_table_wipe (healing_cache)
_table_wipe (energy_cache)
_table_wipe (misc_cache)
_table_wipe (ignore_death)
damage_cache = setmetatable ({}, _detalhes.weaktable)
damage_cache_pets = setmetatable ({}, _detalhes.weaktable)
+457 -7
View File
@@ -1,4 +1,3 @@
--> this file controls the window position, size and others panels
local _detalhes = _G._detalhes
local Loc = LibStub ("AceLocale-3.0"):GetLocale ( "Details" )
@@ -1006,6 +1005,453 @@
function _detalhes:OpenTranslateWindow()
end
--> raid history window
function _detalhes:OpenRaidHistoryWindow()
if (not _G.DetailsRaidHistoryWindow) then
local db = _detalhes.storage:OpenRaidStorage()
if (not db) then
return _detalhes:Msg ("Fail to open raid storage, may be the addon is disabled.")
end
local f = CreateFrame ("frame", "DetailsRaidHistoryWindow", UIParent, "ButtonFrameTemplate")
f:SetPoint ("center", UIParent, "center")
f:SetFrameStrata ("HIGH")
f:SetToplevel (true)
f:SetMovable (true)
f:SetWidth (850)
f:SetHeight (500)
tinsert (UISpecialFrames, "DetailsRaidHistoryWindow")
local background = f:CreateTexture (nil, "border")
background:SetAlpha (0.3)
background:SetPoint ("topleft", f, "topleft", 6, -65)
background:SetPoint ("bottomright", f, "bottomright", -10, 28)
local div = f:CreateTexture (nil, "artwork")
div:SetTexture ([[Interface\ACHIEVEMENTFRAME\UI-Achievement-MetalBorder-Left]])
div:SetAlpha (0.3)
div:SetPoint ("topleft", f, "topleft", 180, -64)
div:SetHeight (460)
function f:SetBackgroundImage (encounterId)
local instanceId = _detalhes:GetInstanceIdFromEncounterId (encounterId)
if (instanceId) then
local file, L, R, T, B = _detalhes:GetRaidBackground (instanceId)
background:SetTexture (file)
background:SetTexCoord (L, R, T, B)
end
end
f:SetScript ("OnMouseDown", function(self, button)
if (self.isMoving) then
return
end
if (button == "RightButton") then
self:Hide()
else
self:StartMoving()
self.isMoving = true
end
end)
f:SetScript ("OnMouseUp", function(self, button)
if (self.isMoving and button == "LeftButton") then
self:StopMovingOrSizing()
self.isMoving = nil
end
end)
f.TitleText:SetText ("Raid History")
f.portrait:SetTexture ([[Interface\AddOns\Details\images\icons2]])
f.portrait:SetTexCoord (192/512, 258/512, 322/512, 388/512)
local dropdown_size = 160
local icon = [[Interface\FriendsFrame\battlenet-status-offline]]
local diff_list = {}
local raid_list = {}
local boss_list = {}
local guild_list = {}
local sort_alphabetical = function(a,b) return a[1] < b[1] end
local sort_alphabetical2 = function(a,b) return a.value < b.value end
local on_select = function()
if (f.Refresh) then
f:Refresh()
end
end
--> select raid:
local on_raid_select = function (_, _, raid)
on_select()
end
local build_raid_list = function()
return raid_list
end
local raid_dropdown = gump:CreateDropDown (f, build_raid_list, 1, dropdown_size, 20, "select_raid")
local raid_string = gump:CreateLabel (f, "Raid:", _, _, "GameFontNormal", "select_raid_label")
--> select boss:
local on_boss_select = function (_, _, boss)
on_select()
end
local build_boss_list = function()
return boss_list
end
local boss_dropdown = gump:CreateDropDown (f, build_boss_list, 1, dropdown_size, 20, "select_boss")
local boss_string = gump:CreateLabel (f, "Boss:", _, _, "GameFontNormal", "select_boss_label")
--> select difficulty:
local on_diff_select = function (_, _, diff)
on_select()
end
local build_diff_list = function()
return diff_list
end
local diff_dropdown = gump:CreateDropDown (f, build_diff_list, 1, dropdown_size, 20, "select_diff")
local diff_string = gump:CreateLabel (f, "Difficulty:", _, _, "GameFontNormal", "select_diff_label")
--> select role:
local on_role_select = function (_, _, role)
on_select()
end
local build_role_list = function()
return {
{value = "damage", label = "Damager", icon = icon, onclick = on_role_select},
{value = "healing", label = "Healer", icon = icon, onclick = on_role_select}
}
end
local role_dropdown = gump:CreateDropDown (f, build_role_list, 1, dropdown_size, 20, "select_role")
local role_string = gump:CreateLabel (f, "Role:", _, _, "GameFontNormal", "select_role_label")
--> select guild:
local on_guild_select = function (_, _, guild)
on_select()
end
local build_guild_list = function()
return guild_list
end
local guild_dropdown = gump:CreateDropDown (f, build_guild_list, 1, dropdown_size, 20, "select_guild")
local guild_string = gump:CreateLabel (f, "Guild:", _, _, "GameFontNormal", "select_guild_label")
--> select playerbase:
local on_player_select = function (_, _, player)
on_select()
end
local build_player_list = function()
return {
{value = 1, label = "Raid", icon = icon, onclick = on_player_select},
{value = 2, label = "Individual", icon = icon, onclick = on_player_select},
}
end
local player_dropdown = gump:CreateDropDown (f, build_player_list, 1, dropdown_size, 20, "select_player")
local player_string = gump:CreateLabel (f, "Player Base:", _, _, "GameFontNormal", "select_player_label")
--> select player:
local on_player2_select = function (_, _, player)
f:BuildPlayerTable (player)
end
local build_player2_list = function()
local encounterTable, guild, role = unpack (f.build_player2_data or {})
local t = {}
local already_listed = {}
if (encounterTable) then
for encounterIndex, encounter in ipairs (encounterTable) do
if (encounter.guild == guild) then
local roleTable = encounter [role]
for playerName, _ in pairs (roleTable) do
if (not already_listed [playerName]) then
tinsert (t, {value = playerName, label = playerName, icon = icon, onclick = on_player2_select})
already_listed [playerName] = true
end
end
end
end
end
table.sort (t, sort_alphabetical2)
return t
end
local player2_dropdown = gump:CreateDropDown (f, build_player2_list, 1, dropdown_size, 20, "select_player2")
local player2_string = gump:CreateLabel (f, "Player:", _, _, "GameFontNormal", "select_player2_label")
function f:UpdateDropdowns()
--difficulty
wipe (diff_list)
wipe (boss_list)
wipe (raid_list)
wipe (guild_list)
local boss_repeated = {}
local raid_repeated = {}
local guild_repeated = {}
for difficulty, encounterIdTable in pairs (db) do
if (type (difficulty) == "number") then
if (difficulty == 14) then
tinsert (diff_list, {value = 14, label = "Normal", icon = icon, onclick = on_diff_select})
elseif (difficulty == 15) then
tinsert (diff_list, {value = 15, label = "Heroic", icon = icon, onclick = on_diff_select})
elseif (difficulty == 16) then
tinsert (diff_list, {value = 16, label = "Mythic", icon = icon, onclick = on_diff_select})
end
for encounterId, encounterTable in pairs (encounterIdTable) do
if (not boss_repeated [encounterId]) then
local encounter, instance = _detalhes:GetBossEncounterDetailsFromEncounterId (_, encounterId)
if (encounter) then
tinsert (boss_list, {value = encounterId, label = encounter.boss, icon = icon, onclick = on_boss_select})
boss_repeated [encounterId] = true
if (not raid_repeated [instance.name]) then
tinsert (raid_list, {value = instance.id, label = instance.name, icon = icon, onclick = on_raid_select})
raid_repeated [instance.name] = true
end
end
end
for index, encounter in ipairs (encounterTable) do
local guild = encounter.guild
if (not guild_repeated [guild]) then
tinsert (guild_list, {value = guild, label = guild, icon = icon, onclick = on_raid_select})
guild_repeated [guild] = true
end
end
end
end
end
diff_dropdown:Refresh()
diff_dropdown:Select (1, true)
boss_dropdown:Refresh()
boss_dropdown:Select (1, true)
raid_dropdown:Refresh()
raid_dropdown:Select (1, true)
guild_dropdown:Refresh()
guild_dropdown:Select (1, true)
end
--> anchors:
raid_string:SetPoint ("topleft", f, "topleft", 10, -70)
raid_dropdown:SetPoint ("topleft", f, "topleft", 10, -85)
boss_string:SetPoint ("topleft", f, "topleft", 10, -110)
boss_dropdown:SetPoint ("topleft", f, "topleft", 10, -125)
diff_string:SetPoint ("topleft", f, "topleft", 10, -150)
diff_dropdown:SetPoint ("topleft", f, "topleft", 10, -165)
role_string:SetPoint ("topleft", f, "topleft", 10, -190)
role_dropdown:SetPoint ("topleft", f, "topleft", 10, -205)
guild_string:SetPoint ("topleft", f, "topleft", 10, -230)
guild_dropdown:SetPoint ("topleft", f, "topleft", 10, -245)
player_string:SetPoint ("topleft", f, "topleft", 10, -270)
player_dropdown:SetPoint ("topleft", f, "topleft", 10, -285)
player2_string:SetPoint ("topleft", f, "topleft", 10, -310)
player2_dropdown:SetPoint ("topleft", f, "topleft", 10, -325)
player2_string:Hide()
player2_dropdown:Hide()
--> refresh the window:
function f:BuildPlayerTable (playerName)
local encounterTable, guild, role = unpack (f.build_player2_data or {})
local data = {}
if (type (playerName) == "string" and string.len (playerName) > 1) then
for encounterIndex, encounter in ipairs (encounterTable) do
if (encounter.guild == guild) then
local roleTable = encounter [role]
local date = encounter.date
date = date:gsub (".*%s", "")
date = date:sub (1, -4)
local player = roleTable [playerName]
if (player) then
tinsert (data, {text = date, value = player[1], data = player, fulldate = encounter.date})
end
end
end
--> update graphic
if (not f.gframe) then
local cooltip_block_bg = {0, 0, 0, 1}
local menu_wallpaper_tex = {.6, 0.1, 0, 0.64453125}
local menu_wallpaper_color = {1, 1, 1, 0.1}
local onenter = function (self)
GameCooltip:Reset()
GameCooltip:AddLine ("Total Done:", _detalhes:ToK2 (self.data.value))
GameCooltip:AddLine ("Item Level:", floor (self.data.data [2]))
GameCooltip:AddLine ("Date:", self.data.fulldate)
GameCooltip:SetWallpaper (1, [[Interface\SPELLBOOK\Spellbook-Page-1]], menu_wallpaper_tex, menu_wallpaper_color, true)
GameCooltip:SetBackdrop (1, _detalhes.tooltip_backdrop, cooltip_block_bg, _detalhes.tooltip_border_color)
GameCooltip:SetOwner (self.ball.tooltip_anchor)
GameCooltip:Show()
end
local onleave = function (self)
GameCooltip:Hide()
end
f.gframe = gump:CreateGFrame (f, 650, 400, 35, onenter, onleave, "gframe", "$parentGF")
f.gframe:SetPoint ("topleft", f, "topleft", 190, -65)
end
f.gframe:Reset()
f.gframe:UpdateLines (data)
end
end
local fillpanel = gump:NewFillPanel (f, {}, "$parentFP", "fillpanel", 630, 400, false, false, true, nil)
fillpanel:SetPoint ("topleft", f, "topleft", 200, -65)
function f:BuildRaidTable (encounterTable, guild, role)
local header = {{name = "Player Name", type = "text"}} -- , width = 90
local players = {}
local players_index = {}
local amt_encounters = 0
for encounterIndex, encounter in ipairs (encounterTable) do
if (encounter.guild == guild) then
local roleTable = encounter [role]
local date = encounter.date
date = date:gsub (".*%s", "")
date = date:sub (1, -4)
amt_encounters = amt_encounters + 1
tinsert (header, {name = date, type = "text"})
for playerName, playerTable in pairs (roleTable) do
local index = players_index [playerName]
local player
if (not index) then
player = {playerName}
for i = 2, encounterIndex-1 do
tinsert (player, "")
end
tinsert (player, _detalhes:ToK2 (playerTable [1]))
tinsert (players, player)
players_index [playerName] = #players
else
player = players [index]
for i = #player+1, encounterIndex-1 do
tinsert (player, "")
end
tinsert (player, _detalhes:ToK2 (playerTable [1]))
end
end
end
end
for index, playerTable in ipairs (players) do
for i = #playerTable, amt_encounters do
tinsert (playerTable, "")
end
end
--_detalhes:DumpTable (players, true)
table.sort (players, sort_alphabetical)
fillpanel:SetFillFunction (function (index) return players [index] end)
fillpanel:SetTotalFunction (function() return #players end)
fillpanel:UpdateRows (header)
fillpanel:Refresh()
end
function f:Refresh()
--> build the main table
local diff = diff_dropdown.value
local boss = boss_dropdown.value
local role = role_dropdown.value
local guild = guild_dropdown.value
local player = player_dropdown.value
local diffTable = db [diff]
f:SetBackgroundImage (boss)
if (diffTable) then
local encounters = diffTable [boss]
if (encounters) then
if (player == 1) then --> raid
fillpanel:Show()
if (f.gframe) then
f.gframe:Hide()
end
player2_string:Hide()
player2_dropdown:Hide()
f:BuildRaidTable (encounters, guild, role)
elseif (player == 2) then --> only one player
fillpanel:Hide()
if (f.gframe) then
f.gframe:Show()
end
player2_string:Show()
player2_dropdown:Show()
f.build_player2_data = {encounters, guild, role}
player2_dropdown:Refresh()
player2_dropdown:Select (1, true)
f:BuildPlayerTable (player2_dropdown.value)
end
else
if (player == 1) then --> raid
fillpanel:Show()
if (f.gframe) then
f.gframe:Hide()
end
player2_string:Hide()
player2_dropdown:Hide()
f:BuildRaidTable ({}, guild, role)
elseif (player == 2) then --> only one player
fillpanel:Hide()
if (f.gframe) then
f.gframe:Show()
end
player2_string:Show()
player2_dropdown:Show()
f.build_player2_data = {{}, guild, role}
player2_dropdown:Refresh()
player2_dropdown:Select (1, true)
f:BuildPlayerTable (player2_dropdown.value)
end
end
end
end
end
_G.DetailsRaidHistoryWindow:UpdateDropdowns()
_G.DetailsRaidHistoryWindow:Refresh()
_G.DetailsRaidHistoryWindow:Show()
end
--> feedback window
function _detalhes:OpenFeedbackWindow()
@@ -1996,10 +2442,12 @@
--comma_button:SetPoint ("topright", panel, "topright", -100, -14)
--tok_button:SetPoint ("topright", panel, "topright", -100, -36)
local done = function()
local text = panel.editbox:GetText()
text = text:gsub ("\n", "")
--text = text:gsub ("\n", "")
local test = text
@@ -2011,11 +2459,13 @@
code = code:gsub ("STR", test)
local f = loadstring (code)
local err, two = xpcall (f, errorhandler)
if (not err) then
return
if (not f) then
print (f)
end
--local err, two = xpcall (f, errorhandler)
--if (not err) then
-- return
--end
panel.callback (text)
panel:Hide()