----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- local Details = _G.Details local Loc = LibStub("AceLocale-3.0"):GetLocale ( "Details" ) local addonName, Details222 = ... local _ local upper = string.upper --lua local local ipairs = ipairs --lua local local pairs = pairs --lua local local _math_floor = math.floor --lua local local _math_max = math.max --lua local local _math_min = math.min --lua local local _math_random = math.random --lua local local type = type --lua local local _string_match = string.match --lua local local _string_format = string.format --lua local local loadstring = loadstring --lua local local select = select local tonumber = tonumber local strsplit = strsplit local _pcall = pcall local GetTime = GetTime local GetUnitName = _G.GetUnitName local UnitExists = UnitExists local UnitGUID = UnitGUID local IsInRaid = IsInRaid --wow api local local IsInGroup = IsInGroup --wow api local local GetNumGroupMembers = GetNumGroupMembers --wow api local local UnitAffectingCombat = UnitAffectingCombat --wow api local local _InCombatLockdown = InCombatLockdown --wow api local local playerRealmName = GetRealmName() local gump = Details.gump --details local local predicateFunc = function(spellIdToFind, casterName, _, name, icon, applications, dispelName, duration, expirationTime, sourceUnitId, isStealable, nameplateShowPersonal, spellId, canApplyAura, isBossAura, isFromPlayerOrPlayerPet, nameplateShowAll, timeMod, applications) if (spellIdToFind == spellId and UnitExists(sourceUnitId)) then if (casterName == Details:GetUnitNameForAPI(sourceUnitId)) then return true end end end do ---find the duration of a debuff by passing the spellId and the caster name ---@param unitId unit ---@param spellId spellid ---@param casterName actorname ---@return auraduration|nil auraDuration ---@return number|nil expirationTime function Details:FindDebuffDuration(unitId, spellId, casterName) local name, texture, count, debuffType, duration, expirationTime = AuraUtil.FindAura(predicateFunc, unitId, "HARMFUL", spellId, casterName) if (name) then return duration, expirationTime end end function Details:FindDebuffDurationByUnitName(targetString, spellId, casterString) local targetName = Details:Ambiguate(targetString) local casterName = Details:Ambiguate(casterString) return Details:FindDebuffDuration(targetName, spellId, casterName) end end do ---find the duration of a buff by passing the spellId and the caster name ---@param unitId unit ---@param spellId spellid ---@param casterName actorname ---@return auraduration|nil auraDuration ---@return number|nil expirationTime function Details:FindBuffDuration(unitId, spellId, casterName) --not called anywhere else except the function below local name, texture, count, debuffType, duration, expirationTime = AuraUtil.FindAura(predicateFunc, unitId, "HELPFUL", spellId, casterName) if (name) then return duration, expirationTime end end function Details:FindBuffDurationByUnitName(targetString, spellId, casterString) local targetName = Details:Ambiguate(targetString) local casterName = Details:Ambiguate(casterString) return Details:FindBuffDuration(targetName, spellId, casterName) end end do function Details:FindBuffCastedBy(unitId, buffSpellId, casterName) --not called anywhere else except the function below local auraName, texture, count, auraType, duration, expTime, sourceUnit, isStealable, nameplateShowPersonal, spellId, canApplyAura, isBossAura, playerOrPet, nameplateShowAll, timeMod, v1, v2, v3, v4, v5 = AuraUtil.FindAura(predicateFunc, unitId, "HELPFUL", buffSpellId, casterName) if (auraName) then return auraName, texture, count, auraType, duration, expTime, sourceUnit, isStealable, nameplateShowPersonal, spellId, canApplyAura, isBossAura, playerOrPet, nameplateShowAll, timeMod, v1, v2, v3, v4, v5 end end function Details:FindBuffCastedByUnitName(targetString, buffSpellId, casterString) local targetName = Details:Ambiguate(targetString) local casterName = Details:Ambiguate(casterString) return Details:FindBuffCastedBy(targetName, buffSpellId, casterName) end end ---return the unitId by passing a unit serial (guid) ---@param unitSerial serial ---@return unit|nil unitId function Details:FindUnitIDByUnitSerial(unitSerial) --target if (UnitExists("target")) then if (UnitGUID("target") == unitSerial) then return "target" end end --focus if (UnitExists("focus")) then if (UnitGUID("focus") == unitSerial) then return "focus" end end --boss for i = 1, 9 do local unitId = Details222.UnitIdCache.Boss[i] if (UnitExists(unitId)) then if (UnitGUID(unitId) == unitSerial) then return unitId end else break end end --nameplate for i = 1, 40 do local unitId = Details222.UnitIdCache.Nameplate[i] if (UnitExists(unitId)) then if (UnitGUID(unitId) == unitSerial) then return unitId end end end --arena enemies for i = 1, #Details222.UnitIdCache.Arena do local unitId = Details222.UnitIdCache.Arena[i] if (UnitExists(unitId)) then if (UnitGUID(unitId) == unitSerial) then return unitId end else break end end end ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --fade handler Details.FadeHandler = { frames = {} } --fade in is hidding the frame, it is the opposite of the stardard local fadeINFinishedCallback = function(frame) if (frame.fading_in) then frame.hidden = true frame.faded = true frame.fading_in = false frame:Hide() end end --fade out is showing the frame local fadeOUTFinishedCallback = function(frame) if (frame:IsShown() and frame.fading_out) then frame.hidden = false frame.faded = false frame.fading_out = false else frame:SetAlpha(0) end end local just_fade_func = function(frame) frame.hidden = false frame.faded = true frame.fading_in = false end local cancelFadeAnimation = function(frame) Details.FadeHandler.frames[frame] = nil end Details.FadeHandler.OnUpdateFrame = CreateFrame("frame", "DetailsFadeFrameOnUpdate", UIParent) Details.FadeHandler.OnUpdateFrame:SetScript("OnUpdate", function(self, deltaTime) for frame, frameSettings in pairs(Details.FadeHandler.frames) do local totalTime = frameSettings.totalTime local initAlpha = frameSettings.startAlpha local targetAlpha = frameSettings.endAlpha frameSettings.elapsed = frameSettings.elapsed + deltaTime local currentAlpha = Lerp(initAlpha, targetAlpha, frameSettings.elapsed / totalTime) if (frameSettings.elapsed >= totalTime) then frame:SetAlpha(targetAlpha) frameSettings.finishedCallback(frame) --remove the frame from the list Details.FadeHandler.frames[frame] = nil else frame:SetAlpha(currentAlpha) end end end) --fade in is hidding the frame local startFadeINAnimation = function(frame, totalTime, startAlpha, endAlpha, callbackFunc) frame.fading_out = nil frame.fading_in = true Details.FadeHandler.frames[frame] = { totalTime = totalTime or Details.fade_speed, startAlpha = startAlpha or frame:GetAlpha(), endAlpha = endAlpha or 0, finishedCallback = callbackFunc or fadeINFinishedCallback, elapsed = 0, } end --fade out is showing the frame local startFadeOUTAnimation = function(frame, totalTime, startAlpha, endAlpha, callbackFunc) frame.fading_in = nil frame.fading_out = true Details.FadeHandler.frames[frame] = { totalTime = totalTime or Details.fade_speed, startAlpha = startAlpha or frame:GetAlpha() or 0, endAlpha = endAlpha or 1, finishedCallback = callbackFunc or fadeOUTFinishedCallback, elapsed = 0, } end function Details.FadeHandler.Fader(frame, animationType, speed, hideType, param5) if (frame == nil) then frame, animationType, speed, hideType = animationType, speed, hideType, param5 end --if is a table, might be passed an instance object if (type(frame) == "table") then --is it an instance if (frame.meu_id) then local instance = frame --hide all bars in the instance if (hideType == "barras") then if (speed) then for i = 1, instance.rows_created do local instanceBar = instance.barras[i] Details.FadeHandler.Fader(instanceBar, animationType, speed) end return else speed = speed or Details.fade_speed for i = 1, instance.rows_created do local instanceBar = instance.barras[i] Details.FadeHandler.Fader(instanceBar, animationType, Details.fade_speed+(i/10)) end return end --instant hide all bars in the instance elseif (hideType == "hide_barras") then for i = 1, instance.rows_created do local instanceBar = instance.barras[i] if (instanceBar.fading_in or instanceBar.fading_out) then startFadeINAnimation(instanceBar, 0.01, instanceBar:GetAlpha(), instanceBar:GetAlpha()) end instanceBar.hidden = true instanceBar.faded = true instanceBar.fading_in = false instanceBar.fading_out = false instanceBar:Hide() instanceBar:SetAlpha(0) end return end --if is a framework widget elseif (frame.dframework) then frame = frame.widget end end speed = speed or Details.fade_speed --animationType = upper(animationType) --hide all instanceBars on all instances if (frame == "all") then for _, instancia in ipairs(Details.tabela_instancias) do if (hideType == "barras") then for i = 1, instancia.rows_created do local instanceBar = instancia.barras[i] Details.FadeHandler.Fader(instanceBar, animationType, speed+(i/10)) end end end return elseif (upper(animationType) == "IN") then --hide the frame --check if already hidden if (frame:GetAlpha() == 0 and frame.hidden and not frame.fading_out) then return --chekc if already with an animation going on elseif (frame.fading_in) then return end --cancel face out animation if exists if (frame.fading_out) then frame.fading_out = false end startFadeINAnimation(frame, speed, frame:GetAlpha(), 0) elseif (upper(animationType) == "OUT") then --show the frame if (frame:GetAlpha() == 1 and not frame.hidden and not frame.fading_in) then --ja esta na tela return elseif (frame.fading_out) then --j� ta com fading out return end if (frame.fading_in) then --se tiver uma anima��o de hidar em andamento se for true frame.fading_in = false end frame:Show() startFadeOUTAnimation(frame, speed, frame:GetAlpha(), 1.0) frame.fading_out = true elseif (animationType == 0) then --force show the frame frame.hidden = false frame.faded = false frame.fading_out = false frame.fading_in = false cancelFadeAnimation(frame) --cancel any ongoing animation frame:Show() frame:SetAlpha(1) elseif (animationType == 1) then --force hide the frame frame.hidden = true frame.faded = true frame.fading_out = false frame.fading_in = false cancelFadeAnimation(frame) --cancel any ongoing animation frame:SetAlpha(0) frame:Hide() elseif (animationType == -1) then --just fade to zero without hidding the frame --check already hidden if (frame:GetAlpha() == 0 and frame.hidden and not frame.fading_out) then return --check already hidding elseif (frame.fading_in) then return end if (frame.fading_out) then frame.fading_out = false end startFadeINAnimation(frame, speed, frame:GetAlpha(), 0, just_fade_func) elseif (upper(animationType) == "ALPHAANIM") then local value = speed local currentApha = frame:GetAlpha() frame:Show() if (currentApha < value) then if (frame.fading_in) then frame.fading_in = false end startFadeOUTAnimation(frame, Details.fade_speed, currentApha, value, function(frame) frame.fading_out = false end) else if (frame.fading_out) then frame.fading_out = false end startFadeINAnimation(frame, Details.fade_speed, currentApha, value, function(frame) frame.fading_in = false end) end --set a fixed alpha value elseif (upper(animationType) == "ALPHA") then local alphaAmount = speed if (frame.fading_in or frame.fading_out) then startFadeINAnimation(frame, speed, alphaAmount, alphaAmount) end frame.hidden = false frame.faded = false frame.fading_in = false frame.fading_out = false frame:Show() frame:SetAlpha(alphaAmount) end end ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --details api functions --get the npc id from guid function Details:GetNpcIdFromGuid (guid) local NpcId = select( 6, strsplit( "-", guid ) ) if (NpcId) then return tonumber( NpcId ) end return 0 end function Details:GetSourceFromNpcId (npcId) for index, container in ipairs(Details.tabela_vigente) do if (index <= 4) then local t = container._ActorTable for i = 1, #t do if (Details:GetNpcIdFromGuid (t[i].serial) == npcId) then return t[i].nome end end end end end function Details:GetRaidLeader() if (IsInRaid()) then for i = 1, GetNumGroupMembers() do local actorName, rank = GetRaidRosterInfo(i) if (rank == 2) then return actorName, "raid" .. i end end end end ---unpack a death table ---@param deathTable table ---@return actorname actorName name of the actor ---@return actorclass actorClass class of the actor ---@return unixtime deathTime unittime of when the death occurred ---@return combattime deathCombatTime time in seconds since the combat start ---@return timestring deathTimeString time in string format ---@return number maxHealth max health of the actor ---@return table deathEvents events that lead the actor to death ---@return {key1: unixtime, key2: spellid} ---@return specializationid specId function Details:UnpackDeathTable(deathTable) local deathevents = deathTable[1] local deathtime = deathTable[2] local playername = deathTable[3] local playerclass = deathTable[4] local playermaxhealth = deathTable[5] local deathtimestring = deathTable[6] local lastcooldown = deathTable.last_cooldown local deathcombattime = deathTable.dead_at local spec = deathTable.spec return playername, playerclass, deathtime, deathcombattime, deathtimestring, playermaxhealth, deathevents, lastcooldown, spec end ---get a random fraction number ---@return number function Details:GetOrderNumber() --anyString --local name = upper(anyString .. "zz") --local byte1 = abs(_string_byte(name, 2)-91) / 1000000 --return byte1 + abs(_string_byte(name, 1)-91) / 10000 return _math_random(1000, 9000) / 1000000 end --/script print(tonumber(4/1000000)) - 4e-006 --0.000004 --set all table keys to lower local temptable = {} function Details:LowerizeKeys (_table) for key, value in pairs(_table) do temptable [string.lower(key)] = value end temptable, _table = Details:Destroy(_table), temptable return _table end Details.ToKFunctions = {} --krKR by @yuk6196 (http://wow.curseforge.com/profiles/yuk6196) function Details:UseEastAsianNumericalSystem() --try to auto detect the language local symbol_1K, symbol_10K, symbol_1B if (LibStub("AceLocale-3.0"):NewLocale ("Details", "koKR")) then --Korea symbol_1K, symbol_10K, symbol_1B = "천", "만", "억" elseif (LibStub("AceLocale-3.0"):NewLocale ("Details", "zhCN")) then --China symbol_1K, symbol_10K, symbol_1B = "千", "万", "亿" elseif (LibStub("AceLocale-3.0"):NewLocale ("Details", "zhTW")) then --Taiwan symbol_1K, symbol_10K, symbol_1B = "千", "萬", "億" end --override, force details! to use symbols for a specific language. --usage: _detalhes:SetNumericalSystemOverride (language) language can be: "kr", "cn", "tw" --just in case the user mess up something if (type(Details.numerical_system_symbols) ~= "string") then Details.numerical_system_symbols = "auto" end --do the override if (Details.numerical_system_symbols ~= "auto") then local locale = string.lower(Details.numerical_system_symbols) if (locale == "kr") then symbol_1K, symbol_10K, symbol_1B = "천", "만", "억" elseif (locale == "cn") then symbol_1K, symbol_10K, symbol_1B = "千", "万", "亿" elseif (locale == "tw") then symbol_1K, symbol_10K, symbol_1B = "千", "萬", "億" end end if (not symbol_1K) then --if a english client is trying to use east asian numeral system and there is no override, let's just use the chinese as default. --if the user is from kr or tw and want to use english client, an override must be used. symbol_1K, symbol_10K, symbol_1B = "千", "万", "亿" end function Details:ToK (numero) if (numero > 100000000) then return _string_format ("%.2f", numero/100000000) .. symbol_1B elseif (numero > 10000) then return _string_format ("%.2f", numero/10000) .. symbol_10K elseif (numero > 1000) then return _string_format ("%.1f", numero/1000) .. symbol_1K end return _string_format ("%.0f", numero) end function Details:ToK2 (numero) if (numero > 99999999) then return _string_format ("%.2f", numero/100000000) .. symbol_1B elseif (numero > 999999) then return _string_format ("%.2f", numero/10000) .. symbol_10K elseif (numero > 99999) then return _math_floor(numero/10000) .. symbol_10K elseif (numero > 9999) then return _string_format ("%.1f", (numero/10000)) .. symbol_10K elseif (numero > 999) then return _string_format ("%.1f", (numero/1000)) .. symbol_1K end return _string_format ("%.1f", numero) end --short numbers no numbers after comma function Details:ToK0 (numero) if (numero > 100000000) then return _string_format ("%.0f", numero/100000000) .. symbol_1B elseif (numero > 10000) then return _string_format ("%.0f", numero/10000) .. symbol_10K elseif (numero > 1000) then return _string_format ("%.0f", numero/1000) .. symbol_1K end return _string_format ("%.0f", numero) end function Details:ToKMin (numero) if (numero > 100000000) then return _string_format ("%.2f", numero/100000000) .. symbol_1B elseif (numero > 10000) then return _string_format ("%.2f", numero/10000) .. symbol_10K elseif (numero > 1000) then return _string_format ("%.1f", numero/1000) .. symbol_1K end return _string_format ("%.0f", numero) end function Details:ToK2Min (numero) if (numero > 99999999) then return _string_format ("%.2f", numero/100000000) .. symbol_1B elseif (numero > 999999) then return _string_format ("%.2f", numero/10000) .. symbol_10K elseif (numero > 99999) then return _math_floor(numero/10000) .. symbol_10K elseif (numero > 9999) then return _string_format ("%.1f", (numero/10000)) .. symbol_10K elseif (numero > 999) then return _string_format ("%.1f", (numero/1000)) .. symbol_1K end return _string_format ("%.1f", numero) end --short numbers no numbers after comma function Details:ToK0Min (numero) if (numero > 100000000) then return _string_format ("%.0f", numero/100000000) .. symbol_1B elseif (numero > 10000) then return _string_format ("%.0f", numero/10000) .. symbol_10K elseif (numero > 1000) then return _string_format ("%.0f", numero/1000) .. symbol_1K end return _string_format ("%.0f", numero) end --short numbers no numbers after comma function Details:ToKReport (numero) if (numero > 100000000) then return _string_format ("%.2f", numero/100000000) .. symbol_1B elseif (numero > 10000) then return _string_format ("%.1f", numero/10000) .. symbol_10K elseif (numero > 1000) then return _string_format ("%.0f", numero/1000) .. symbol_1K end return numero end function Details:Format (n, custom) n = _math_floor(n) if (custom) then if (n > 99999999) then return _string_format (custom, n/100000000) .. symbol_1B elseif (n > 9999) then return _string_format (custom, n/10000) .. symbol_10K elseif (n > 999) then return _string_format (custom, (n/1000)) else return n end else return Details.ToKFunctions [Details.ps_abbreviation] (nil, n) end end --no changes function Details:NoToK (numero) return _math_floor(numero) end -- thanks http://richard.warburton.it function Details:comma_value (n) if (not n) then return "0" end n = _math_floor(n) if (n == 0) then return "0" end local left,num,right = _string_match (n,'^([^%d]*%d)(%d*)(.-)$') return left..(num:reverse():gsub('(%d%d%d)','%1,'):reverse())..right end function Details:comma_value_raw (n) local left,num,right = string.match(n,'^([^%d]*%d)(%d*)(.-)$') return left..(num:reverse():gsub('(%d%d%d)','%1,'):reverse())..right end Details:Destroy(Details.ToKFunctions) table.insert(Details.ToKFunctions, Details.NoToK) table.insert(Details.ToKFunctions, Details.ToK) table.insert(Details.ToKFunctions, Details.ToK2) table.insert(Details.ToKFunctions, Details.ToK0) table.insert(Details.ToKFunctions, Details.ToKMin) table.insert(Details.ToKFunctions, Details.ToK2Min) table.insert(Details.ToKFunctions, Details.ToK0Min) table.insert(Details.ToKFunctions, Details.comma_value) end function Details:UseWestNumericalSystem() --short numbers function Details:ToK (numero) if (numero > 999999999) then return format("%.2f", numero/1000000000) .. "B" elseif (numero > 1000000) then return _string_format ("%.2f", numero/1000000) .. "M" elseif (numero > 999) then return _string_format ("%.1f", numero/1000) .. "K" end return _string_format ("%.0f", numero) end function Details:ToK2 (numero) if (numero > 999999999) then return format("%.2f", numero/1000000000) .. "B" elseif (numero > 999999) then return _string_format ("%.2f", numero/1000000) .. "M" elseif (numero > 99999) then return _math_floor(numero/1000) .. "K" elseif (numero > 999) then return _string_format ("%.1f", (numero/1000)) .. "K" end return _string_format ("%.0f", numero) end --short numbers no numbers after comma function Details:ToK0 (numero) if (numero > 999999999) then return format("%.2f", numero/1000000000) .. "B" elseif (numero > 1000000) then return _string_format ("%.0f", numero/1000000) .. "M" elseif (numero > 1000) then return _string_format ("%.0f", numero/1000) .. "K" end return _string_format ("%.0f", numero) end function Details:ToKMin (numero) if (numero > 1000000) then return _string_format ("%.2f", numero/1000000) .. "m" elseif (numero > 1000) then return _string_format ("%.1f", numero/1000) .. "k" end return _string_format ("%.0f", numero) end function Details:ToK2Min (numero) if (numero > 999999) then return _string_format ("%.2f", numero/1000000) .. "m" elseif (numero > 99999) then return _math_floor(numero/1000) .. "k" elseif (numero > 999) then return _string_format ("%.1f", (numero/1000)) .. "k" end return _string_format ("%.0f", numero) end --short numbers no numbers after comma function Details:ToK0Min (numero) if (numero > 1000000) then return _string_format ("%.0f", numero/1000000) .. "m" elseif (numero > 1000) then return _string_format ("%.0f", numero/1000) .. "k" end return _string_format ("%.0f", numero) end --short numbers no numbers after comma function Details:ToKReport (numero) if (numero > 1000000) then return _string_format ("%.2f", numero/1000000) .. "M" elseif (numero > 1000) then return _string_format ("%.1f", numero/1000) .. "K" end return numero end function Details:Format (n, custom) n = _math_floor(n) if (custom) then if (n > 999999) then return _string_format (custom, n/1000000) .. "M" elseif (n > 999) then return _string_format (custom, (n/1000)) else return n end else return Details.ToKFunctions [Details.ps_abbreviation] (nil, n) end end --no changes function Details:NoToK (numero) return _math_floor(numero) end -- thanks http://richard.warburton.it function Details:comma_value (n) if (not n) then return "0" end n = _math_floor(n) if (n == 0) then return "0" end local left,num,right = _string_match (n,'^([^%d]*%d)(%d*)(.-)$') return left..(num:reverse():gsub('(%d%d%d)','%1,'):reverse())..right end function Details:comma_value_raw (n) local left,num,right = string.match(n,'^([^%d]*%d)(%d*)(.-)$') return left..(num:reverse():gsub('(%d%d%d)','%1,'):reverse())..right end Details:Destroy(Details.ToKFunctions) table.insert(Details.ToKFunctions, Details.NoToK) table.insert(Details.ToKFunctions, Details.ToK) table.insert(Details.ToKFunctions, Details.ToK2) table.insert(Details.ToKFunctions, Details.ToK0) table.insert(Details.ToKFunctions, Details.ToKMin) table.insert(Details.ToKFunctions, Details.ToK2Min) table.insert(Details.ToKFunctions, Details.ToK0Min) table.insert(Details.ToKFunctions, Details.comma_value) -- end --load western as default, the proper method is loaded within the profile Details:UseWestNumericalSystem() function Details:GetCurrentToKFunction() return Details.ToKFunctions [Details.ps_abbreviation] end --alias ---transfor an integer into a string separating thousands with a comma ---@param number number ---@return string function Details:CommaValue(number) return Details:comma_value(number) end ------------------------------------------------------------------------------------------------------------ --numerical system function Details:SetNumericalSystemOverride (language) if (not language) then language = "auto" end Details.numerical_system_symbols = language Details:Msg("NumSystem override is now:", language) Details:SelectNumericalSystem() end function Details:GetNumericalSystem() return Details.numerical_system end function Details:SelectNumericalSystem (system) if (not system or type(system) ~= "number") then system = Details.numerical_system or 1 end Details.numerical_system = system if (system == 1) then Details:UseWestNumericalSystem() elseif (system == 2) then Details:UseEastAsianNumericalSystem() end Details:UpdateToKFunctions() end function Details:UpdateToKFunctions() Details.atributo_damage:UpdateSelectedToKFunction() Details.atributo_heal:UpdateSelectedToKFunction() Details.atributo_energy:UpdateSelectedToKFunction() Details.atributo_misc:UpdateSelectedToKFunction() Details.atributo_custom:UpdateSelectedToKFunction() Details:RefreshMainWindow(-1, true) end --------end of ToK functions---- --replacing data for custom texts Details.string = {} local function_cache = {} local arguments_cache = {} local parameters_cache = {} local replace_arg = function(i) return arguments_cache [tonumber(i)] end local run_function = function(str) --cache functions local func, errortext = function_cache [str] if (not func) then func = loadstring (str) if (not func) then Details:Msg("|cFFFF9900error compiling script on custom text|r: ", errortext) return 0 end DetailsFramework:SetEnvironment(func) function_cache [str] = func end local okey, value = _pcall (func, parameters_cache [1], parameters_cache [2], parameters_cache [3], parameters_cache [4], arguments_cache[1], arguments_cache[2], arguments_cache[3]) if (not okey) then Details:Msg("|cFFFF9900error on custom text|r:", value) return 0 end return value or 0 end function Details.string.replace (str, v1, v2, v3, v4, v5, v6, v7) arguments_cache [1] = v1 arguments_cache [2] = v2 arguments_cache [3] = v3 parameters_cache [1] = v4 parameters_cache [2] = v5 parameters_cache [3] = v6 parameters_cache [4] = v7 return (str:gsub("{data(%d+)}", replace_arg):gsub("{func(.-)}", run_function)) end --remove a index from a hash table function Details:tableRemove (tabela, indexName) local newtable = {} for hash, value in pairs(tabela) do if (hash ~= indexName) then newtable [hash] = value end end return newtable end --return if the numeric table have an object function Details:tableIN (tabela, objeto) for index, valor in ipairs(tabela) do if (valor == objeto) then return index end end return false end --reverse numerical table function Details:reverse_table (t) local new = {} local index = 1 for i = #t, 1, -1 do new [index] = t[i] index = index + 1 end return new end Details.table = {} function Details.table.reverse (t) local new = {} local index = 1 for i = #t, 1, -1 do new [index] = t[i] index = index + 1 end return new end --yah, i know function Details.table.copy(t1, t2) for key, value in pairs(t2) do if (type(value) == "table") then t1 [key] = Details.CopyTable(value) else t1 [key] = value end end return t1 end function Details.table.deploy(t1, t2) for key, value in pairs(t2) do if (type(value) == "table") then t1 [key] = t1 [key] or {} Details.table.deploy(t1 [key], t2 [key]) elseif (t1 [key] == nil) then t1 [key] = value end end end function Details.table.overwrite (t1, t2) for key, value in pairs(t2) do if (type(value) == "table") then t1 [key] = t1 [key] or {} Details.table.overwrite (t1 [key], t2 [key]) else t1 [key] = value end end end function Details.table.dump (t, s, deep) if (type(t) == "number") then return t end s = s or "" deep = deep or 0 local space = "" for i = 1, deep do space = space .. " " end for key, value in pairs(t) do local tpe = type(value) if (type(key) == "function") then key = "#function#" elseif (type(key) == "table") then key = "#table#" end if (type(key) ~= "string" and type(key) ~= "number") then key = "unknown?" end if (tpe == "table") then if (type(key) == "number") then s = s .. space .. "[" .. key .. "] = |cFFa9ffa9table {|r\n" else s = s .. space .. "[\"" .. key .. "\"] = |cFFa9ffa9table {|r\n" end s = s .. Details.table.dump (value, nil, deep+1) s = s .. space .. "|cFFa9ffa9}|r\n" elseif (tpe == "string") then s = s .. space .. "[\"" .. key .. "\"] = '|cFFfff1c1" .. value .. "|r'\n" elseif (tpe == "number") then s = s .. space .. "[\"" .. key .. "\"] = |cFFffc1f4" .. value .. "|r\n" elseif (tpe == "function") then s = s .. space .. "|cFFa9a9ff[\"|r" .. key .. "|cFFa9a9ff\"]|r = |cFFa9a9fffunction()|r\n" elseif (tpe == "boolean") then s = s .. space .. "[\"" .. key .. "\"] = |cFF99d0ff" .. (value and "true" or "false") .. "|r\n" end end return s end function Details:hex (num) local hexstr = '0123456789abcdef' local s = '' while num > 0 do local mod = math.fmod(num, 16) s = string.sub(hexstr, mod+1, mod+1) .. s num = math.floor(num / 16) end if s == '' then s = '00' end if (string.len(s) == 1) then s = "0"..s end return s end function Details:percent_color (value, inverted) local r, g if (value < 50) then r = 255 else r = _math_floor( 255 - (value * 2 - 100) * 255 / 100) end if (value > 50) then g = 255 else g = _math_floor( (value * 2) * 255 / 100) end if (inverted) then return g/255, r/255, 0 else return r/255, g/255, 0 end end --unpack more than 1 table -- http://www.dzone.com/snippets/lua-unpack-multiple-tables function Details:unpacks (...) local values = {} for i = 1, select('#', ...) do for _, value in ipairs(select(i, ...)) do values[ #values + 1] = value end end return unpack(values) end --trim http://lua-users.org/wiki/StringTrim function Details:trim (s) local from = s:match"^%s*()" return from > #s and "" or s:match(".*%S", from) end -- lua base64 codec (c) 2006-2008 by Alex Kloss - http://www.it-rfc.de - licensed under the terms of the LGPL2 - http://lua-users.org/wiki/BaseSixtyFour do Details._encode = {} -- shift left local function lsh (value,shift) return (value*(2^shift)) % 256 end -- shift right local function rsh (value,shift) return math.floor(value/2^shift) % 256 end -- return single bit (for OR) local function bit (x,b) return (x % 2^b - x % 2^(b-1) > 0) end -- logic OR for number values local function lor (x,y) local result = 0 for p=1,8 do result = result + (((bit(x,p) or bit(y,p)) == true) and 2^(p-1) or 0) end return result end -- encryption table local base64chars = {[0]='A',[1]='B',[2]='C',[3]='D',[4]='E',[5]='F',[6]='G',[7]='H',[8]='I',[9]='J',[10]='K',[11]='L',[12]='M',[13]='N',[14]='O',[15]='P',[16]='Q',[17]='R',[18]='S',[19]='T',[20]='U',[21]='V',[22]='W',[23]='X',[24]='Y',[25]='Z',[26]='a',[27]='b',[28]='c',[29]='d',[30]='e',[31]='f',[32]='g',[33]='h',[34]='i',[35]='j',[36]='k',[37]='l',[38]='m',[39]='n',[40]='o',[41]='p',[42]='q',[43]='r',[44]='s',[45]='t',[46]='u',[47]='v',[48]='w',[49]='x',[50]='y',[51]='z',[52]='0',[53]='1',[54]='2',[55]='3',[56]='4',[57]='5',[58]='6',[59]='7',[60]='8',[61]='9',[62]='-',[63]='_'} -- function encode -- encodes input string to base64. function Details._encode:enc (data) local bytes = {} local result = "" for spos=0,string.len(data)-1,3 do for byte=1,3 do bytes[byte] = string.byte(string.sub(data,(spos+byte))) or 0 end result = string.format('%s%s%s%s%s',result,base64chars[rsh(bytes[1],2)],base64chars[lor(lsh((bytes[1] % 4),4), rsh(bytes[2],4))] or "=",((#data-spos) > 1) and base64chars[lor(lsh(bytes[2] % 16,2), rsh(bytes[3],6))] or "=",((#data-spos) > 2) and base64chars[(bytes[3] % 64)] or "=") end return result end -- decryption table local base64bytes = {['A']=0,['B']=1,['C']=2,['D']=3,['E']=4,['F']=5,['G']=6,['H']=7,['I']=8,['J']=9,['K']=10,['L']=11,['M']=12,['N']=13,['O']=14,['P']=15,['Q']=16,['R']=17,['S']=18,['T']=19,['U']=20,['V']=21,['W']=22,['X']=23,['Y']=24,['Z']=25,['a']=26,['b']=27,['c']=28,['d']=29,['e']=30,['f']=31,['g']=32,['h']=33,['i']=34,['j']=35,['k']=36,['l']=37,['m']=38,['n']=39,['o']=40,['p']=41,['q']=42,['r']=43,['s']=44,['t']=45,['u']=46,['v']=47,['w']=48,['x']=49,['y']=50,['z']=51,['0']=52,['1']=53,['2']=54,['3']=55,['4']=56,['5']=57,['6']=58,['7']=59,['8']=60,['9']=61,['-']=62,['_']=63,['=']=nil} -- function decode -- decode base64 input to string function Details._encode:Decode (data) local chars = {} local result="" for dpos=0,string.len(data)-1,4 do for char=1,4 do chars[char] = base64bytes[(string.sub(data,(dpos+char),(dpos+char)) or "=")] end result = string.format('%s%s%s%s',result,string.char(lor(lsh(chars[1],2), rsh(chars[2],4))),(chars[3] ~= nil) and string.char(lor(lsh(chars[2],4), rsh(chars[3],2))) or "",(chars[4] ~= nil) and string.char(lor(lsh(chars[3],6) % 192, (chars[4]))) or "") end return result end function Details._encode:Encode (s) return Details._encode:enc (s) end end --scale function Details:Scale (rangeMin, rangeMax, scaleMin, scaleMax, x) return 1 + (x - rangeMin) * (scaleMax - scaleMin) / (rangeMax - rangeMin) end --font color function Details:SetFontColor(fontString, r, g, b, a) r, g, b, a = gump:ParseColors(r, g, b, a) fontString:SetTextColor(r, g, b, a) end --font size function Details:SetFontSize(fontString, ...) local fonte, _, flags = fontString:GetFont() fontString:SetFont(fonte, _math_max (...), flags) end function Details:GetFontSize (fontString) local _, size = fontString:GetFont() return size end --font face function Details:SetFontFace (fontString, fontface) local _, size, flags = fontString:GetFont() fontString:SetFont(fontface, size, flags) end function Details:GetFontFace (fontString) local fontface = fontString:GetFont() return fontface end --font outline function Details:SetFontOutline (fontString, outline) local fonte, size = fontString:GetFont() if (outline) then if (type(outline) == "boolean" and outline) then outline = "OUTLINE" elseif (outline == 1) then outline = "OUTLINE" elseif (outline == 2) then outline = "THICKOUTLINE" end end if (Details.force_font_outline ~= "") then if (Details.force_font_outline == "OUTLINE") then outline = "OUTLINE" elseif (Details.force_font_outline == "THICKOUTLINE") then outline = "THICKOUTLINE" elseif (Details.force_font_outline == "MONOCHROME") then outline = "MONOCHROME" end end fontString:SetFont(fonte, size, outline) end function Details:UseOutline (outline) outline = outline or "" Details.force_font_outline = outline for ID, instance in Details:ListInstances() do if (instance:IsEnabled()) then instance:RefreshBars() instance:InstanceReset() instance:ReajustaGump() end end end ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --internal functions function Details:HealthTick() if (UnitExists("boss1") and IsInRaid() and IsInInstance()) then local health = (UnitHealth ("boss1") or 0) / (UnitHealthMax ("boss1") or 0) if (Details.boss1_health_percent) then if (Details.boss1_health_percent < health) then return end end Details.boss1_health_percent = health end end ---do tasks that need to run every second during the combat ---also check if all members of the group are in combat or not ---when no one is in combat, the combat is over ---@return boolean bIsInCombat if true, the comabt is still going on local combatTicker = function() Details:TimeDataTick() Details:BrokerTick() Details:HealthTick() local zoneName, zoneType = GetInstanceInfo() if (Details.Coach.Server.IsEnabled()) then if (Details.debug) then print("coach server is enabled, can't leave combat...") end return true --battleground elseif (zoneType == "pvp" and Details.use_battleground_server_parser) then return true --arena elseif (zoneType == "arena" or _InCombatLockdown()) then return true --is in combat elseif (UnitAffectingCombat("player")) then return true elseif (IsInRaid()) then local unitIdCache = Details222.UnitIdCache.Raid for i = 1, GetNumGroupMembers(), 1 do if (UnitAffectingCombat(unitIdCache[i])) then return true end end elseif (IsInGroup()) then local unitIdCache = Details222.UnitIdCache.Party for i = 1, GetNumGroupMembers()-1, 1 do if (UnitAffectingCombat(unitIdCache[i])) then return true end end end --coach feature if (not Details.Coach.Server.IsEnabled()) then if (Details.debug) then Details:Msg("coach is disabled, the combat is now over!") end end Details:StopCombatTicker() Details:SairDoCombate() return false end function Details:StartCombatTicker() if (Details.CombatTicker) then Details.CombatTicker:Cancel() end Details.CombatTicker = Details.Schedules.NewTicker(1, combatTicker) end function Details:StopCombatTicker() if (Details.CombatTicker) then Details.CombatTicker:Cancel() end end function Details:FindGUIDFromName (name) --deprecated? couldn't find any usage at november 2023 if (IsInRaid()) then for i = 1, GetNumGroupMembers(), 1 do local this_name, _ = UnitName ("raid"..i) if (this_name == name) then return UnitGUID("raid"..i) end end elseif (IsInGroup()) then for i = 1, GetNumGroupMembers()-1, 1 do local this_name, _ = UnitName ("party"..i) if (this_name == name) then return UnitGUID("party"..i) end end end if (UnitName ("player") == name or Details.playername == name) then return UnitGUID("player") end return nil end --[[ test grayscale ]] function Details:teste_grayscale() local instancia = Details.tabela_instancias[1] for i = 1, instancia.rows_created, 1 do local barra = instancia.barras[i] local red, green, blue, alpha = barra.textura:GetVertexColor() local grayscale = (red*0.03+green+blue) / 3 --grayscale lightness method gump:GradientEffect ( barra.textura, "texture", red, green, blue, alpha, grayscale, grayscale, grayscale, alpha, 1) end end local function frame_task (self, elapsed) self.FrameTime = self.FrameTime + elapsed if (self.HaveGradientEffect) then local done = false for index, ThisGradient in ipairs(self.gradientes) do if (not ThisGradient.done) then local percent = _math_min((GetTime() - ThisGradient.TimeStart) / ThisGradient.Duration * 100, 100) local red_now = ThisGradient.StartRed + (percent * ThisGradient.OnePercentRed) local green_now = ThisGradient.StartGreen + (percent * ThisGradient.OnePercentGreen) local blue_now = ThisGradient.StartBlue + (percent * ThisGradient.OnePercentBlue) local alpha_now = ThisGradient.StartAlpha + (percent * ThisGradient.OnePercentAlpha) red_now = Saturate(red_now) green_now = Saturate(green_now) blue_now = Saturate(blue_now) alpha_now = Saturate(alpha_now) if (ThisGradient.ObjectType == "frame") then ThisGradient.Object:SetBackdropColor(red_now, green_now, blue_now, alpha_now) elseif (ThisGradient.ObjectType == "texture") then ThisGradient.Object:SetVertexColor(red_now, green_now, blue_now, alpha_now) end if (percent == 100) then if (ThisGradient.Func) then local okey, errortext = _pcall (ThisGradient.Func, ThisGradient.FuncParam) if (not okey) then Details:Msg("GradientEffect() end function error:", errortext) end end ThisGradient.done = true done = true end end end if (done) then local _iter = {index = 1, data = self.gradientes [1]} while (_iter.data) do if (_iter.data.done) then _iter.data.Object.HaveGradientEffect = false table.remove (self.gradientes, _iter.index) _iter.data = self.gradientes [_iter.index] else _iter.index = _iter.index + 1 _iter.data = self.gradientes [_iter.index] end end if (#self.gradientes < 1) then self.HaveGradientEffect = false end end end if (not self.HaveGradientEffect) then self:SetScript("OnUpdate", nil) end end function gump:GradientEffect (Object, ObjectType, StartRed, StartGreen, StartBlue, StartAlpha, EndRed, EndGreen, EndBlue, EndAlpha, Duration, EndFunction, FuncParam) if (type(StartRed) == "table" and type(StartGreen) == "table") then Duration, EndFunction = StartBlue, StartAlpha EndRed, EndGreen, EndBlue, EndAlpha = unpack(StartGreen) StartRed, StartGreen, StartBlue, StartAlpha = unpack(StartRed) elseif (type(StartRed) == "table") then EndRed, EndGreen, EndBlue, EndAlpha, Duration, EndFunction = StartGreen, StartBlue, StartAlpha, EndRed, EndGreen, EndBlue StartRed, StartGreen, StartBlue, StartAlpha = unpack(StartRed) elseif (type(EndRed) == "table") then Duration, EndFunction = EndGreen, EndBlue EndRed, EndGreen, EndBlue, EndAlpha = unpack(EndRed) end if (not EndAlpha) then EndAlpha = 1.0 end if (not StartAlpha) then StartAlpha = 1.0 end if (not StartRed) then StartRed = 1.0 end if (not StartGreen) then StartGreen = 1.0 end if (not startBlue) then StartBlue = 1.0 end if (not EndRed or EndRed > 1.0) then EndRed = 1.0 end if (not EndGreen or EndGreen > 1.0) then EndGreen = 1.0 end if (not EndBlue or EndBlue > 1.0) then EndBlue = 1.0 end local GradientFrameControl = Details.listener GradientFrameControl.gradientes = GradientFrameControl.gradientes or {} for index = 1, #GradientFrameControl.gradientes do if (GradientFrameControl.gradientes[index].Object == Object) then GradientFrameControl.gradientes[index].done = true end end if (EndFunction and type(EndFunction) == "string") then EndFunction = loadstring (EndFunction) or false if (EndFunction) then DetailsFramework:SetEnvironment(EndFunction) end end GradientFrameControl.gradientes [#GradientFrameControl.gradientes+1] = { Object = Object, ObjectType = string.lower(ObjectType), Func = EndFunction, FuncParam = FuncParam, TimeStart = GetTime(), Duration = Duration, StartRed = StartRed, StartGreen = StartGreen, StartBlue = StartBlue, StartAlpha = StartAlpha, OnePercentRed = StartRed > EndRed and (StartRed - EndRed) / 100 * -1 or (EndRed - StartRed) / 100, OnePercentGreen = StartGreen > EndGreen and (StartGreen - EndGreen) / 100 * -1 or (EndGreen - StartGreen) / 100, OnePercentBlue = StartBlue > EndBlue and (StartBlue - EndBlue) / 100 * -1 or (EndBlue - StartBlue) / 100, OnePercentAlpha = StartAlpha > EndAlpha and (StartAlpha - EndAlpha) / 100 * -1 or (EndAlpha - StartAlpha) /100, } Object.HaveGradientEffect = true GradientFrameControl.HaveGradientEffect = true if (not GradientFrameControl:GetScript("OnUpdate")) then GradientFrameControl:SetScript("OnUpdate", frame_task) end end --work around to solve the UI Frame Flashes local onFinish = function(self) if (self.showWhenDone) then self.frame:SetAlpha(1) else self.frame:SetAlpha(0) self.frame:Hide() end if (self.onFinishFunc) then self:onFinishFunc (self.frame) end end local stop = function(self) local FlashAnimation = self.FlashAnimation FlashAnimation:Stop() end local flash = function(self, fadeInTime, fadeOutTime, flashDuration, showWhenDone, flashInHoldTime, flashOutHoldTime, loopType) local FlashAnimation = self.FlashAnimation local fadeIn = FlashAnimation.fadeIn local fadeOut = FlashAnimation.fadeOut fadeIn:Stop() fadeOut:Stop() fadeIn:SetDuration(fadeInTime or 1) fadeIn:SetEndDelay (flashInHoldTime or 0) fadeOut:SetDuration(fadeOutTime or 1) fadeOut:SetEndDelay (flashOutHoldTime or 0) FlashAnimation.duration = flashDuration FlashAnimation.loopTime = FlashAnimation:GetDuration() FlashAnimation.finishAt = GetTime() + flashDuration FlashAnimation.showWhenDone = showWhenDone FlashAnimation:SetLooping (loopType or "REPEAT") self:Show() self:SetAlpha(0) FlashAnimation:Play() end function gump:CreateFlashAnimation (frame, onFinishFunc, onLoopFunc) local FlashAnimation = frame:CreateAnimationGroup() FlashAnimation.fadeOut = FlashAnimation:CreateAnimation("Alpha") --fade out anime FlashAnimation.fadeOut:SetOrder (1) FlashAnimation.fadeOut:SetFromAlpha (0) FlashAnimation.fadeOut:SetToAlpha (1) FlashAnimation.fadeIn = FlashAnimation:CreateAnimation("Alpha") --fade in anime FlashAnimation.fadeIn:SetOrder (2) FlashAnimation.fadeIn:SetFromAlpha (0) FlashAnimation.fadeIn:SetToAlpha (1) frame.FlashAnimation = FlashAnimation FlashAnimation.frame = frame FlashAnimation.onFinishFunc = onFinishFunc FlashAnimation:SetScript("OnLoop", onLoopFunc) FlashAnimation:SetScript("OnFinished", onFinish) frame.Flash = flash frame.Stop = stop end --todo: remove the function creation everytime this function run. local fade_OUT_finished_func = function(frame) if (frame:IsShown() and frame.fading_out) then frame.hidden = false frame.faded = false frame.fading_out = false else frame:SetAlpha(0) end end local just_fade_func = function(frame) frame.hidden = false frame.faded = true frame.fading_in = false end local anim_OUT_alpha_func = function(frame) frame.fading_out = false end local anim_IN_alpha_func = function(frame) frame.fading_in = false end --this functions should be called anymore function gump:Fade (frame, tipo, velocidade, parametros) a = a + 1 --throw an error if called if (type(frame) == "table") then if (frame.meu_id) then --ups, � uma inst�ncia if (parametros == "barras") then --hida todas as barras da inst�ncia if (velocidade) then for i = 1, frame.rows_created, 1 do Details.FadeHandler.Fader(frame.barras[i], tipo, velocidade) end return else velocidade = velocidade or 0.3 for i = 1, frame.rows_created, 1 do Details.FadeHandler.Fader(frame.barras[i], tipo, 0.3+(i/10)) end return end elseif (parametros == "hide_barras") then --hida todas as barras da inst�ncia for i = 1, frame.rows_created, 1 do local esta_barra = frame.barras[i] if (esta_barra.fading_in or esta_barra.fading_out) then esta_barra.fadeInfo.finishedFunc = nil -- _UIFrameFadeIn (esta_barra, 0.01, esta_barra:GetAlpha(), esta_barra:GetAlpha()) end esta_barra.hidden = true esta_barra.faded = true esta_barra.fading_in = false esta_barra.fading_out = false esta_barra:Hide() esta_barra:SetAlpha(0) end return end elseif (frame.dframework) then frame = frame.widget end end velocidade = velocidade or 0.3 --esse ALL aqui pode dar merda com as inst�ncias n�o ativadas if (frame == "all") then --todas as inst�ncias for _, instancia in ipairs(Details.tabela_instancias) do if (parametros == "barras") then --hida todas as barras da inst�ncia for i = 1, instancia.rows_created, 1 do Details.FadeHandler.Fader(instancia.barras[i], tipo, velocidade+(i/10)) end end end elseif (upper (tipo) == "IN") then if (frame:GetAlpha() == 0 and frame.hidden and not frame.fading_out) then --ja esta escondida return elseif (frame.fading_in) then --ja esta com uma anima��o, se for true return end if (frame.fading_out) then --se tiver uma anima��o de aparecer em andamento se for true frame.fading_out = false end -- _UIFrameFadeIn (frame, velocidade, frame:GetAlpha(), 0) frame.fading_in = true frame.fadeInfo.finishedFunc = fade_IN_finished_func frame.fadeInfo.finishedArg1 = frame elseif (upper (tipo) == "OUT") then --aparecer if (frame:GetAlpha() == 1 and not frame.hidden and not frame.fading_in) then --ja esta na tela return elseif (frame.fading_out) then --j� ta com fading out return end if (frame.fading_in) then --se tiver uma anima��o de hidar em andamento se for true frame.fading_in = false end frame:Show() -- _UIFrameFadeOut (frame, velocidade, frame:GetAlpha(), 1.0) frame.fading_out = true frame.fadeInfo.finishedFunc = fade_OUT_finished_func frame.fadeInfo.finishedArg1 = frame elseif (tipo == 0) then --for�a o frame a ser mostrado frame.hidden = false frame.faded = false frame.fading_out = false frame.fading_in = false frame:Show() frame:SetAlpha(1) elseif (tipo == 1) then --for�a o frame a ser hidado frame.hidden = true frame.faded = true frame.fading_out = false frame.fading_in = false frame:SetAlpha(0) frame:Hide() elseif (tipo == -1) then --apenas da fade sem hidar if (frame:GetAlpha() == 0 and frame.hidden and not frame.fading_out) then --ja esta escondida return elseif (frame.fading_in) then --ja esta com uma anima��o, se for true return end if (frame.fading_out) then --se tiver uma anima��o de aparecer em andamento se for true frame.fading_out = false end -- _UIFrameFadeIn (frame, velocidade, frame:GetAlpha(), 0) frame.fading_in = true frame.fadeInfo.finishedFunc = just_fade_func frame.fadeInfo.finishedArg1 = frame elseif (upper (tipo) == "ALPHAANIM") then local value = velocidade local currentApha = frame:GetAlpha() frame:Show() if (currentApha < value) then if (frame.fading_in) then --se tiver uma anima��o de hidar em andamento se for true frame.fading_in = false frame.fadeInfo.finishedFunc = nil end -- _UIFrameFadeOut (frame, 0.3, currentApha, value) frame.fading_out = true frame.fadeInfo.finishedFunc = anim_OUT_alpha_func frame.fadeInfo.finishedArg1 = frame else if (frame.fading_out) then --se tiver uma anima��o de hidar em andamento se for true frame.fading_out = false frame.fadeInfo.finishedFunc = nil end -- _UIFrameFadeIn (frame, 0.3, currentApha, value) frame.fading_in = true frame.fadeInfo.finishedFunc = anim_IN_alpha_func frame.fadeInfo.finishedArg1 = frame end elseif (upper (tipo) == "ALPHA") then --setando um alpha determinado if (frame.fading_in or frame.fading_out) then frame.fadeInfo.finishedFunc = nil -- _UIFrameFadeIn (frame, velocidade, frame:GetAlpha(), frame:GetAlpha()) end frame.hidden = false frame.faded = false frame.fading_in = false frame.fading_out = false frame:Show() frame:SetAlpha(velocidade) end end function Details:name_space (barra) --if (barra.icone_secundario_ativo) then -- local tamanho = barra:GetWidth()-barra.lineText4:GetStringWidth()-16-barra:GetHeight() -- barra.lineText1:SetSize(tamanho-2, 15) --else barra.lineText1:SetSize(barra:GetWidth()-barra.lineText4:GetStringWidth()-18, 15) --end end function Details:name_space_info (barra) if (barra.icone_secundario_ativo) then local tamanho = barra:GetWidth()-barra.lineText4:GetStringWidth()-16-barra:GetHeight() barra.lineText1:SetSize(tamanho-10, 15) else local tamanho = barra:GetWidth()-barra.lineText4:GetStringWidth()-16 barra.lineText1:SetSize(tamanho-10, 15) end end function Details:name_space_generic (barra, separador) local texto_direita_tamanho = barra.lineText4:GetStringWidth() local tamanho = barra:GetWidth()-texto_direita_tamanho-16 if (separador) then barra.lineText1:SetSize(tamanho+separador, 10) barra.lineText4:SetSize(texto_direita_tamanho+15, 10) else barra.lineText1:SetSize(tamanho-10, 15) barra.lineText4:SetSize(texto_direita_tamanho+5, 15) end end