diff --git a/Modules/Power.lua b/Modules/Power.lua
new file mode 100644
index 0000000..0e7d67b
--- /dev/null
+++ b/Modules/Power.lua
@@ -0,0 +1,195 @@
+local MAJOR_VERSION = "LibDogTag-Unit-3.0"
+local MINOR_VERSION = tonumber(("$Revision$"):match("%d+")) or 0
+
+if MINOR_VERSION > _G.DogTag_Unit_MINOR_VERSION then
+ _G.DogTag_Unit_MINOR_VERSION = MINOR_VERSION
+end
+
+DogTag_Unit_funcs[#DogTag_Unit_funcs+1] = function(DogTag_Unit, DogTag)
+
+local L = DogTag_Unit.L
+
+DogTag:AddTag("Unit", "MP", {
+ code = [[return UnitMana(${unit})]],
+ arg {
+ 'unit', 'string', '@req',
+ },
+ ret = "number",
+ events = "UNIT_MANA#$unit;UNIT_RAGE#$unit;UNIT_FOCUS#$unit;UNIT_ENERGY#$unit;UNIT_MAXMANA#$unit;UNIT_MAXRAGE#$unit;UNIT_MAXFOCUS#$unit;UNIT_MAXENERGY#$unit;UNIT_DISPLAYPOWER#$unit",
+ globals = "UnitMana",
+ doc = L["Return the current mana/rage/energy of unit"],
+ example = ('[MP] => "%d"'):format(UnitManaMax("player")*.632),
+ category = L["Power"]
+})
+
+DogTag:AddTag("Unit", "MaxMP", {
+ code = [[return UnitManaMax(${unit})]],
+ arg {
+ 'unit', 'string', '@req',
+ },
+ ret = "number",
+ events = "UNIT_MANA#$unit;UNIT_RAGE#$unit;UNIT_FOCUS#$unit;UNIT_ENERGY#$unit;UNIT_MAXMANA#$unit;UNIT_MAXRAGE#$unit;UNIT_MAXFOCUS#$unit;UNIT_MAXENERGY#$unit;UNIT_DISPLAYPOWER#$unit",
+ globals = "UnitManaMax",
+ doc = L["Return the maximum mana/rage/energy of unit"],
+ example = ('[MaxMP] => "%d"'):format(UnitManaMax("player")),
+ category = L["Power"]
+})
+
+DogTag:AddTag("Unit", "PercentMP", {
+ alias = "[MP(unit=unit) / MaxMP(unit=unit) * 100]:Round(1)",
+ arg {
+ 'unit', 'string', '@req',
+ },
+ doc = L["Return the percentage mana/rage/energy of unit"],
+ example = '[PercentMP] => "63.2"; [PercentMP:Percent] => "63.2%"',
+ category = L["Power"]
+})
+
+DogTag:AddTag("Unit", "MissingMP", {
+ alias = "MaxMP(unit=unit) - CurMP(unit=unit)",
+ arg {
+ 'unit', 'string', '@req',
+ },
+ doc = L["Return the missing mana/rage/energy of unit"],
+ example = ('[MissingMP] => "%d"'):format(UnitManaMax("player")*.368),
+ category = L["Power"]
+})
+
+DogTag:AddTag("Unit", "FractionalMP", {
+ alias = "MP(unit=unit) '/':Append(MaxMP(unit=unit))",
+ arg {
+ 'unit', 'string', '@req',
+ },
+ doc = L["Return the current and maximum mana/rage/energy of unit"],
+ example = ('[FractionalMP] => "%d/%d"'):format(UnitManaMax("player")*.632, UnitManaMax("player")),
+ category = L["Power"]
+})
+
+DogTag:AddTag("Unit", "TypePower", {
+ ([[local p = UnitPowerType(${unit})
+ if p == 1 then
+ return %q
+ elseif p == 2 then
+ return %q
+ elseif p == 3 then
+ return %q
+ else
+ return %q
+ end]]):format(L["Rage"], L["Focus"], L["Energy"], L["Mana"]),
+ arg {
+ 'unit', 'string', '@req',
+ },
+ ret = "string",
+ events = "UNIT_DISPLAYPOWER#$unit",
+ globals = "UnitPowerType",
+ doc = L["Return whether unit currently uses Rage, Focus, Energy, or Mana"],
+ example = ('[TypePower] => %q; [TypePower] => %q'):format(L["Rage"], L["Mana"]),
+ category = L["Power"]
+})
+
+DogTag:AddTag("Unit", "IsPowerType", {
+ alias = [=[Boolean(TypePower(unit=unit) = type)]=],
+ arg = {
+ 'type', 'string', '@req',
+ 'unit', 'string', '@req',
+ },
+ ret = "boolean",
+ events = "UNIT_DISPLAYPOWER#$unit",
+ globals = "UnitPowerType",
+ doc = L["Return True if unit currently uses the power of argument"],
+ example = ('[HasPower(%q)] => %q; [HasPower(%q)] => ""'):format(L["Rage"], L["True"], L["Mana"]),
+ category = L["Power"]
+})
+
+DogTag:AddTag("Unit", "IsRage", {
+ alias = ("IsPowerType(type=%q, unit=unit)"):format(L["Rage"]),
+ arg = {
+ 'unit', 'string', '@req',
+ },
+ doc = L["Return True if unit currently uses rage"],
+ example = ('[IsRage] => %q; [IsRage] => ""'):format(L["True"]),
+ category = L["Power"]
+})
+
+DogTag:AddTag("Unit", "IsFocus", {
+ alias = ("IsPowerType(type=%q, unit=unit)"):format(L["Focus"]),
+ arg = {
+ 'unit', 'string', '@req',
+ },
+ doc = L["Return True if unit currently uses focus"],
+ example = ('[IsFocus] => %q; [IsFocus] => ""'):format(L["True"]),
+ category = L["Power"]
+})
+
+DogTag:AddTag("Unit", "IsEnergy", {
+ alias = ("IsPowerType(type=%q, unit=unit)"):format(L["Energy"]),
+ arg = {
+ 'unit', 'string', '@req',
+ },
+ doc = L["Return True if unit currently uses energy"],
+ example = ('[IsEnergy] => %q; [IsEnergy] => ""'):format(L["True"]),
+ category = L["Power"]
+})
+
+DogTag:AddTag("Unit", "IsMana", {
+ alias = ("IsPowerType(type=%q, unit=unit)"):format(L["Mana"]),
+ arg = {
+ 'unit', 'string', '@req',
+ },
+ doc = L["Return True if unit currently uses mana"],
+ example = ('[IsMana] => %q; [IsMana] => ""'):format(L["True"]),
+ category = L["Power"]
+})
+
+DogTag:AddTag("Unit", "IsMaxMP", {
+ alias = "Boolean(MP(unit=unit) = MaxMP(unit=unit))",
+ arg = {
+ 'unit', 'string', '@req',
+ },
+ doc = L["Return True if unit is at full rage/mana/energy"],
+ example = ('[IsMaxMP] => %q; [IsMaxMP] => ""'):format(L["True"]),
+ category = L["Power"]
+})
+
+DogTag:AddTag("Unit", "HasMP", {
+ alias = "Boolean(MaxMP(unit=unit) > 0)"
+ arg = {
+ 'unit', 'string', '@req',
+ },
+ doc = L["Return True if unit has no power type at all"],
+ example = ('[HasNoMP] => %q; [HasNoMP] => ""'):format(L["True"]),
+ category = L["Power"]
+})
+
+DogTag:AddTag("Unit", "PowerColor", {
+ code = [[local powerType = UnitPowerType(${unit})
+ local r,g,b
+ if powerType == 0 then
+ r,g,b = unpack(colors.mana)
+ elseif powerType == 1 then
+ r,g,b = unpack(colors.rage)
+ elseif powerType == 2 then
+ r,g,b = unpack(colors.focus)
+ elseif powerType == 3 then
+ r,g,b = unpack(colors.energy)
+ else
+ r,g,b = unpack(colors.unknown)
+ end
+ if ${value} then
+ return ("|cff%02x%02x%02x%s|r"):format(r * 255, g * 255, b * 255, ${value})
+ else
+ return ("|cff%02x%02x%02x"):format(r * 255, g * 255, b * 255)
+ end]],
+ arg = {
+ 'value', 'string;undef', '@undef',
+ 'unit', 'string', '@req',
+ }
+ ret = "string",
+ events = "UNIT_DISPLAYPOWER#$unit",
+ globals = "UnitPowerType",
+ doc = L["Return the color or wrap value with current power color of unit, whether rage, mana, or energy"],
+ example = '["Hello":PowerColor] => "|cff3071bfHello|r"; [PowerColor "Hello"] => "|cff3071bfHello"',
+ category = L["Power"]
+})
+
+end
\ No newline at end of file
diff --git a/lib.xml b/lib.xml
index 8f8bdfa..b142890 100644
--- a/lib.xml
+++ b/lib.xml
@@ -5,5 +5,6 @@
+
\ No newline at end of file
diff --git a/test.lua b/test.lua
index e072bbc..6b0bf35 100644
--- a/test.lua
+++ b/test.lua
@@ -149,6 +149,12 @@ function UnitClass(unit)
end
end
+UnitClassBase = UnitClass
+
+function UnitGUID(unit)
+ return units[unit] and units[unit].guid or "0x0000000000000000"
+end
+
function UnitLevel(unit)
return units[unit] and (units[unit].level or 0)
end
@@ -527,4 +533,6 @@ assert_equal(DogTag:Evaluate("[DifficultyColor(unit='player')]", "Unit"), "|cfff
assert_equal(DogTag:Evaluate("[DifficultyColor(unit='pet')]", "Unit"), "|cffffff00") -- yellow
assert_equal(DogTag:Evaluate("[DifficultyColor(unit='target')]", "Unit"), "|cffff1919") -- red
+assert_equal(DogTag:Evaluate("[Guid(unit='player')]", "Unit"), "0x0000000000000000") -- red
+
print("LibDogTag-Unit-3.0: Tests succeeded")
\ No newline at end of file