local f = CreateFrame("frame",nil,UIParent); HealerManaWatchSaved = {} local watching = {} local bars = {} local modactive = false --changes the bar size local barsize = {["width"]=50,["height"]=20} f:SetWidth(barsize.width) function f:OnLoad() f:SetScript("OnEvent",f.EventHandler); f:RegisterEvent("RAID_ROSTER_UPDATE"); f:RegisterEvent("PARTY_MEMBERS_CHANGED"); f:RegisterEvent("ADDON_LOADED"); end function f:CreateOrReturnBar(pos,playername,playercolor,online,isdead) if(not bars[pos]) then local d = CreateFrame("StatusBar",nil,f) d:SetStatusBarTexture("Interface\\TargetingFrame\\UI-StatusBar") d:GetStatusBarTexture():SetHorizTile(false) d:SetOrientation("HORIZONTAL") d:SetMinMaxValues(0,100) d:SetValue(100) d:SetWidth(barsize.width) d:SetHeight(barsize.height) d:SetBackdrop({bgFile = "Interface/RAIDFRAME/UI-RaidFrame-GroupBg"}); d.mtext = d:CreateFontString(nil, "OVERLAY", "TextStatusBarText"); d.mtext:SetPoint("CENTER", d); d.mtext:SetWidth(barsize.width) d.playername = d:CreateFontString(nil, "OVERLAY", "TextStatusBarText"); bars[pos] = d end if(online==nil or isdead==1) then f:SetDeadOrOffline(pos,online,isdead) else f:SetAlive(pos); end f:ShortenName(playername,bars[pos].playername); bars[pos].playername:SetWidth(barsize.width) bars[pos].playername:SetTextColor(playercolor.r,playercolor.g,playercolor.b); local textheight = bars[pos].playername:GetStringHeight() bars[pos].playername:SetWidth(barsize.width) bars[pos].playername:SetPoint("TOP",bars[pos],0,textheight); if(pos==1) then bars[pos]:SetPoint("TOPLEFT",f,0,-(textheight)); else bars[pos]:SetPoint("BOTTOM",bars[pos-1],0,-(bars[pos]:GetHeight()+textheight)); end f:SetHeight(pos*(textheight+barsize.height)) return bars[pos] end function f:SetAlive(pos) bars[pos]:SetStatusBarColor(0.0,0.0,1.0); end function f:SetDeadOrOffline(pos,online,isdead) bars[pos]:SetStatusBarColor(0.7,0.7,0.7); if(online==nil) then bars[pos].mtext:SetText("offline"); elseif(isdead==1) then bars[pos].mtext:SetText("dead"); end end function f:ShortenName(name,obj) obj:SetText(name); if(obj:GetStringWidth()>barsize.width) then for i=strlen(name),1,-1 do obj:SetText(strsub(name,1,i).."...") if(obj:GetStringWidth()<=barsize.width) then return; end end end end function f:EventHandler(event,...) if(event=="RAID_ROSTER_UPDATE") then if not(UnitInRaid("player")) then f:DisableMod(); f:RegisterEvent("PARTY_MEMBERS_CHANGED"); --reactive party watching on raid leave return; end local _,name,class,role watching = {} f:HideBars(); local run =1 for i=1,GetNumRaidMembers() do name,_,_,_,_,class,_,online,_,_,_,role = GetRaidRosterInfo(i); if(role=="HEALER") then watching["raid"..i]=run; isdead = UnitIsDeadOrGhost("raid"..i) local mb = f:CreateOrReturnBar(run,name,RAID_CLASS_COLORS[class],online,isdead) if(online==1 and isdead==nil) then f:UpdateMana("raid"..i,"MANA"); end mb:Show() run=run+1; end end if (modactive==false) then f:EnableMod() end elseif(event=="PARTY_MEMBERS_CHANGED") then if UnitInRaid("player") then f:UnregisterEvent("PARTY_MEMBERS_CHANGED"); --no need to use this if in raid return; elseif not(UnitInParty("player") then f:DisableMod(); end watching = {} f:HideBars(); if(UnitGroupRolesAssigned("player")=="HEALER") then unittowatch = "player"; else for i=1,GetNumPartyMembers() do if(UnitGroupRolesAssigned("party"..i) == "HEALER") then unittowatch = "party"..i; end end end if(unittowatch == nil) then if (modactive==true) then f:DisableMod(); modactive=false; end return; --no healer in party currently end local _,isdead,online,name,class; watching[unittowatch]=1; isdead = UnitIsDeadOrGhost(unittowatch); name = UnitName(unittowatch); online = UnitIsConnected(unittowatch); _,class = UnitClass(unittowatch); local mb = f:CreateOrReturnBar(1,name,RAID_CLASS_COLORS[class],online,isdead) if(online==1 and isdead==nil) then f:UpdateMana(unittowatch,"MANA"); end mb:Show() if (modactive==false) then f:EnableMod() end elseif(event=="UNIT_POWER" or event=="UNIT_MAXPOWER") then local unitid,powertype = ...; f:UpdateMana(unitid,powertype); elseif(event=="UNIT_FLAGS") then local unitid = ...; if(watching[unitid]) then f:UpdateMana(unitid,"MANA"); end elseif(event=="UNIT_CONNECTION") then local unitid = ...; if(watching[unitid]) then f:SetDeadOrOffline(watching[unitid],nil,nil) end elseif(event=="ADDON_LOADED") then local addonname = ...; if(addonname=="HealerManaWatch") then if not(HealerManaWatchSaved.points) then f:SetPoint("CENTER",UIParent); else f:SetPoint(unpack(HealerManaWatchSaved.points)) end end end end function f:EnableMod() f:RegisterEvent("UNIT_POWER") f:RegisterEvent("UNIT_MAXPOWER") f:RegisterEvent("UNIT_CONNECTION") f:RegisterEvent("UNIT_FLAGS") f:Show(); modactive=true; end function f:DisableMod() f:UnregisterEvent("UNIT_POWER") f:UnregisterEvent("UNIT_MAXPOWER") f:UnregisterEvent("UNIT_CONNECTION") f:UnregisterEvent("UNIT_FLAGS") modactive=false f:Hide(); end function f:HideBars() for _,v in pairs(bars) do v:Hide(); end end function f:UpdateMana(unitid,powertype) if(watching[unitid] and powertype=="MANA") then if(UnitIsDeadOrGhost(unitid)) then f:SetDeadOrOffline(watching[unitid],1,1) elseif(UnitIsConnected(unitid)==1) then f:SetAlive(watching[unitid]); local curmana = ceil(UnitPower(unitid)/UnitPowerMax(unitid) * 100); bars[watching[unitid]]:SetValue(curmana); bars[watching[unitid]].mtext:SetText(curmana.."%"); end end end f:Hide(); f:EnableMouse(true) f:RegisterForDrag("LeftButton"); f:SetMovable(true); f:SetScript("OnDragStart", function(self) if IsShiftKeyDown() then self:StartMoving() end end) f:SetScript("OnDragStop", function(self) self:StopMovingOrSizing(); local a,b,c,d,e = self:GetPoint(); if(b~=nil) then b=b:GetName(); end; HealerManaWatchSaved.points = {a,b,c,d,e} end); f:OnLoad();