Quantcast

libhealcomm workaround

Ou Junhui [08-15-21 - 06:36]
libhealcomm workaround
Filename
oUF/libs/LibHealComm-4.0/LibHealComm-4.0.lua
rBag/core.lua
rFilter_Zork/classes/hunter.lua
diff --git a/oUF/libs/LibHealComm-4.0/LibHealComm-4.0.lua b/oUF/libs/LibHealComm-4.0/LibHealComm-4.0.lua
index ff9a67f..d0ad708 100644
--- a/oUF/libs/LibHealComm-4.0/LibHealComm-4.0.lua
+++ b/oUF/libs/LibHealComm-4.0/LibHealComm-4.0.lua
@@ -85,8 +85,8 @@ local spellRankTableData = {
 	[8] = { 9839, 9857, 9758, 10329, 10928, 10395, 10839, 23568, 24413, 25233, 27259, 27220 },
 	[9] = { 9840, 9858, 9888, 25292, 10929, 10396, 18608, 25235 },
 	[10] = { 9841, 9889, 25315, 25357, 18610, 23567, 24414, 26980, 27135 },
-	[11] = { 25299, 25297, 30020, 27136, 25221, 25391, 27030 },
-	[12] = { 26981, 26978, 25222, 25396, 27031 },
+	[11] = { 25299, 25297, 30020, 27136, 25221, 25391 },
+	[12] = { 26981, 26978, 25222, 25396 },
 	[13] = { 26982, 26979 },
 }

@@ -126,6 +126,7 @@ HealComm.pendingHots = HealComm.pendingHots or {}
 HealComm.spellData = HealComm.spellData or {}
 HealComm.talentData = HealComm.talentData or {}
 HealComm.tempPlayerList = HealComm.tempPlayerList or {}
+HealComm.spellDesc = HealComm.spellDesc or {}

 if( not HealComm.unitToPet ) then
 	HealComm.unitToPet = {["player"] = "pet"}
@@ -133,10 +134,44 @@ if( not HealComm.unitToPet ) then
 	for i = 1, MAX_RAID_MEMBERS do HealComm.unitToPet["raid" .. i] = "raidpet" .. i end
 end

-local spellData, hotData, tempPlayerList, pendingHeals, pendingHots = HealComm.spellData, HealComm.hotData, HealComm.tempPlayerList, HealComm.pendingHeals, HealComm.pendingHots
+local spellDesc, spellData, hotData, tempPlayerList, pendingHeals, pendingHots = HealComm.spellDesc, HealComm.spellData, HealComm.hotData, HealComm.tempPlayerList, HealComm.pendingHeals, HealComm.pendingHots
 local equippedSetCache, itemSetsData, talentData = HealComm.equippedSetCache, HealComm.itemSetsData, HealComm.talentData
 local activeHots, activePets = HealComm.activeHots, HealComm.activePets

+--[[Added to try ID indexing for spell data access
+spellDesc: spell description table in format used by hotData previously
+hotData: index table to bound all spell IDs to their descriptions
+[spell id] = [spell description in spellDesc table]
+--]]
+
+--Function to set all entries of table T to specified Value
+local function Set (Value, T)
+	local set = {}
+	for _, l in ipairs(T) do
+		set[l] = Value
+	end
+	return set
+end
+
+--Function to append content of table T2 at the end of table T1
+local function TableAppend(T1, T2)
+	for i,v in pairs(T2) do
+		table.insert(T1, i, v)
+	end
+end
+
+--[[
+Function to add new spell to hot table
+Data: spell description table
+IDs: list of id for each rank of the spell
+--]]
+local function AddHot(Data, IDs)
+	table.insert(spellDesc, Data)
+	local idTable = Set(Data, IDs)
+	TableAppend(hotData, idTable)
+end
+--end
+
 -- Figure out what they are now since a few things change based off of this
 local playerClass = select(2, UnitClass("player"))

@@ -698,10 +733,6 @@ end

 local function calculateGeneralAmount(level, amount, spellPower, spModifier, healModifier)
 	local penalty = level > 20 and 1 or (1 - ((20 - level) * 0.0375))
-	if isTBC then
-		-- TBC added another downrank penalty
-		penalty = penalty * min(1, (level + 11) / playerLevel)
-	end

 	spellPower = spellPower * penalty

