diff --git a/boot.lua b/boot.lua index 5bb0ae646..8fd186bae 100644 --- a/boot.lua +++ b/boot.lua @@ -4,10 +4,10 @@ _ = nil _detalhes = LibStub("AceAddon-3.0"):NewAddon("_detalhes", "AceTimer-3.0", "AceComm-3.0", "AceSerializer-3.0", "NickTag-1.0") - _detalhes.build_counter = 8002 - _detalhes.alpha_build_counter = 8002 --if this is higher than the regular counter, use it instead - _detalhes.game_version = "v9.0.1" - _detalhes.userversion = "v9.0.1." .. _detalhes.build_counter + _detalhes.build_counter = 8093 + _detalhes.alpha_build_counter = 8093 --if this is higher than the regular counter, use it instead + _detalhes.game_version = "v9.0.2" + _detalhes.userversion = "v9.0.2." .. _detalhes.build_counter _detalhes.realversion = 144 --core version, this is used to check API version for scripts and plugins (see alias below) _detalhes.APIVersion = _detalhes.realversion --core version _detalhes.version = _detalhes.userversion .. " (core " .. _detalhes.realversion .. ")" --simple stirng to show to players @@ -28,6 +28,13 @@ do local Loc = _G.LibStub("AceLocale-3.0"):GetLocale( "Details" ) local news = { + {"v9.0.1.8001.144", "December 19th, 2020"}, + "Added Details! Coach as a new experimental feature, you may want to test using /details coach", + "Coach feature allows the raid leader to stay outside the raid while seeing in real time player deaths and damage information.", + "Fixed issues with some raid encounters in Castle Nathria.", + "Druid Kyrian Spirits ability now has some rules to credit the druid for damage and heal.", + "Several small bug fixes has been done.", + {"v9.0.1.8001.144", "November 30rd, 2020"}, "Added back the report to bnet friend.", "@Flamanis: fixed issues on custom displays.", diff --git a/core/network.lua b/core/network.lua index d062d9904..eb5768a02 100644 --- a/core/network.lua +++ b/core/network.lua @@ -412,14 +412,8 @@ return false end - if (msgType == "CIEA") then --Coach Is Enabled Ask (regular player asked to raid leader) - --check if the player that received the msg is the raid leader - if (UnitIsGroupLeader("player")) then - return - end - - --send the answer - Details:SendCommMessage(DETAILS_PREFIX_NETWORK, Details:Serialize(DETAILS_PREFIX_COACH, playerName, GetRealmName(), Details.realversion, "CIER", Details.Coach.Server.IsEnabled()), "WHISPER", sourcePlayer) + if (msgType == "CIEA") then --Is Coach Enabled Ask (regular player asked to raid leader) + Details.Coach.Server.CoachIsEnabled_Answer(sourcePlayer) elseif (msgType == "CIER") then --Coach Is Enabled Response (regular player received a raid leader response) local isEnabled = data @@ -444,22 +438,14 @@ if (UnitIsGroupLeader("player")) then if (Details.Coach.Server.IsEnabled()) then --update the current combat with new information - - --this is disabled due to lack of testing - if (_detalhes.debug) then - Details.packFunctions.DeployPackedCombatData(data) - end + Details.packFunctions.DeployPackedCombatData(data) end end elseif (msgType == "CDD") then --Coach Death (a player in the raid sent to raid leader his death log) if (UnitIsGroupLeader("player")) then if (Details.Coach.Server.IsEnabled()) then - local currentCombat = Details:GetCurrentCombat() - tinsert(currentCombat.last_events_tables, data) - - --tag the misc container as need refresh - currentCombat[DETAILS_ATTRIBUTE_MISC].need_refresh = true + Details.Coach.Server.AddPlayerDeath(sourcePlayer, data) end end end diff --git a/core/parser.lua b/core/parser.lua index 397a7e64f..75d627e51 100755 --- a/core/parser.lua +++ b/core/parser.lua @@ -264,6 +264,9 @@ local SPELLID_KYRIAN_DRUID_DAMAGE = 338411 local SPELLID_KYRIAN_DRUID_HEAL = 327149 local SPELLID_KYRIAN_DRUID_TANK = 327037 + + local SPELLID_BARGAST_DEBUFF = 334695 + local bargastBuffs = {} --> spells with special treatment local special_damage_spells = { @@ -718,6 +721,7 @@ if (absorbed) then amount = absorbed + (amount or 0) end + if (_is_in_instance) then if (overkill and overkill > 0) then --if enabled it'll cut the amount of overkill from the last hit (which killed the actor) @@ -725,6 +729,14 @@ --amount = amount - overkill end end + + if (bargastBuffs[alvo_serial]) then --REMOVE ON 10.0 + local stacks = bargastBuffs[alvo_serial] + if (stacks) then + local newDamage = amount / stacks + amount = newDamage + end + end if (este_jogador.grupo and not este_jogador.arena_enemy and not este_jogador.enemy) then --> source = friendly player and not an enemy player --dano to adversario estava caindo aqui por nao estar checando .enemy @@ -2134,8 +2146,12 @@ SPELL_HEAL,Player-3209-0A79112C,"Symantec-Azralon",0x511,0x0,Player-3209-065BAED reflection_debuffs[who_serial][spellid] = true end + if (spellid == SPELLID_BARGAST_DEBUFF) then --REMOVE ON 10.0 + bargastBuffs[alvo_serial] = (bargastBuffs[alvo_serial] or 0) + 1 + end + if (_in_combat) then - + ------------------------------------------------------------------------------------------------ --> buff uptime if (_recording_buffs_and_debuffs) then @@ -2387,6 +2403,10 @@ SPELL_HEAL,Player-3209-0A79112C,"Symantec-Azralon",0x511,0x0,Player-3209-065BAED who_serial, who_name, who_flags = "", enemyName, 0xa48 end + if (spellid == SPELLID_BARGAST_DEBUFF) then + bargastBuffs[alvo_serial] = (bargastBuffs[alvo_serial] or 0) + 1 + end + if (_in_combat) then ------------------------------------------------------------------------------------------------ --> buff uptime @@ -4645,6 +4665,7 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1 _detalhes:SendEvent ("COMBAT_ENCOUNTER_END", nil, ...) _table_wipe (_detalhes.encounter_table) + _table_wipe (bargastBuffs) return true end diff --git a/frames/window_cdtracker.lua b/frames/window_cdtracker.lua index 273ced0a9..a2969866f 100644 --- a/frames/window_cdtracker.lua +++ b/frames/window_cdtracker.lua @@ -184,7 +184,12 @@ function Details.CooldownTracking.RefreshScreenPanel() --print("timeLeft:", timeLeft, spellNameDebug) else bar:SetMinMaxValues(0, 100) - bar:SetValue(100) + bar:SetTimer(0) + --print(spellNameDebug) + C_Timer.After(1, function() + -- bar:SetMinMaxValues(0, 100) + -- bar:SetTimer(0) + end) end end end diff --git a/frames/window_main.lua b/frames/window_main.lua index 5107238ca..ac06665a4 100644 --- a/frames/window_main.lua +++ b/frames/window_main.lua @@ -5054,12 +5054,6 @@ function _detalhes:SetWindowAlphaForCombat (entering_in_combat, true_hide, alpha self:InstanceAlpha(min (amount, self.color[4])) gump:Fade(self.rowframe, "ALPHAANIM", rowsamount) gump:Fade(self.baseframe, "ALPHAANIM", rowsamount) - - --self:SetIconAlpha(menuamount) - - if (_detalhes.debug) then - _detalhes:Msg ("(debug) showing window SetWindowAlphaForCombat()", amount, rowsamount, menuamount) - end --]] end diff --git a/functions/coach.lua b/functions/coach.lua index 7958bc18a..109da141d 100644 --- a/functions/coach.lua +++ b/functions/coach.lua @@ -247,15 +247,32 @@ function Details.Coach.StartUp() eventListener:RegisterEvent("ZONE_TYPE_CHANGED", "OnZoneChanged") end +C_Timer.After(0.1, function() + --Details.debug = true +end) + --received an answer from server telling if the raidleader has the coach feature enabled --the request is made when the player enters a new group or reconnects function Details.Coach.Client.CoachIsEnabled_Response(isCoachEnabled, raidLeaderName) + if (_detalhes.debug) then + Details:Msg("[|cFFAAFFAADetails! Coach|r] Raid Leader sent response about the status of Coach Mode:", isCoachEnabled, raidLeaderName) + end + if (isCoachEnabled) then --raid leader confirmed the coach feature is enabled and running Details.Coach.Client.EnableCoach(raidLeaderName) + Details:Msg("[|cFFAAFFAADetails! Coach|r] current coach:", raidLeaderName) end end +function Details.Coach.Server.CoachIsEnabled_Answer(sourcePlayer) + if (not UnitIsGroupLeader("player")) then + return + end + --send the answer + Details:SendCommMessage(_G.DETAILS_PREFIX_NETWORK, Details:Serialize(_G.DETAILS_PREFIX_COACH, sourcePlayer, GetRealmName(), Details.realversion, "CIER", Details.Coach.Server.IsEnabled()), "WHISPER", sourcePlayer) +end + function Details.Coach.Disable() Details.coach.enabled = false --profile @@ -345,6 +362,8 @@ function Details.Coach.Client.EnableCoach(raidLeaderName) if (_detalhes.debug) then Details:Msg("[|cFFAAFFAADetails! Coach|r] there's a new coach: ", raidLeaderName) end + + Details:Msg("[|cFFAAFFAADetails! Coach|r] current coach:", raidLeaderName) end --raid leader received a notification that a new combat has started @@ -443,14 +462,161 @@ Details.Coach.EventFrame:SetScript("OnEvent", function(event, ...) end end) -function Details.Coach.Client.SendMyDeath(_, _, _, _, _, _, playerGUID, _, _, deathTable) +function Details.Coach.Client.SendMyDeath(_, _, _, _, _, _, playerGUID, _, playerFlag, deathTable) if (Details.Coach.Client.enabled) then if (Details.Coach.Client.coachName) then if (Details.in_combat) then if (playerGUID == UnitGUID("player")) then - Details.Coach.SendDeathToRL(deathTable) + Details.Coach.SendDeathToRL({deathTable, playerGUID, playerFlag}) end end end end end + +function Details.Coach.Server.AddPlayerDeath(playerName, data) + local currentCombat = Details:GetCurrentCombat() + local utilityContainer = currentCombat[4] + + local deathLog = data[1] + local playerGUID = data[2] + local playerFlag = data[3] + + local utilityActorObject = utilityContainer:GetOrCreateActor(playerGUID, playerName, playerFlag, true) + + if (utilityActorObject) then + tinsert(currentCombat.last_events_tables, deathLog) + --tag the misc container as need refresh + currentCombat[DETAILS_ATTRIBUTE_MISC].need_refresh = true + end +end + +function Details.Coach.WelcomePanel() + local welcomePanel = _G.DETAILSCOACHPANEL + if (not welcomePanel) then + welcomePanel = DetailsFramework:CreateSimplePanel(UIParent) + welcomePanel:SetSize (400, 280) + welcomePanel:SetTitle ("Details! Coach") + welcomePanel:ClearAllPoints() + welcomePanel:SetPoint ("left", UIParent, "left", 10, 0) + welcomePanel:Hide() + DetailsFramework:ApplyStandardBackdrop(welcomePanel) + + local LibWindow = _G.LibStub("LibWindow-1.1") + welcomePanel:SetScript("OnMouseDown", nil) + welcomePanel:SetScript("OnMouseUp", nil) + LibWindow.RegisterConfig(welcomePanel, Details.coach.welcome_panel_pos) + LibWindow.MakeDraggable(welcomePanel) + LibWindow.RestorePosition(welcomePanel) + + local detailsLogo = DetailsFramework:CreateImage(welcomePanel, [[Interface\AddOns\Details\images\logotipo]]) + detailsLogo:SetPoint("topleft", welcomePanel, "topleft", 5, -30) + detailsLogo:SetSize(200, 50) + detailsLogo:SetTexCoord(36/512, 380/512, 128/256, 227/256) + + local isLeaderTexture = DetailsFramework:CreateImage(welcomePanel, [[Interface\GLUES\LOADINGSCREENS\DynamicElements]], 32, 32) + isLeaderTexture:SetTexCoord(0, 0.5, 0, 0.5) + isLeaderTexture:SetPoint("topleft", detailsLogo, "topleft", 0, -60) + local isLeaderText = DetailsFramework:CreateLabel(welcomePanel, "In raid and You're the leader of the group.") + isLeaderText:SetPoint("left", isLeaderTexture, "right", 10, 0) + + local isOutsideTexture = DetailsFramework:CreateImage(welcomePanel, [[Interface\GLUES\LOADINGSCREENS\DynamicElements]], 32, 32) + isOutsideTexture:SetTexCoord(0, 0.5, 0, 0.5) + isOutsideTexture:SetPoint("topleft", isLeaderTexture, "bottomleft", 0, -5) + local isOutsideText = DetailsFramework:CreateLabel(welcomePanel, "You're outside of the instance.") + isOutsideText:SetPoint("left", isOutsideTexture, "right", 10, 0) + + local hasAssistantsTexture = DetailsFramework:CreateImage(welcomePanel, [[Interface\GLUES\LOADINGSCREENS\DynamicElements]], 32, 32) + hasAssistantsTexture:SetTexCoord(0, 0.5, 0, 0.5) + hasAssistantsTexture:SetPoint("topleft", isOutsideTexture, "bottomleft", 0, -5) + local hasAssistantsText = DetailsFramework:CreateLabel(welcomePanel, "There's an 'raid assistant' inside the raid.") + hasAssistantsText:SetPoint("left", hasAssistantsTexture, "right", 10, 0) + + local beInGroupSevenTexture = DetailsFramework:CreateImage(welcomePanel, [[Interface\GLUES\LOADINGSCREENS\DynamicElements]], 32, 32) + beInGroupSevenTexture:SetTexCoord(0, 0.5, 0, 0.5) + beInGroupSevenTexture:SetPoint("topleft", hasAssistantsTexture, "bottomleft", 0, -5) + local beInGroupSevenText = DetailsFramework:CreateLabel(welcomePanel, "Stay in group 7 or 8.") + beInGroupSevenText:SetPoint("left", beInGroupSevenTexture, "right", 10, 0) + + local startCoachButton = DetailsFramework:CreateButton(welcomePanel, function() + Details.coach.enabled = true + Details.Coach.Server.EnableCoach() + welcomePanel:Hide() + Details:Msg("welcome aboard commander!") + + end, 80, 20, "Start Coaching!") + startCoachButton:SetPoint("bottomright", welcomePanel, "bottomright", -10, 10) + startCoachButton:SetTemplate(DetailsFramework:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE")) + + function welcomePanel.Update() + local good = 0 + + if (IsInRaid() and UnitIsGroupLeader("player")) then + isLeaderTexture:SetTexture([[Interface\COMMON\Indicator-Green]]) + isLeaderTexture:SetTexCoord(0, 1, 0, 1) + good = good + 1 + else + isLeaderTexture:SetTexture([[Interface\GLUES\LOADINGSCREENS\DynamicElements]]) + isLeaderTexture:SetTexCoord(0, 0.5, 0, 0.5) + end + + if (not IsInInstance()) then + isOutsideTexture:SetTexture([[Interface\COMMON\Indicator-Green]]) + isOutsideTexture:SetTexCoord(0, 1, 0, 1) + good = good + 1 + else + isOutsideTexture:SetTexture([[Interface\GLUES\LOADINGSCREENS\DynamicElements]]) + isOutsideTexture:SetTexCoord(0, 0.5, 0, 0.5) + end + + local hasAssistant = false + for i = 1, GetNumGroupMembers() do + if (UnitIsGroupAssistant("raid" .. i) and UnitName("raid" .. i) ~= UnitName("player")) then + hasAssistant = true + break + end + end + + if (hasAssistant) then + hasAssistantsTexture:SetTexture([[Interface\COMMON\Indicator-Green]]) + hasAssistantsTexture:SetTexCoord(0, 1, 0, 1) + good = good + 1 + else + hasAssistantsTexture:SetTexture([[Interface\GLUES\LOADINGSCREENS\DynamicElements]]) + hasAssistantsTexture:SetTexCoord(0, 0.5, 0, 0.5) + end + + local isInCorrectGroup = false + for i = 1, GetNumGroupMembers() do + local name, rank, subgroup, level, class, fileName, zone, online, isDead, role, isML = GetRaidRosterInfo(i) + if (rank == 2) then + if (subgroup == 7 or subgroup == 8) then + isInCorrectGroup = true + break + end + end + end + + if (isInCorrectGroup) then + beInGroupSevenTexture:SetTexture([[Interface\COMMON\Indicator-Green]]) + beInGroupSevenTexture:SetTexCoord(0, 1, 0, 1) + good = good + 1 + else + beInGroupSevenTexture:SetTexture([[Interface\GLUES\LOADINGSCREENS\DynamicElements]]) + beInGroupSevenTexture:SetTexCoord(0, 0.5, 0, 0.5) + end + + if (good == 4) then + startCoachButton:Enable() + else + startCoachButton:Disable() + end + end + end + + welcomePanel:SetScript("OnUpdate", function() + welcomePanel:Update() + end) + + welcomePanel:Show() +end diff --git a/functions/pack.lua b/functions/pack.lua index daaf90ea6..30493f9e7 100644 --- a/functions/pack.lua +++ b/functions/pack.lua @@ -50,13 +50,7 @@ local TOTAL_INDEXES_FOR_COMBAT_INFORMATION = 6 local entitySerialCounter = 0 -local isDebugging = true - -function Dexport() --test case - local combat = Details:GetCurrentCombat() - local readyToSendData = Details.packFunctions.PackCombatData(combat, 0x1) - local newCombatWithData = Details.packFunctions.UnPackCombatData(readyToSendData) -end +local isDebugging = false function Details.packFunctions.GetAllData() local combat = Details:GetCurrentCombat() @@ -112,7 +106,7 @@ function Details.packFunctions.PackCombatData(combatObject, flags) Details.packFunctions.PackDamage(combatObject) end - if (bit.band(flags, 0x2) ~= 0) then + if (bit.band(flags, 0x2) ~= 0 and false) then Details.packFunctions.PackHeal(combatObject) end @@ -140,7 +134,7 @@ function Details.packFunctions.PackCombatData(combatObject, flags) end --add the heal actors data - if (bit.band(flags, 0x2) ~= 0) then + if (bit.band(flags, 0x2) ~= 0 and false) then exportedString = exportedString .. "!H" .. "," for index, data in ipairs(actorHealInfo) do exportedString = exportedString .. data .. "," @@ -157,6 +151,8 @@ function Details.packFunctions.PackCombatData(combatObject, flags) print(exportedString) end + --Details:Dump({exportedString}) + --compress local LibDeflate = _G.LibStub:GetLibrary("LibDeflate") local dataCompressed = LibDeflate:CompressDeflate(exportedString, {level = 9}) @@ -402,7 +398,7 @@ end function Details.packFunctions.PackDamage(combatObject) if (isDebugging) then - print("PackDamage(): START.") + print("PackDamage(): start.") end --store actorObjects to pack @@ -413,7 +409,7 @@ function Details.packFunctions.PackDamage(combatObject) local playerObject = combatObject:GetActor(DETAILS_ATTRIBUTE_DAMAGE, playerName) if (not playerObject) then if (isDebugging) then - print("PackDamage(): RETURN | no player object.") + print("PackDamage(): return | no player object.") end return end @@ -429,21 +425,11 @@ function Details.packFunctions.PackDamage(combatObject) end end - local playerIndex - --check if this player has to send information about an enemy npc - if (IsInGroup()) then - for i = 1, GetNumGroupMembers() do - local name = GetRaidRosterInfo(i) --, rank, subgroup, level, class, fileName, zone, online, isDead, role, isML - if (name == playerName) then - playerIndex = i - break - end - end - end + local playerIndex = UnitInRaid("player") if (not playerIndex) then --no player index if (isDebugging) then - print("PackDamage(): RETURN | no player index found.") + print("PackDamage(): return | no player index found.") end return end @@ -458,9 +444,10 @@ function Details.packFunctions.PackDamage(combatObject) --check if is an enemy or neutral if (actor:IsNeutralOrEnemy()) then --get the spawnId - local spawnId = select(7, strsplit( "-", actor.serial)) + local spawnId = select(7, strsplit("-", actor.serial)) if (spawnId) then - spawnId = tonumber(spawnId) + --convert hex to number + spawnId = tonumber(spawnId:sub(1, 10), 16) if (spawnId) then --first index is the actorObject, the second index is the spawnId to sort enemies tinsert(allEnemies, {actor, spawnId}) @@ -468,12 +455,28 @@ function Details.packFunctions.PackDamage(combatObject) end end end - --sort enemies by their spawnId table.sort(allEnemies, Details.Sort2) + local allPlayerNames = {} + for i = 1, 20 do + local unitName = UnitName("raid" .. i) + if (unitName and not UnitIsGroupLeader("raid" .. i)) then + allPlayerNames[#allPlayerNames+1] = unitName + end + end + table.sort(allPlayerNames, DetailsFramework.SortOrder1R) + + local playerName = UnitName("player") + for i = 1, #allPlayerNames do + if (playerName == allPlayerNames[i]) then + playerIndex = i + break + end + end + --this is the enemy that this player has to send - local enemyObjectToSend = allEnemies[playerIndex] + local enemyObjectToSend = allEnemies[playerIndex] and allEnemies[playerIndex][1] if (enemyObjectToSend) then tinsert(actorsToPack, enemyObjectToSend) end @@ -488,8 +491,6 @@ function Details.packFunctions.PackDamage(combatObject) end end - local spellSize = 0 - for i = 1, #actorsToPack do --get the actor object local actor = actorsToPack[i] @@ -523,24 +524,18 @@ function Details.packFunctions.PackDamage(combatObject) actorDamageInfo [#actorDamageInfo + 1] = floor(spellId) actorDamageInfo [#actorDamageInfo + 1] = floor(spellDamage) actorDamageInfo [#actorDamageInfo + 1] = floor(spellHits) + totalSpellIndexes = totalSpellIndexes + 3 --build targets local targetsSize = Details.packFunctions.CountTableEntriesValid(spellTargets) * 2 actorDamageInfo [#actorDamageInfo + 1] = targetsSize + totalSpellIndexes = totalSpellIndexes + 1 for actorName, damageDone in pairs(spellTargets) do - local actorInfoIndex = actorInformationIndexes[actorName] - if (actorInfoIndex) then - actorDamageInfo [#actorDamageInfo + 1] = actorInfoIndex - actorDamageInfo [#actorDamageInfo + 1] = floor(damageDone) - spellSize = spellSize + 2 - end + actorDamageInfo [#actorDamageInfo + 1] = actorName + actorDamageInfo [#actorDamageInfo + 1] = floor(damageDone) + totalSpellIndexes = totalSpellIndexes + 2 end - - --+3: spellId, damage, spellHits - --+1: the index that tell the size of targets - totalSpellIndexes = totalSpellIndexes + 3 + targetsSize + 1 - spellSize = spellSize + 1 --debug end --amount of indexes spells are using @@ -548,7 +543,7 @@ function Details.packFunctions.PackDamage(combatObject) end if (isDebugging) then - print("PackDamage(): DONE.") + print("PackDamage(): done.") end end @@ -560,7 +555,7 @@ end --@tablePosition: first index of the first damage actor function Details.packFunctions.UnPackDamage(currentCombat, combatData, tablePosition) if (isDebugging) then - print("UnPackDamage(): START.") + print("UnPackDamage(): start.") end --get the damage container @@ -576,14 +571,14 @@ function Details.packFunctions.UnPackDamage(currentCombat, combatData, tablePosi local actorName, actorFlag, serialNumber, class, spec = Details.packFunctions.RetriveActorInformation(combatData, actorReference) if (isDebugging) then - print("UnPackDamage(): Retrivied Data From " .. actorReference .. ":", actorName, actorFlag, serialNumber, class, spec) + print("UnPackDamage(): Retrivied Data From " .. (actorReference or "nil") .. ":", actorName, actorFlag, serialNumber, class, spec) end --check if all damage actors has been processed --if there's no actor name it means it reached the end if (not actorName) then if (isDebugging) then - print("UnPackDamage(): BREAK damage END index:", i, actorReference, "tablePosition:", tablePosition, "value:", combatData[tablePosition]) + print("UnPackDamage(): break damage, end index:", i, (actorReference or "nil"), "tablePosition:", tablePosition, "value:", combatData[tablePosition]) end break end @@ -595,6 +590,7 @@ function Details.packFunctions.UnPackDamage(currentCombat, combatData, tablePosi actorObject.classe = class actorObject.spec = spec actorObject.grupo = isActorInGroup(class, actorFlag) + actorObject.flag_original = actorFlag --> copy back the base damage actorObject.total = tonumber(combatData[tablePosition+1]) --[2] @@ -608,7 +604,12 @@ function Details.packFunctions.UnPackDamage(currentCombat, combatData, tablePosi --> copy back the actor spells --amount of indexes used to store spells for this actor local spellsSize = tonumber(combatData [tablePosition]) --[7] + if (isDebugging) then + print("spell size unpack:", spellsSize) + end + tablePosition = tablePosition + 1 + local newTargetsTable = {} local spellIndex = tablePosition while(spellIndex < tablePosition + spellsSize) do @@ -616,21 +617,28 @@ function Details.packFunctions.UnPackDamage(currentCombat, combatData, tablePosi local spellDamage = tonumber(combatData [spellIndex+1]) --[2] local spellHits = tonumber(combatData [spellIndex+2]) --[3] - local targetsSize = combatData [spellIndex+3] --[4] + local targetsSize = tonumber(combatData[spellIndex+3]) --[4] + local targetTable = Details.packFunctions.UnpackTable(combatData, spellIndex+3, true) local spellObject = actorObject.spells:GetOrCreateSpell(spellId, true) --this one need some translation spellObject.total = spellDamage spellObject.counter = spellHits spellObject.targets = targetTable + for targetName, amount in pairs (spellObject.targets) do + newTargetsTable[targetName] = (newTargetsTable[targetName] or 0) + amount + end + spellIndex = spellIndex + targetsSize + 4 end + --each iteration need to build a new target table + actorObject.targets = newTargetsTable tablePosition = tablePosition + spellsSize --increase table position end if (isDebugging) then - print("UnPackDamage(): DONE.") + print("UnPackDamage(): done.") end return tablePosition @@ -638,7 +646,7 @@ end function Details.packFunctions.PackHeal(combatObject) if (isDebugging) then - print("PackHeal(): START.") + print("PackHeal(): start.") end --store actorObjects to pack @@ -649,7 +657,7 @@ function Details.packFunctions.PackHeal(combatObject) local playerObject = combatObject:GetActor(DETAILS_ATTRIBUTE_HEAL, playerName) if (not playerObject) then if (isDebugging) then - print("PackHeal(): RETURN | no player object.") + print("PackHeal(): return | no player object.") end return end @@ -679,7 +687,7 @@ function Details.packFunctions.PackHeal(combatObject) if (not playerIndex) then if (isDebugging) then - print("PackHeal(): RETURN | no player index found.") + print("PackHeal(): return | no player index found.") end return end @@ -784,7 +792,7 @@ function Details.packFunctions.PackHeal(combatObject) end if (isDebugging) then - print("PackHeal(): DONE.") + print("PackHeal(): done.") end end @@ -794,7 +802,7 @@ end function Details.packFunctions.UnPackHeal(currentCombat, combatData, tablePosition) if (isDebugging) then - print("UnPackHeal(): START.") + print("UnPackHeal(): start.") end --get the healing container @@ -806,13 +814,13 @@ function Details.packFunctions.UnPackHeal(currentCombat, combatData, tablePositi local actorName, actorFlag, serialNumber, class, spec = Details.packFunctions.RetriveActorInformation(combatData, actorReference) if (isDebugging) then - print("UnPackHeal(): Retrivied Data From " .. actorReference .. ":", actorName, actorFlag, serialNumber, class, spec) + print("UnPackHeal(): Retrivied Data From " .. (actorReference or "nil") .. ":", actorName, actorFlag, serialNumber, class, spec) end --if there's no actor name it means it reached the end if (not actorName) then if (isDebugging) then - print("UnPackHeal(): BREAK | Heal loop has been stopped", "index:", i, "tablePosition:", tablePosition, "value:", combatData[tablePosition]) + print("UnPackHeal(): break | Heal loop has been stopped", "index:", i, "tablePosition:", tablePosition, "value:", combatData[tablePosition]) end break end @@ -858,7 +866,7 @@ function Details.packFunctions.UnPackHeal(currentCombat, combatData, tablePositi end if (isDebugging) then - print("UnPackHeal(): DONE.") + print("UnPackHeal(): done.") end return tablePosition @@ -866,15 +874,18 @@ end --this function does the same as the function above but does not create a new combat, it just add new information function Details.packFunctions.DeployPackedCombatData(packedCombatData) - if (isDebugging) then - print("DeployPackedCombatData(): START.") + print("DeployPackedCombatData(): start.") end local LibDeflate = _G.LibStub:GetLibrary("LibDeflate") local dataCompressed = LibDeflate:DecodeForWoWAddonChannel(packedCombatData) local combatDataString = LibDeflate:DecompressDeflate(dataCompressed) + if (isDebugging) then + print(combatDataString) + end + local function count(text, pattern) return select(2, text:gsub(pattern, "")) end @@ -955,6 +966,38 @@ function Details.packFunctions.DeployPackedCombatData(packedCombatData) currentCombat:SetDate(combatData[INDEX_COMBAT_START_DATE], combatData[INDEX_COMBAT_END_DATE]) currentCombat.enemy = combatData[INDEX_COMBAT_NAME] end + + --refresh container + currentCombat[DETAILS_ATTRIBUTE_DAMAGE]:Remap() + currentCombat[DETAILS_ATTRIBUTE_HEAL]:Remap() + + --refresh damage taken + local damageContainer = currentCombat[DETAILS_ATTRIBUTE_DAMAGE] + local allActors = damageContainer._ActorTable + + for i = 1, #allActors do --reset damage taken table + local actor = allActors[i] + actor.damage_taken = 0 + actor.damage_from = {} + end + + for i = 1, #allActors do + local actor = allActors[i] + for targetName, amount in pairs (actor.targets) do + local actorIndex = damageContainer._NameIndexTable[targetName] + if (actorIndex) then + local targetActor = allActors[actorIndex] + if (targetActor) then + targetActor.damage_taken = targetActor.damage_taken + amount + targetActor.damage_from[actor.nome] = (targetActor.damage_from[actor.nome] or 0) + amount + end + end + end + end + + --refresh windows + currentCombat[DETAILS_ATTRIBUTE_DAMAGE].need_refresh = true + currentCombat[DETAILS_ATTRIBUTE_HEAL].need_refresh = true end --get the amount of entries of a hash table @@ -970,9 +1013,9 @@ end function Details.packFunctions.CountTableEntriesValid(hasTable) local amount = 0 for actorName, _ in pairs(hasTable) do - if (actorInformationIndexes[actorName]) then + --if (actorInformationIndexes[actorName]) then amount = amount + 1 - end + --end end return amount end @@ -988,18 +1031,18 @@ end function Details.packFunctions.UnpackTable(table, index, isPair, valueAsTable, amountOfValues) local result = {} - local reservedIndexes = table[index] + local reservedIndexes = tonumber(table[index]) local indexStart = index+1 local indexEnd = reservedIndexes+index if (isPair) then amountOfValues = amountOfValues or 2 - for i = indexStart, indexEnd, amountOfValues do + for i = indexStart, indexStart + reservedIndexes - 1, amountOfValues do if (valueAsTable) then local key = tonumber(table[i]) result[key] = {selectIndexes(table, i+1, amountOfValues-1)} else - local key = tonumber(table[i]) + local key = table[i] local value = tonumber(table[i+1]) result[key] = value end @@ -1012,119 +1055,4 @@ function Details.packFunctions.UnpackTable(table, index, isPair, valueAsTable, a end return result -end - ---DEPRECATED ---what this function receives: ---@packedCombatData: packed combat, ready to be unpacked -function Details.packFunctions.UnPackCombatData(packedCombatData) - - if (true) then - print("Details is calling the wrong function UnPackCombatData()") - return - end - - local LibDeflate = _G.LibStub:GetLibrary("LibDeflate") - local dataCompressed = LibDeflate:DecodeForWoWAddonChannel(packedCombatData) - local combatDataString = LibDeflate:DecompressDeflate(dataCompressed) - - --[= - local function count(text, pattern) - return select(2, text:gsub(pattern, "")) - end - --]=] - - local combatData = {} - local amountOfIndexes = count(combatDataString, ",") + 1 - print ("amountOfIndexes (debug):", amountOfIndexes) - - while (amountOfIndexes > 0) do - - local splitPart = {strsplit(",", combatDataString, 4000)} --strsplit(): Stack overflow, max allowed: 4000 - - if (#splitPart == 4000 and amountOfIndexes > 4000) then - - print ("#combatDataString (debug) must be > 4000:", amountOfIndexes) - for i = 1, 3999 do - combatData[#combatData+1] = splitPart[i] - end - - --get get part that couldn't be read this loop - combatDataString = splitPart[4000] - amountOfIndexes = amountOfIndexes - 3999 - - print ("#combatDataString (debug) left over:", amountOfIndexes) - else - for i = 1, #splitPart do - combatData[#combatData+1] = splitPart[i] - end - - amountOfIndexes = amountOfIndexes - #splitPart - end - end - - print("total indexes (debug):", #combatData) - - --if true then return end - - local flags = tonumber(combatData[INDEX_EXPORT_FLAG]) - - local tablePosition = TOTAL_INDEXES_FOR_COMBAT_INFORMATION + 1 --[[ +1 to jump to damage ]] --DEPRECATED FUNC - --tablePosition now have the first index of the actorInfoTable - - --stop the combat if already in one - if (Details.in_combat) then - Details:EndCombat() - end - - --start a new combat - Details:StartCombat() - --get the current combat - local currentCombat = Details:GetCurrentCombat() - - --check if this export has include damage info - if (bit.band(flags, 0x1) ~= 0) then - --find the index where the damage information start - for i = tablePosition, #combatData do - if (combatData[i] == "!D") then - tablePosition = i + 1; - break - end - end - - --unpack damage - tablePosition = Details.packFunctions.UnPackDamage(currentCombat, combatData, tablePosition) - end - - if (bit.band(flags, 0x2) ~= 0) then - --find the index where the heal information start - for i = tablePosition, #combatData do - if (combatData[i] == "!H") then - tablePosition = i + 1; - break - end - end - - --unpack heal - Details.packFunctions.UnPackHeal(currentCombat, combatData, tablePosition) - end - - --all done, end combat - Details:EndCombat() - - --set the start and end of combat time and date - currentCombat:SetStartTime(combatData[INDEX_COMBAT_START_TIME]) - currentCombat:SetEndTime(combatData[INDEX_COMBAT_END_TIME]) - currentCombat:SetDate(combatData[INDEX_COMBAT_START_DATE], combatData[INDEX_COMBAT_END_DATE]) - currentCombat.enemy = combatData[INDEX_COMBAT_NAME] - - --debug: delete the segment just created (debug) - --[[ - local combat2 = _detalhes.tabela_historico.tabelas[2] - if (combat2) then - tremove (_detalhes.tabela_historico.tabelas, 1) - _detalhes.tabela_historico.tabelas[1] = combat2 - _detalhes.tabela_vigente = combat2 - end - --]] end \ No newline at end of file diff --git a/functions/profiles.lua b/functions/profiles.lua index fc7752d5e..29cb0410d 100644 --- a/functions/profiles.lua +++ b/functions/profiles.lua @@ -1108,12 +1108,11 @@ local default_profile = { _detalhes.default_profile = default_profile - - -- aqui fica as propriedades do jogador que n�o ser�o armazenadas no profile local default_player_data = { coach = { enabled = false, + welcome_panel_pos = {} }, --> force all fonts to have this outline diff --git a/functions/slash.lua b/functions/slash.lua index b3f3ea353..feca34a71 100644 --- a/functions/slash.lua +++ b/functions/slash.lua @@ -990,95 +990,6 @@ function SlashCmdList.DETAILS (msg, editbox) print (Loc ["STRING_DETAILS1"] .. "diagnostic for character " .. rest .. " turned on.") return end - - local current_combat = _detalhes.tabela_vigente - - if (not _detalhes.DebugWindow) then - _detalhes.DebugWindow = _detalhes.gump:CreateSimplePanel (UIParent, 800, 600, "Details! Debug", "DetailsDebugPanel") - local TextBox = _detalhes.gump:NewSpecialLuaEditorEntry (_detalhes.DebugWindow, 760, 560, "text", "$parentTextEntry", true) - TextBox:SetPoint ("center", _detalhes.DebugWindow, "center", 0, -10) - TextBox:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) - TextBox:SetBackdropColor (0, 0, 0, 0.9) - TextBox:SetBackdropBorderColor (0, 0, 0, 1) - _detalhes.DebugWindow.TextBox = TextBox - end - - local text = [[ -Hello World! -Details! Damage Meter Debug -Release Version: @VERSION Core Version: @CORE - -Update Thread Status: -Tick Rate: @TICKRATE -Threat Health: @TICKHEALTH -Last Tick: @TICKLAST -Next Tick In: @TICKNEXT - -Current Combat Status: -ID: @COMBATID -Container Status: @COMBATCONTAINERS -Damage Container Actors: @COMBATDAMAGEACTORS actors found - -Parser Status: -Parser Health: @PARSERHEALTH -Parser Capture Status: @PARSERCAPTURE - -Lower Instance Status (window 1): -Is Shown: @INSTANCESHOWN -Segment Status: @INSTANCESEGMENT -Damage Update Status: @INSTANCEDAMAGESTATUS - -]] - - text = text:gsub ([[@VERSION]], _detalhes.userversion) - text = text:gsub ([[@CORE]], _detalhes.realversion) - - text = text:gsub ([[@TICKRATE]], _detalhes.update_speed) - text = text:gsub ([[@TICKHEALTH]], _detalhes:TimeLeft (_detalhes.atualizador) ~= 0 and "|cFF22FF22good|r" or "|cFFFF2222bad|r") - text = text:gsub ([[@TICKLAST]], _detalhes.LastUpdateTick .. " (" .. _detalhes._tempo - _detalhes.LastUpdateTick .. " seconds ago)") - text = text:gsub ([[@TICKNEXT]], _detalhes:TimeLeft (_detalhes.atualizador)) - - text = text:gsub ([[@COMBATID]], _detalhes.combat_id) - text = text:gsub ([[@COMBATCONTAINERS]], _detalhes.tabela_vigente[1] and _detalhes.tabela_vigente[2] and _detalhes.tabela_vigente[3] and _detalhes.tabela_vigente[4] and "|cFF22FF22good|r" or "|cFFFF2222bad|r") - text = text:gsub ([[@COMBATDAMAGEACTORS]], #_detalhes.tabela_vigente[1] and _detalhes.tabela_vigente[1]._ActorTable and #_detalhes.tabela_vigente[1]._ActorTable) - - text = text:gsub ([[@PARSERHEALTH]], _detalhes.parser_frame:GetScript ("OnEvent") == _detalhes.OnParserEvent and "|cFF22FF22good|r" or "|cFFFF2222bad|r") - - local captureStr = "" - for _ , captureName in ipairs (_detalhes.capture_types) do - if (_detalhes.capture_current [captureName]) then - captureStr = captureStr .. " " .. captureName .. ": |cFF22FF22okay|r" - else - captureStr = captureStr .. " " .. captureName .. ": |cFFFF2222X|r" - end - end - text = text:gsub ([[@PARSERCAPTURE]], captureStr) - - local instance = _detalhes:GetLowerInstanceNumber() - if (instance) then - instance = _detalhes:GetInstance (instance) - end - - if (instance) then - if (instance:IsEnabled()) then - text = text:gsub ([[@INSTANCESHOWN]], "|cFF22FF22good|r") - else - text = text:gsub ([[@INSTANCESHOWN]], "|cFFFFFF22not visible|r") - end - - text = text:gsub ([[@INSTANCESEGMENT]], (instance.showing == _detalhes.tabela_vigente and "|cFF22FF22good|r" or "|cFFFFFF22isn't the current combat object|r") .. (" window segment: " .. instance:GetSegment())) - - text = text:gsub ([[@INSTANCEDAMAGESTATUS]], (_detalhes._tempo - (_detalhes.LastFullDamageUpdate or 0)) < 3 and "|cFF22FF22good|r" or "|cFFFF2222last update registered is > than 3 seconds, is there actors to show?|r") - else - text = text:gsub ([[@INSTANCESHOWN]], "|cFFFFFF22not found|r") - text = text:gsub ([[@INSTANCESEGMENT]], "|cFFFFFF22not found|r") - text = text:gsub ([[@INSTANCEDAMAGESTATUS]], "|cFFFFFF22not found|r") - - end - - _detalhes.DebugWindow.TextBox:SetText (text) - - _detalhes.DebugWindow:Show() end --> debug combat log @@ -1591,15 +1502,8 @@ Damage Update Status: @INSTANCEDAMAGESTATUS return end - Details.coach.enabled = not Details.coach.enabled - - if (Details.coach.enabled) then - Details:Msg("Details! Coach enabled, good luck commander!") - Details:Msg("[|cFFAAFFAADetails! Coach|r] raid leader stay outside the raid.") - Details:Msg("[|cFFAAFFAADetails! Coach|r] assistants, at least one player inside the raid need to have assistant.") - Details:Msg("[|cFFAAFFAADetails! Coach|r] players have an updated version of Details!.") - Details.Coach.Server.EnableCoach() - + if (not Details.coach.enabled) then + Details.Coach.WelcomePanel() else Details:Msg("coach disabled.") Details.Coach.Disable()