SmartHeal.default['healstack']=1 SmartHeal.StackValue=0 SmartHeal.HealStack={} SmartHeal.AddOnMessagePrefix="SMH" function SmartHeal:HealStackOnLoad() this:RegisterEvent("VARIABLES_LOADED") end function SmartHeal:HealStackOnEvent(event) if (event=="VARIABLES_LOADED") then this:RegisterEvent("SPELLCAST_START") this:RegisterEvent("SPELLCAST_STOP") this:RegisterEvent("SPELLCAST_FAILED") this:RegisterEvent("SPELLCAST_INTERRUPTED") this:RegisterEvent("CHAT_MSG_ADDON") elseif(event=="SPELLCAST_START") then SmartHeal.CastedSpell=arg1 SmartHeal.StackUnitId=SmartHeal.CacheUnitId SmartHeal.StackValue=SmartHeal.HealedValue or 0 SmartHeal:HealStack_OnCast(1) elseif(event=="SPELLCAST_STOP" or event=="SPELLCAST_INTERRUPTED") then SmartHeal:HealStack_OnCast(-1) SmartHeal.CastedSpell=nil SmartHeal.StackUnitId=nil SmartHeal.StackValue=0 elseif (event=="CHAT_MSG_ADDON" and arg1==SmartHeal.AddOnMessagePrefix) then SmartHeal:HealStack_ParseMsg() end end function SmartHeal:HealStack_OnCast(stacktype) if ( not SmartHeal.CastedSpell or not SmartHeal.StackUnitId or not SmartHeal.spellList or GetNumRaidMembers()==0 ) then return end local TargetName=UnitName(SmartHeal.StackUnitId) if ( SmartHeal:getConfig("healstack") and (SmartHeal.spellList[SmartHeal.CastedSpell] and not SmartHeal.spellList[SmartHeal.CastedSpell].HoT) and TargetName ) then if(not stacktype) then stacktype=1 end local msg="STACK "..TargetName.." "..floor(SmartHeal.StackValue*stacktype) SendAddonMessage(SmartHeal.AddOnMessagePrefix,msg,"RAID") end end function SmartHeal:HealStack_ParseMsg() local _,_,cmd,msg=string.find(arg2,"^(%w+) (.*)") if(cmd=="STACK") then SmartHeal:HealStackUpdate(msg) --SmartHeal:ErrorMsg(msg) end end function SmartHeal:HealStackUpdate(msg) local _,_,TargetName,StackValue=string.find(msg,"^(%w+) (%-?%d+)$") if (not TargetName or not StackValue) then return end if (SmartHeal.HealStack[TargetName]) then SmartHeal.HealStack[TargetName]=SmartHeal.HealStack[TargetName]+tonumber(StackValue) else SmartHeal.HealStack[TargetName]=tonumber(StackValue) end if (SmartHeal.HealStack[TargetName]<0) then SmartHeal.HealStack[TargetName]=0 end end function SmartHeal:HealStackOnUpdate() if (GetNumRaidMembers()==0 or SmartHeal.HealStackUpdating) then return end SmartHeal.HealStackUpdating=true local BarTables={ ["CT_RAMember"]={count=40}, ["CT_RA_EmergencyFrameFrame"]={count=5}, ["CT_RAMTGroupMember"]={count=10}, ["CT_RAPTGroupMember"]={count=10}, } for ParentFrame, properties in BarTables do for i=1,properties.count do local UnitId,unitName,CTRA_FrameName if (ParentFrame=="CT_RAMember") then CTRA_FrameName=ParentFrame..i UnitId="raid"..i unitName=UnitName("raid"..i) elseif(ParentFrame=="CT_RAMTGroupMember") then CTRA_FrameName=ParentFrame..i.."MTTT" unitName=getglobal(CTRA_FrameName).Name UnitId=GetUnitIdFromName(unitName) elseif (ParentFrame=="CT_RA_EmergencyFrameFrame" or ParentFrame=="CT_RAPTGroupMember") then CTRA_FrameName=ParentFrame..i unitName=getglobal(CTRA_FrameName).Name UnitId=GetUnitIdFromName(unitName) end local HPBarFrameName=CTRA_FrameName.."HPBar" local HPBarObj=getglobal(HPBarFrameName) local StackValue=0 if(UnitId and SmartHeal.HealStack[unitName] and SmartHeal.HealStack[unitName]>0) then StackValue=min((UnitHealthMax(UnitId)-UnitHealth(UnitId)),SmartHeal.HealStack[unitName]) end if(UnitId and UnitExists(UnitId) and not UnitIsDeadOrGhost(UnitId) and UnitIsConnected(UnitId) and UnitIsVisible(UnitId) and StackValue>0 and HPBarObj and HPBarObj:IsShown()) then getglobal(HPBarFrameName.."_SMHStack"):SetHeight(HPBarObj:GetHeight()) getglobal(HPBarFrameName.."_SMHStack"):SetPoint("TOPLEFT","$parent","TOPLEFT",UnitHealth(UnitId)/UnitHealthMax(UnitId)*HPBarObj:GetWidth(),0) getglobal(HPBarFrameName.."_SMHStack"):SetWidth(StackValue/UnitHealthMax(UnitId)*HPBarObj:GetWidth()) getglobal(HPBarFrameName.."_SMHStack"):Show() else getglobal(HPBarFrameName.."_SMHStack"):Hide() end end end SmartHeal.HealStackUpdating=nil end function GetUnitIdFromName(name1) for i=1,40 do local name2, rank, _, _, _, _, _, _, _ = GetRaidRosterInfo(i) if (name1 == name2 and rank) then return "raid"..i end end return nil end