@@ -722,35 +753,25 @@ end

 --[[
 	What the different callbacks do:
-
 	AuraHandler: Specific aura tracking needed for this class, who has Beacon up on them and such
-
 	ResetChargeData: Due to spell "queuing" you can't always rely on aura data for buffs that last one or two casts, for example Divine Favor (+100% crit, one spell)
 	if you cast Holy Light and queue Flash of Light the library would still see they have Divine Favor and give them crits on both spells. The reset means that the flag that indicates
 	they have the aura can be killed and if they interrupt the cast then it will call this and let you reset the flags.
-
 	What happens in terms of what the client thinks and what actually is, is something like this:
-
 	UNIT_SPELLCAST_START, Holy Light -> Divine Favor up
 	UNIT_SPELLCAST_SUCCEEDED, Holy Light -> Divine Favor up (But it was really used)
 	UNIT_SPELLCAST_START, Flash of Light -> Divine Favor up (It's not actually up but auras didn't update)
 	UNIT_AURA -> Divine Favor up (Split second where it still thinks it's up)
 	UNIT_AURA -> Divine Favor faded (Client catches up and realizes it's down)
-
 	CalculateHealing: Calculates the healing value, does all the formula calculations talent modifiers and such
-
 	CalculateHotHealing: Used specifically for calculating the heals of hots
-
 	GetHealTargets: Who the heal is going to hit, used for setting extra targets for Beacon of Light + Paladin heal or Prayer of Healing.
 	The returns should either be:
-
 	"compressedGUID1,compressedGUID2,compressedGUID3,compressedGUID4", healthAmount
 	Or if you need to set specific healing values for one GUID it should be
 	"compressedGUID1,healthAmount1,compressedGUID2,healAmount2,compressedGUID3,healAmount3", -1
-
 	The latter is for cases like Glyph of Healing Wave where you need a heal for 1,000 on A and a heal for 200 on the player for B without sending 2 events.
 	The -1 tells the library to look in the GUId list for the heal amounts
-
 	**NOTE** Any GUID returned from GetHealTargets must be compressed through a call to compressGUID[guid]
 ]]

@@ -766,6 +787,17 @@ local function getBaseHealAmount(spellData, spellName, spellRank)
 	return average[min(playerLevel - requiresLevel + 1, #average)]
 end

+--Function copies functionality of getBaseHealAmount but uses spellID as an argument instead of spellName
+local function getBaseHealAmountBYID(spellData, spellID, spellRank)
+	spellData = spellData[spellID]
+	local average = spellData.averages[spellRank]
+	if type(average) == "number" then
+		return average
+	end
+	local requiresLevel = spellData.levels[spellRank]
+	return average[min(playerLevel - requiresLevel + 1, #average)]
+end
+
 if( playerClass == "DRUID" ) then
 	LoadClassData = function()
 		local GiftofNature = GetSpellInfo(17104)
@@ -779,9 +811,16 @@ if( playerClass == "DRUID" ) then
 		local EmpoweredRejuv = GetSpellInfo(33886) or "EmpoweredRejuv"
 		local EmpoweredTouch = GetSpellInfo(33879) or "EmpoweredTouch"

-		hotData[Regrowth] = { interval = 3, ticks = 7, coeff = isTBC and 0.7 or 0.5, levels = { 12, 18, 24, 30, 36, 42, 48, 54, 60, 65 }, averages = { 98, 175, 259, 343, 427, 546, 686, 861, 1064, 1274 }}
-		hotData[Rejuvenation] = { interval = 3, levels = { 4, 10, 16, 22, 28, 34, 40, 46, 52, 58, 60, 63, 69 }, averages = { 32, 56, 116, 180, 244, 304, 388, 488, 608, 756, 888, 932, 1060 }}
-		hotData[Lifebloom] = {interval = 1, ticks = 7, coeff = 0.52, dhCoeff = 0.34335, levels = {64}, averages = {273}, bomb = {600}}
+		--Regrowth
+		local RegrowthHot = { interval = 3, ticks = 7, coeff = isTBC and 0.7 or 0.5, levels = { 12, 18, 24, 30, 36, 42, 48, 54, 60, 65 },
+							averages = { 98, 175, 259, 343, 427, 546, 686, 861, 1064, 1274}}
+		AddHot(RegrowthHot, {8936, 8938, 8939, 8940, 8941, 9750, 9856, 9857, 9858, 26980})
+		--Rejuvenation
+		AddHot({ interval = 3, levels = { 4, 10, 16, 22, 28, 34, 40, 46, 52, 58, 60, 63, 69 },
+				averages = { 32, 56, 116, 180, 244, 304, 388, 488, 608, 756, 888, 932, 1060 }},
+				{774, 1058, 1430, 2090, 2091, 3627, 8910, 9839, 9840, 9841, 25299, 26981, 26982})
+		--Revewal
+		AddHot({interval = 1, ticks = 7, coeff = 0.52, dhCoeff = 0.34335, levels = {64}, averages = {273}, bomb = {600}}, {33763})

 		spellData[HealingTouch] = { levels = {1, 8, 14, 20, 26, 32, 38, 44, 50, 56, 60, 62, 69}, averages = {
 			{avg(37, 51), avg(37, 52), avg(38, 53), avg(39, 54), avg(40, 55)},
@@ -797,7 +836,7 @@ if( playerClass == "DRUID" ) then
 			{avg(2267, 2677), avg(2274, 2685), avg(2281, 2692), avg(2288, 2699), avg(2296, 2707), avg(2303, 2714)},
 			{avg(2364, 2790), avg(2371, 2798), avg(2378, 2805), avg(2386, 2813), avg(2393, 2820), avg(2401, 2827)},
 			{avg(2707, 3197), avg(2715, 3206)} }}
-		spellData[Regrowth] = {coeff = 0.5 * (2 / 3.5) , levels = hotData[Regrowth].levels, averages = {
+		spellData[Regrowth] = {coeff = 0.5 * (2 / 3.5) , levels = RegrowthHot.levels, averages = {
 			{avg(84, 98), avg(85, 100), avg(87, 102), avg(89, 104), avg(91, 106), avg(93, 107)},
 			{avg(164, 188), avg(166, 191), avg(169, 193), avg(171, 196), avg(174, 198), avg(176, 201)},
 			{avg(240, 274), avg(243, 278), avg(246, 281), avg(249, 284), avg(252, 287), avg(255, 290)},
@@ -856,7 +895,7 @@ if( playerClass == "DRUID" ) then
 		-- Calculate hot heals
 		CalculateHotHealing = function(guid, spellID)
 			local spellName, spellRank = GetSpellInfo(spellID), SpellIDToRank[spellID]
-			local healAmount = getBaseHealAmount(hotData, spellName, spellRank)
+			local healAmount = getBaseHealAmountBYID(hotData, spellID, spellRank)
 			local spellPower = GetSpellBonusHealing()
 			local healModifier = HealComm:GetHealModifier(guid) * playerHealModifier
 			local spModifier = 1
@@ -884,7 +923,7 @@ if( playerClass == "DRUID" ) then
 				end

 				local duration = 12
-				local ticks = duration / hotData[spellName].interval
+				local ticks = duration / hotData[spellID].interval

 				if( equippedSetCache["Stormrage"] >= 8 ) then
 					healAmount = healAmount + (healAmount / ticks) -- Add Tick Amount Gained by Set.
@@ -901,42 +940,42 @@ if( playerClass == "DRUID" ) then
 					healAmount = healAmount + 15
 				end
 			elseif( spellName == Regrowth ) then
-				spellPower = spellPower * hotData[spellName].coeff * (1 + talentData[EmpoweredRejuv].current)
-				spellPower = spellPower / hotData[spellName].ticks
-				healAmount = healAmount / hotData[spellName].ticks
+				spellPower = spellPower * hotData[spellID].coeff * (1 + talentData[EmpoweredRejuv].current)
+				spellPower = spellPower / hotData[spellID].ticks
+				healAmount = healAmount / hotData[spellID].ticks

 				totalTicks = 7
-
+
 				if( equippedSetCache["Nordrassil"] >= 2 ) then totalTicks = totalTicks + 2 end
-
+
 			elseif( spellName == Lifebloom ) then
 				-- Figure out the bomb heal, apparently Gift of Nature double dips and will heal 10% for the HOT + 10% again for the direct heal
 				local bombSpellPower = spellPower
 				if( playerCurrentRelic and bloomBombIdols[playerCurrentRelic] ) then
 					bombSpellPower = bombSpellPower + bloomBombIdols[playerCurrentRelic]
 				end
-
-				local bombSpell = bombSpellPower * hotData[spellName].dhCoeff * (1 + talentData[EmpoweredRejuv].current)
-				bombAmount = math.ceil(calculateGeneralAmount(hotData[spellName].levels[spellRank], hotData[spellName].bomb[spellRank], bombSpell, spModifier, healModifier))
-
+
+				local bombSpell = bombSpellPower * hotData[spellID].dhCoeff * (1 + talentData[EmpoweredRejuv].current)
+				bombAmount = math.ceil(calculateGeneralAmount(hotData[spellID].levels[spellRank], hotData[spellID].bomb[spellRank], bombSpell, spModifier, healModifier))
+
 				-- Figure out the hot tick healing
-				spellPower = spellPower * (hotData[spellName].coeff * (1 + talentData[EmpoweredRejuv].current))
-
+				spellPower = spellPower * (hotData[spellID].coeff * (1 + talentData[EmpoweredRejuv].current))
+
 				-- Idol of the Emerald Queen, +47 SP per tick
 				if( playerCurrentRelic == 27886 ) then
 					spellPower = spellPower + 47
 				end
-
-				spellPower = spellPower / hotData[spellName].ticks
-				healAmount = healAmount / hotData[spellName].ticks
+
+				spellPower = spellPower / hotData[spellID].ticks
+				healAmount = healAmount / hotData[spellID].ticks
 				-- Figure out total ticks
 				totalTicks = 7
-
+
 			end

-			healAmount = calculateGeneralAmount(hotData[spellName].levels[spellRank], healAmount, spellPower, spModifier, healModifier)
+			healAmount = calculateGeneralAmount(hotData[spellID].levels[spellRank], healAmount, spellPower, spModifier, healModifier)

-			return HOT_HEALS, ceil(healAmount), totalTicks, hotData[spellName].interval, bombAmount
+			return HOT_HEALS, ceil(healAmount), totalTicks, hotData[spellID].interval, bombAmount
 		end

 		-- Calcualte direct and channeled heals
@@ -960,22 +999,22 @@ if( playerClass == "DRUID" ) then
 				spellPower = spellPower * spellData[spellName].coeff
 			-- Healing Touch
 			elseif( spellName == HealingTouch ) then
-
+
 				healAmount = healAmount + (spellPower * talentData[EmpoweredTouch].current)
-
+
 				local castTime = spellRank >= 5 and 3.5 or (spellRank == 4 and 3 or (spellRank == 3 and 2.5 or (spellRank == 2 and 2 or 1.5)))
 				spellPower = spellPower * (castTime / 3.5)
-
+
 				if( playerCurrentRelic == 22399 ) then
 					healAmount = healAmount + 100
 				elseif( playerCurrentRelic == 28568 ) then
 					healAmount = healAmount + 136
 				end
-
+
 				if equippedSetCache["Thunderheart"] >= 4 then
 					healModifier = healModifier + 0.05
 				end
-
+
 			-- Tranquility
 			elseif( spellName == Tranquility ) then
 				spellPower = spellPower * spellData[spellName].coeff * (1 + talentData[EmpoweredRejuv].current)
@@ -1138,10 +1177,14 @@ if( playerClass == "PRIEST" ) then
 		local EmpoweredHealing = GetSpellInfo(33158) or "Empowered Healing"
 		local Renewal = GetSpellInfo(37563) or "Renewal" -- T4 bonus

-		hotData[Renew] = {coeff = 1, interval = 3, ticks = 5, levels = {8, 14, 20, 26, 32, 38, 44, 50, 56, 60, 65, 70}, averages = {
+		--Renew
+		local RenewData = {coeff = 1, interval = 3, ticks = 5, levels = {8, 14, 20, 26, 32, 38, 44, 50, 56, 60, 65, 70}, averages = {
 			45, 100, 175, 245, 315, 400, 510, 650, 810, 970, 1010, 1110 }}
-		hotData[GreaterHealHot] = hotData[Renew]
-		hotData[Renewal] = {coeff = 0, interval = 3, ticks = 3, levels = {70}, averages = {150}}
+		AddHot(RenewData, {139, 6074, 6075, 6076, 6077, 6078, 10927, 10928, 10929, 25315, 25221, 25222})
+		--GreaterHealHot
+		AddHot(RenewData, {22009})
+		--Renewal
+		AddHot({coeff = 0, interval = 3, ticks = 3, levels = {70}, averages = {150}}, {37563})

 		spellData[FlashHeal] = {coeff = 1.5 / 3.5, levels = {20, 26, 32, 38, 44, 50, 56, 61, 67}, averages = {
 			{avg(193, 237), avg(194, 239), avg(196, 241), avg(198, 243),  avg(200, 245), avg(202, 247)},
@@ -1216,7 +1259,7 @@ if( playerClass == "PRIEST" ) then

 		CalculateHotHealing = function(guid, spellID)
 			local spellName, spellRank = GetSpellInfo(spellID), SpellIDToRank[spellID]
-			local healAmount = getBaseHealAmount(hotData, spellName, spellRank)
+			local healAmount = getBaseHealAmountBYID(hotData, spellID, spellRank)
 			local spellPower = GetSpellBonusHealing()
 			local healModifier = HealComm:GetHealModifier(guid) * playerHealModifier
 			local spModifier = 1
@@ -1238,7 +1281,7 @@ if( playerClass == "PRIEST" ) then
 				end

 				local duration = 15
-				local ticks = hotData[spellName].ticks
+				local ticks = hotData[spellID].ticks

 				if( equippedSetCache["Oracle"] >= 5 or equippedSetCache["Avatar"] >= 4 ) then
 					healAmount = healAmount + (healAmount / ticks) -- Add Tick Amount Gained by Set.
@@ -1252,8 +1295,8 @@ if( playerClass == "PRIEST" ) then
 				healAmount = healAmount / ticks
 			end

-			healAmount = calculateGeneralAmount(hotData[spellName].levels[spellRank], healAmount, spellPower, spModifier, healModifier)
-			return HOT_HEALS, ceil(healAmount), totalTicks, hotData[spellName].interval
+			healAmount = calculateGeneralAmount(hotData[spellID].levels[spellRank], healAmount, spellPower, spModifier, healModifier)
+			return HOT_HEALS, ceil(healAmount), totalTicks, hotData[spellID].interval
 		end

 		-- If only every other class was as easy as Paladins
@@ -1375,13 +1418,13 @@ if( playerClass == "SHAMAN" ) then
 			-- Chain Heal
 			if( spellName == ChainHeal ) then
 				spellPower = spellPower * spellData[spellName].coeff
-
+
 				if( equippedSetCache["Skyshatter"] >= 4 ) then
 					healModifier = healModifier * 1.05
 				end
-
+
 				healModifier = healModifier * (1 + talentData[ImpChainHeal].current)
-
+
 				if playerCurrentRelic == 28523 then healAmount = healAmount + 87 end
 			-- Heaing Wave
 			elseif( spellName == HealingWave ) then
@@ -1392,9 +1435,9 @@ if( playerClass == "SHAMAN" ) then
 				--healModifier = healModifier * (talentData[HealingWay].spent == 3 and 1.25 or talentData[HealingWay].spent == 2 and 1.16 or talentData[HealingWay].spent == 1 and 1.08 or 1)

 				local castTime = spellRank > 3 and 3 or spellRank == 3 and 2.5 or spellRank == 2 and 2 or 1.5
-
+
 				if playerCurrentRelic == 27544 then spellPower = spellPower + 88 end
-
+
 				spellPower = spellPower * (castTime / 3.5)

 			-- Lesser Healing Wave
@@ -1521,7 +1564,7 @@ end
 -- Keep track of where all the data should be going
 local instanceType
 local function updateDistributionChannel()
-	if( instanceType == "pvp" or instanceType == "arena" ) then
+	if( instanceType == "pvp" ) then
 		distribution = "INSTANCE_CHAT"
 	elseif( IsInRaid() ) then
 		distribution = "RAID"
@@ -1840,21 +1883,21 @@ end
 local function parseHotBomb(casterGUID, wasUpdated, spellID, amount, ...)
 	local spellName, spellRank = GetSpellInfo(spellID)
 	if( not amount or not spellName or select("#", ...) == 0 ) then return end
-
+
 	-- If we don't have a pending hot then there is no bomb as far as were concerned
 	local hotPending = pendingHots[casterGUID] and pendingHots[casterGUID][spellName]
 	if( not hotPending or not hotPending.bitType ) then return end
 	hotPending.hasBomb = true
-
+
 	pendingHeals[casterGUID] = pendingHeals[casterGUID] or {}
 	pendingHeals[casterGUID][spellName] = pendingHeals[casterGUID][spellName] or {}
-
+
 	local pending = pendingHeals[casterGUID][spellName]
 	pending.endTime = hotPending.endTime
 	pending.spellID = spellID
 	pending.bitType = BOMB_HEALS
 	pending.stack = 1 -- TBC Lifebloom bomb heal does not stack
-
+
 	loadHealList(pending, amount, pending.stack, pending.endTime, nil, ...)

 	if( not wasUpdated ) then
@@ -2099,14 +2142,14 @@ function HealComm:COMBAT_LOG_EVENT_UNFILTERED(...)

 	-- New hot was applied
 	elseif( ( eventType == "SPELL_AURA_APPLIED" or eventType == "SPELL_AURA_REFRESH" or eventType == "SPELL_AURA_APPLIED_DOSE" ) and bit.band(sourceFlags, COMBATLOG_OBJECT_AFFILIATION_MINE) == COMBATLOG_OBJECT_AFFILIATION_MINE ) then
-		if( hotData[spellName] ) then
+		if( hotData[spellID] ) then
 			-- Single target so we can just send it off now thankfully
 			local bitType, amount, totalTicks, tickInterval, bombAmount = CalculateHotHealing(destGUID, spellID)
 			if( bitType ) then
 				local targets, amt = GetHealTargets(type, destGUID, max(amount, 0), spellID)
 				if targets then
 					parseHotHeal(sourceGUID, false, spellID, amt, totalTicks, tickInterval, strsplit(",", targets))
-
+
 					-- Hot with a bomb!
 					if( bombAmount ) then
 						local bombTargets, bombAmount = GetHealTargets(BOMB_HEALS, destGUID, math.max(bombAmount, 0), spellName)
@@ -2143,19 +2186,19 @@ function HealComm:COMBAT_LOG_EVENT_UNFILTERED(...)
 			local amount = getRecord(pending, destGUID)
 			if( amount ) then
 				parseHotHeal(sourceGUID, true, spellID, amount, pending.totalTicks, pending.tickInterval, compressGUID[destGUID])
-
+
 				-- Plant the bomb
 				local bombPending = pending.hasBomb and pendingHeals[sourceGUID][spellName]
 				if( bombPending and bombPending.bitType ) then
 					local bombAmount = getRecord(bombPending, destGUID)
 					if( bombAmount ) then
 						parseHotBomb(sourceGUID, true, spellID, bombAmount, compressGUID[destGUID])
-
+
 						sendMessage(string.format("UB:%s:%d:%d:%s:%d:%d:%s", pending.totalTicks, spellID, bombAmount, compressGUID[destGUID], amount, pending.tickInterval, compressGUID[destGUID]))
 						return
 					end
 				end
-
+
 				sendMessage(string.format("U:%s:%d:%d:%d:%s", spellID, amount, pending.totalTicks, pending.tickInterval, compressGUID[destGUID]))
 			end
 		end
@@ -2164,7 +2207,7 @@ function HealComm:COMBAT_LOG_EVENT_UNFILTERED(...)
 		if compressGUID[destGUID] then
 			-- Hot faded that we cast
 			local pending = pendingHots[playerGUID] and pendingHots[playerGUID][spellName]
-			if hotData[spellName] then
+			if hotData[spellID] then
 				parseHealEnd(sourceGUID, pending, "id", spellID, false, compressGUID[destGUID])
 				sendMessage(format("HS::%d::%s", spellID, compressGUID[destGUID]))
 			elseif spellData[spellName] and spellData[spellName]._isChanneled then
@@ -2204,7 +2247,7 @@ function HealComm:UNIT_SPELLCAST_SENT(unit, targetName, castGUID, spellID)
 	local spellName = GetSpellInfo(spellID)
 	if(unit ~= "player") then return end

-	if hotData[spellName] or spellData[spellName] then
+	if hotData[spellID] or spellData[spellName] then
 		targetName = targetName or UnitName("player")

 		castTarget = gsub(targetName, "(.-)%-(.*)$", "%1")
@@ -2600,6 +2643,7 @@ function HealComm:OnInitialize()
 	wipe(hotData)
 	wipe(itemSetsData)
 	wipe(talentData)
+	wipe(spellDesc)

 	-- Load all of the classes formulas and such
 	if LoadClassData then
@@ -2609,11 +2653,8 @@ function HealComm:OnInitialize()
 	do
 		local FirstAid = GetSpellInfo(746)

-		spellData[FirstAid] = {
-			ticks = {6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8},
-			interval = 1,
-			averages = {66, 114, 161, 301, 400, 640, 800, 1104, 1360, 2000, 2800, 3400}
-		}
+		spellData[FirstAid] = { ticks = {6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 10}, interval = 1, averages = {
+			66, 114, 161, 301, 400, 640, 800, 1104, 1360, 2000} }

 		local _GetHealTargets = GetHealTargets

@@ -2736,4 +2777,10 @@ function HealComm:PLAYER_LOGIN()

 	self:ZONE_CHANGED_NEW_AREA()
 	self:GROUP_ROSTER_UPDATE()
+end
+
+if( not IsLoggedIn() ) then
+	HealComm.eventFrame:RegisterEvent("PLAYER_LOGIN")
+else
+	HealComm:PLAYER_LOGIN()
 end
\ No newline at end of file
diff --git a/rBag/core.lua b/rBag/core.lua
index d422a7f..3b1e228 100644
--- a/rBag/core.lua
+++ b/rBag/core.lua
@@ -123,8 +123,8 @@ function Bags:CreateContainer(storagetype, ...)
 	Container:SetScale(1)
 	Container:SetWidth(((ButtonSize + ButtonSpacing) * ItemsPerRow) + 22 - ButtonSpacing)
 	Container:SetPoint(...)
-	-- Container:SetFrameStrata("HIGH")
-	-- Container:SetFrameLevel(1)
+	Container:SetFrameStrata("MEDIUM")
+	Container:SetFrameLevel(1)
 	Container:Hide()
     L.F.CreateBackdrop(Container)
 	Container:EnableMouse(true)
diff --git a/rFilter_Zork/classes/hunter.lua b/rFilter_Zork/classes/hunter.lua
index 84c99ee..d2efca6 100644
--- a/rFilter_Zork/classes/hunter.lua
+++ b/rFilter_Zork/classes/hunter.lua
@@ -40,12 +40,12 @@ if L.C.playerClass == "HUNTER" then
   -- rFilter:CreateBuff(212283,"player",36,{"TOPLEFT",oUF_SimplePlayer,"TOPRIGHT",176,0},"show",{0,1},true,nil)
   rFilter:CreateCooldown(14286,36,{"TOPLEFT",oUF_SimplePlayer,"TOPRIGHT",176,0},"[combat]show;hide",{0.2,1},true)

-  -- 法力分流, row 2 col 1
-  rFilter:CreateBuff(28734,"player",24,{"TOPLEFT",oUF_SimplePlayer,"TOPRIGHT",8,-42},"show",{0,1},true,nil)
-  rFilter:CreateCooldown(28734,24,{"TOPLEFT",oUF_SimplePlayer,"TOPRIGHT",8,-42},"[combat]show;hide",{0.2,1},true)
-  -- 法力洪流, row 2 col 2
-  rFilter:CreateDebuff(28730,"target",24,{"TOPLEFT",oUF_SimplePlayer,"TOPRIGHT",38,-42},"show",{0,1},true,nil)
-  rFilter:CreateCooldown(28730,24,{"TOPLEFT",oUF_SimplePlayer,"TOPRIGHT",38,-42},"[combat]show;hide",{0.2,1},true)
+  -- 多重射击, row 2 col 1
+  -- rFilter:CreateBuff(35099,"player",24,{"TOPLEFT",oUF_SimplePlayer,"TOPRIGHT",8,-42},"show",{0,1},true,nil)
+  rFilter:CreateCooldown(27021,24,{"TOPLEFT",oUF_SimplePlayer,"TOPRIGHT",8,-42},"[combat]show;hide",{0.2,1},true)
+  -- mislead, row 2 col 2
+  rFilter:CreateBuff(34477,"player",24,{"TOPLEFT",oUF_SimplePlayer,"TOPRIGHT",38,-42},"show",{0,1},true,nil)
+  rFilter:CreateCooldown(34477,24,{"TOPLEFT",oUF_SimplePlayer,"TOPRIGHT",38,-42},"[combat]show;hide",{0.2,1},true)
   -- 假死, row 2 col 3
   rFilter:CreateBuff(5384,"player",24,{"TOPLEFT",oUF_SimplePlayer,"TOPRIGHT",68,-42},"show",{0,1},true,nil)
   rFilter:CreateCooldown(5384,24,{"TOPLEFT",oUF_SimplePlayer,"TOPRIGHT",68,-42},"[combat]show;hide",{0.2,1},true)