--[[ sThreatMeter Copyright (c) 2008, Shantalya All rights reserved. ]] --[[ KONFIGURATION - START ]]-- local firstBar = { "TOPLEFT", UIParent, "BOTTOMLEFT",15, 200 }; -- Die erste Threatbar, wo soll sie stehen? /!\ Alle 5 Argumente müssen vorhanden sein /!\ local nextBar = { "TOP", "BOTTOM", 0, -2 }; -- Die folgenden Threatbars, wo sollen sie an der ersten/nächsten Threatbar stehen? /!\ Alle 4 Argumente müssen vorhanden sein /!\ local barWidth = 100; -- Die Breite der Threatbar local barHeight = 12; -- Die Höhe der Threatbar local textSize = 12; -- Die Schriftgröße local textFont = "Fonts\\MORPHEUS.ttf"; -- Die Schriftart local textLeft = "%2$s"; -- Standard: %d. %2$s || %d = Spielerposition, %2$s = Spielername local textRight = "%2$s."; --- Standard: %s | %2$s%% || %s = Bedrohungswert, %2$s = Bedrohungsprozentzahl, %% = Prozentzeichen local fullPerc = false; -- true = 005%, false = 5% local statusBarTexture = nil; -- Textur der Threatbar local numBars = 5; -- Maximale Threatbars, die angezeigt werden sollen. --[[ KONFIGURATION - ENDE ]]-- local frame = CreateFrame("Frame", "sThreatmeter", UIParent); local myTarget; local bars = {}; local threatlist = {}; function comma_value(n) local left,num,right = string.match(n,'^([^%d]*%d)(%d*)(.-)$') return left..(num:reverse():gsub('(%d%d%d)','%1,'):reverse())..right end function ColorGradient(perc, ...) if perc >= 1 then local r, g, b = select(select('#', ...) - 2, ...) return r, g, b elseif perc <= 0 then local r, g, b = ... return r, g, b end local num = select('#', ...) / 3 local segment, relperc = math.modf(perc*(num-1)) local r1, g1, b1, r2, g2, b2 = select((segment*3)+1, ...) return r1 + (r2-r1)*relperc, g1 + (g2-g1)*relperc, b1 + (b2-b1)*relperc end function SetThreatFormat(threat) r, g, b = ColorGradient((threat/100), 0, 1, 0, 1, 1, 0, 1, 0, 0); if ( string.len(threat) == 2 and fullPerc ) then return "0" .. format("|cff%02x%02x%02x%d|r", r*255, g*255, b*255, threat); elseif ( string.len(threat) == 1 and fullPerc ) then return "00" .. format("|cff%02x%02x%02x%d|r", r*255, g*255, b*255, threat); else return format("|cff%02x%02x%02x%d|r", r*255, g*255, b*255, threat); end end function frame:ClearThreat() threatlist = {}; self:UpdateThreatBars(); end function frame:UNIT_THREAT_LIST_UPDATE() if ( UnitExists(arg1) and UnitGUID(arg1) == myTarget ) then if ( GetNumRaidMembers() > 0 ) then for i=1, GetNumRaidMembers(), 1 do self:AddThreat("raid" .. i, "raid" .. i .. "pet"); end elseif ( GetNumPartyMembers() > 0 ) then self:AddThreat("player", "pet"); for i=1, GetNumPartyMembers(), 1 do self:AddThreat("party" .. i, "party" .. i .. "pet"); end else self:AddThreat("player", "pet"); end self:UpdateThreatBars(); end end function frame:PLAYER_TARGET_CHANGED() if ( UnitExists("target") and not UnitIsDead("target") and not UnitIsPlayer("target") and not UnitIsFriend("player", "target") ) then myTarget = UnitGUID("target"); self:ClearThreat(); else myTarget = ""; self:ClearThreat(); end end function frame:PLAYER_REGEN_ENABLED() self:ClearThreat(); end frame:RegisterEvent("UNIT_THREAT_LIST_UPDATE"); frame:RegisterEvent("PLAYER_TARGET_CHANGED"); frame:RegisterEvent("PLAYER_REGEN_ENABLED"); frame:SetScript("OnEvent", function(self, event, ...) self[event](self, event, ...); end); function frame:AddThreat(unit, pet) if ( UnitExists(pet) ) then self:GetThreat(unit); self:GetThreat(unit, pet); else if ( GetNumPartyMembers() > 0 or GetNumRaidMembers() > 0 ) then self:GetThreat(unit); end end end function frame:GetThreat(unit, pet) if ( UnitName(pet or unit) == UNKNOWN ) then return; end local isTanking, state, scaledPercent, rawPercent, threatValue = UnitDetailedThreatSituation(pet or unit, "target"); for index, value in ipairs(threatlist) do if ( pet and value.name == UnitName(unit) .. ": " .. UnitName(pet) ) then tremove(threatlist, index); break; elseif ( value.name == UnitName(unit) ) then tremove(threatlist, index); break; end end table.insert(threatlist, { name = ( pet ) and UnitName(unit) .. ": " .. UnitName(pet) or UnitName(unit), class = select(2, UnitClass(unit)), unit = pet or unit, scaledPercent = scaledPercent or 0, threatValue = threatValue or 0, }); end function frame:UpdateThreatBars() local bar, raidIndex; for index, value in ipairs(bars) do value:Hide(); end table.sort(threatlist, function(a, b) return a.scaledPercent > b.scaledPercent; end); for index, value in ipairs(threatlist) do if ( index > numBars ) then return; end bar = bars[index]; if ( not bar ) then bar = CreateFrame("StatusBar", frame:GetName() .. "Bar" .. index, UIParent); bar:SetWidth(barWidth); bar:SetHeight(barHeight); bar:EnableMouse(1); bar:SetStatusBarTexture(statusBarTexture); bar:SetMinMaxValues(0, 100); if ( index == 1 ) then bar:SetPoint(firstBar[1], firstBar[2], firstBar[3], firstBar[4], firstBar[5]); --elseif ( 0 == (index%6) ) then -- bar:SetPoint("LEFT", bars[index-5], "RIGHT", 2, 0); else bar:SetPoint(nextBar[1], bars[index-1], nextBar[2], nextBar[3], nextBar[4]); end bar.background = bar:CreateTexture(bar:GetName() .. "Background", "BACKGROUND"); bar.background:SetPoint("TOPLEFT"); bar.background:SetPoint("BOTTOMRIGHT"); bar.background:SetTexture(statusBarTexture); --[[bar.spark = bar:CreateTexture(bar:GetName() .. "Spark", "OVERLAY"); bar.spark:SetWidth(20); bar.spark:SetHeight(barHeight*2.5); bar.spark:SetTexture("Interface\\CastingBar\\UI-CastingBar-Spark"); bar.spark:SetBlendMode("ADD");]]-- --[[bar.icon = bar:CreateTexture(bar:GetName() .. "Icon", "OVERLAY"); bar.icon:SetWidth(barHeight); bar.icon:SetHeight(barHeight); bar.icon:SetTexture("Interface\\TargetingFrame\\UI-RaidTargetingIcons"); bar.icon:SetPoint("LEFT", bar, 1, 0);]]-- bar.AggroText = bar:CreateFontString(bar:GetName() .. "AggroText", "ARTWORK"); bar.AggroText:SetFont(textFont, textSize); bar.AggroText:SetShadowOffset(1, -1); bar.AggroText:SetPoint("RIGHT", bar, -1, 1); bar.PosText = bar:CreateFontString(bar:GetName() .. "PosText", "ARTWORK"); bar.PosText:SetFont(textFont, textSize); bar.PosText:SetShadowOffset(1, -1); bar.PosText:SetJustifyH("LEFT"); bar.PosText:SetPoint("RIGHT", bar.AggroText, "LEFT", 8, 1); tinsert(bars, bar); end classColor = RAID_CLASS_COLORS[value.class] or { 1, 1, 1 }; bar:SetValue(value.scaledPercent); --bar.spark:SetPoint("CENTER", bar, "LEFT", (barWidth*value.scaledPercent/100), 0); if ( string.sub(value.unit, -3) == "pet" ) then bar:SetStatusBarColor(classColor.r/0.8, classColor.g/0.7, classColor.b/0.8, 1); --bar.spark:SetVertexColor(classColor.r/0.8, classColor.g/0.7, classColor.b/0.8, 1); else bar:SetStatusBarColor(classColor.r, classColor.g, classColor.b, 1); --bar.spark:SetVertexColor(classColor.r, classColor.g, classColor.b, 1); end bar:SetScript("OnEnter", function(self) GameTooltip_SetDefaultAnchor(GameTooltip, self); GameTooltip:SetUnit(value.unit); GameTooltip:Show(); end); bar:SetScript("OnLeave", function(self) GameTooltip:Hide(); end); if ( value.unit == "player" ) then bar.background:SetVertexColor(1, 0, 0, 0.6); else bar.background:SetVertexColor(1, 1, 1, 0.6); end raidIndex = GetRaidTargetIndex(value.unit); --bar.icon:Hide(); --if ( raidIndex ) then --SetRaidTargetIconTexture(bar.icon, raidIndex); --bar.icon:Show(); --end bar.AggroText:SetFormattedText(textRight, comma_value(floor(value.threatValue/100)), SetThreatFormat(floor(value.scaledPercent))); bar.PosText:SetPoint("LEFT", bar, 1, 1); --if ( bar.icon:IsShown() ) then --bar.PosText:SetPoint("LEFT", bar.icon, "RIGHT", 1, 1); --end bar.PosText:SetFormattedText(textLeft, index, value.name); bar:Show(); end end -- Die Kommentierungen ("--[[" und "]]") entfernen. InGame dann "/script TestThreat()" eingeben. Viel Spaß bei den Testleisten...^^ -- Hinweis: Alle Leisten sind im Hintergrund rot, das kommt aber nur, weil im Test alle den Unit player haben. Im Livemodus bist nur du selbst rot :) --[[ function TestThreat() table.insert(threatlist, { name = "Spieler10", class = "DEATHKNIGHT", unit = "player", scaledPercent = 60, threatValue = 600000 }); table.insert(threatlist, { name = "Spieler4", class = "ROGUE", unit = "player", scaledPercent = 40, threatValue = 400000 }); table.insert(threatlist, { name = UnitName("player"), class = "SHAMAN", unit = "player", scaledPercent = 5, threatValue = 50000 }); table.insert(threatlist, { name = UnitName("player") .. ": Das ist mein liebes Pet", class = "WARRIOR", unit = "player", scaledPercent = 100, threatValue = 1000000 }); table.insert(threatlist, { name = "Spieler1", class = "MAGE", unit = "player", scaledPercent = 20, threatValue = 200000 }); table.insert(threatlist, { name = "Spieler5", class = "DEATHKNIGHT", unit = "player", scaledPercent = 25, threatValue = 250000 }); table.insert(threatlist, { name = "Spieler8", class = "ROGUE", unit = "player", scaledPercent = 90, threatValue = 900000 }); table.insert(threatlist, { name = "Spieler6", class = "SHAMAN", unit = "player", scaledPercent = 30, threatValue = 300000 }); table.insert(threatlist, { name = "Spieler9", class = "WARLOCK", unit = "player", scaledPercent = 15, threatValue = 150000 }); table.insert(threatlist, { name = "Spieler2", class = "MAGE", unit = "player", scaledPercent = 50, threatValue = 500000 }); table.sort(threatlist, function(a, b) return a.threatValue > b.threatValue end); frame:UpdateThreatBars(); end ]]