Finished the first 'Alpha Version' of the Coach feature

This commit is contained in:
Tercio Jose
2020-12-19 19:25:11 -03:00
parent 4d1747f8a8
commit ec5fad443a
9 changed files with 318 additions and 308 deletions
+168 -2
View File
@@ -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
+104 -176
View File
@@ -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
+1 -2
View File
@@ -1108,12 +1108,11 @@ local default_profile = {
_detalhes.default_profile = default_profile
-- aqui fica as propriedades do jogador que no sero armazenadas no profile
local default_player_data = {
coach = {
enabled = false,
welcome_panel_pos = {}
},
--> force all fonts to have this outline
+2 -98
View File
@@ -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()