Table of Contents
- 1 API Documentation
- 1.1 :BuildGemmedTooltip(item , red , yellow , blue , meta)
- 1.2 :GetAPFromAgi(agi [, class])
- 1.3 :GetAPFromStr(str [, class])
- 1.4 :GetAPPerAgi([class])
- 1.5 :GetAPPerStr([class])
- 1.6 :GetAvoidanceAfterDR("avoidanceType" , avoidanceBeforeDR [, class])
- 1.7 :GetAvoidanceGainAfterDR("avoidanceType" , gainBeforeDR)
- 1.8 :GetBaseDodge([class])
- 1.9 :GetBlockValueFromStr(str [, class])
- 1.10 :GetBlockValuePerStr([class])
- 1.11 :GetClassIdOrName(class)
- 1.12 :GetCritFromAgi(agi [, class] [, level])
- 1.13 :GetDiff(item , diff1 , diff2 , ignoreEnchant , ignoreGem , red , yellow , blue , meta)
- 1.14 :GetDiffID(item , ignoreEnchant , ignoreGem , red , yellow , blue , meta)
- 1.15 :GetDodgeChanceBeforeDR()
- 1.16 :GetDodgeFromAgi(agi)
- 1.17 :GetDodgePerAgi()
- 1.18 :GetEffectFromDefense([defense] [, attackerLevel])
- 1.19 :GetEffectFromRating(rating , id [, level])
- 1.20 :GetGemID(item)
- 1.21 :GetHealthRegenFromSpi(spi [, class])
- 1.22 :GetNormalManaRegenFromSpi(spi [, int] [, level])
- 1.23 :GetParryChanceBeforeDR()
- 1.24 :GetRAPFromAgi(agi [, class])
- 1.25 :GetRAPPerAgi([class])
- 1.26 :GetRatingIdOrStatId(rating)
- 1.27 :GetReductionFromArmor([armor] [, attackerLevel])
- 1.28 :GetSpellCritFromInt(int [, class] [, level])
- 1.29 :GetStatMod("stat" [, school])
- 1.30 :GetStatNameFromID("stat")
- 1.31 :GetSum(item , table)
- 1.32 :ModEnchantGem("link" [, enc] [, gem1] [, gem2] [, gem3] [, gem4])
- 1.33 :RemoveEnchant("link")
- 1.34 :RemoveEnchantGem("link")
- 1.35 :RemoveGem("link")
- 1.36 :SetTip(item)
API Documentation
Arguments
- item
- number or string or table - tooltip or itemId or "itemString" or "itemName" or "itemLink"
- red
- number or string - gemID to replace a red socket
- yellow
- number or string - gemID to replace a yellow socket
- blue
- number or string - gemID to replace a blue socket
- meta
- number or string - gemID to replace a meta socket
Notes
- Returns a modified link with all empty sockets replaced with the specified gems, sockets already gemmed will remain.
- item:
- tooltip
- table - The tooltip showing the item
- itemId
- number - The numeric ID of the item. ie. 12345
- "itemString"
- string - The full item ID in string format, e.g. "item:12345:0:0:0:0:0:0:0".
- Also supports partial itemStrings, by filling up any missing ":x" value with ":0", e.g. "item:12345:0:0:0"
- "itemName"
- string - The Name of the Item, ex: "Hearthstone"
- The item must have been equiped, in your bags or in your bank once in this session for this to work.
- "itemLink"
- string - The itemLink, when Shift-Clicking items.
Returns
- link
- string - modified item link
Example
local link = StatLogic:BuildGemmedTooltip(28619, 3119, 3119, 3119, 3119)
StatLogic:SetTip("item:28619")
StatLogic:SetTip(StatLogic:BuildGemmedTooltip(28619, 3119, 3119, 3119, 3119))
string or number
:GetAPFromAgi(agi [, class])
Arguments
- agi
- number - Agility
- class
- string or number - ClassID or "ClassName". Default: PlayerClass
See :GetClassIdOrName(class) for valid class values.
Notes
- Calculates the attack power from agility for given class.
Returns
- ap
- number - Attack power
- statid
- string - "AP"
Example
local ap = StatLogic:GetAPFromAgi(1) -- GetAPPerAgi
local ap = StatLogic:GetAPFromAgi(10)
local ap = StatLogic:GetAPFromAgi(10, "WARRIOR")
string or number
:GetAPFromStr(str [, class])
Arguments
- str
- number - Strength
- class
- string or number - ClassID or "ClassName". Default: PlayerClass
See :GetClassIdOrName(class) for valid class values.
Returns
- ap
- number - Attack power
- statid
- string - "AP"
Examples:
local ap = StatLogic:GetAPFromStr(1) -- GetAPPerStr
local ap = StatLogic:GetAPFromStr(10)
local ap = StatLogic:GetAPFromStr(10, "WARRIOR")
string or number
:GetAPPerAgi([class])
Arguments
- class
- string or number - ClassID or "ClassName". Default: PlayerClass
See :GetClassIdOrName(class) for valid class values.
Notes
- Gets the attack power per agility for given class.
- Player level does not effect attack power per agility.
- Will check for Cat Form.
Returns
- ap
- number - Attack power per agility
- statid
- string - "AP"
Example
local apPerAgi = StatLogic:GetAPPerAgi()
local apPerAgi = StatLogic:GetAPPerAgi("ROGUE")
string or number
:GetAPPerStr([class])
Arguments
- class
- string or number - ClassID or "ClassName". Default: PlayerClass
See :GetClassIdOrName(class) for valid class values.
Notes
- Returns the attack power per strength for given class.
- Player level does not effect attack power per strength.
Returns
- ap
- number - Attack power per strength
- statid
- string - "AP"
Example
local ap = StatLogic:GetAPPerStr()
local ap = StatLogic:GetAPPerStr("WARRIOR")
string or number
:GetAvoidanceAfterDR("avoidanceType" , avoidanceBeforeDR [, class])
Arguments
- "avoidanceType"
- string - "DODGE", "PARRY", "MELEE_HIT_AVOID"(NYI)
- avoidanceBeforeDR
- number - amount of avoidance before diminishing returns in percentages.
- class
- string or number - ClassID or "ClassName". Default: PlayerClass
See :GetClassIdOrName(class) for valid class values.
Notes
- Avoidance DR formula and k, C_p, C_d constants derived by Whitetooth (hotdogee [at] gmail [dot] com)
- avoidanceBeforeDR is the part that is affected by diminishing returns.
- See :GetClassIdOrName(class) for valid class values.
- Calculates the avoidance after diminishing returns, this includes:
- Dodge from Dodge Rating, Defense, Agility.
- Parry from Parry Rating, Defense.
- Chance to be missed from Defense.
- The DR formula: 1/x' = 1/c+k/x
- x' is the diminished stat before converting to IEEE754.
- x is the stat before diminishing returns.
- c is the cap of the stat, and changes with class.
- k is is a value that changes with class.
- Formula details:
- DR for Dodge, Parry, Missed are calculated separately.
- Base avoidances are not affected by DR, (ex: Dodge from base Agility)
- Death Knight's Parry from base Strength is affected by DR, base for parry is 5%.
- Direct avoidance gains from talents and spells(ex: Evasion) are not affected by DR.
- Indirect avoidance gains from talents and spells(ex: +Agility from Kings) are affected by DR
- c and k values depend on class but does not change with level.
| | k | C_p | 1/C_p | C_d | 1/C_d
|
| Warrior | 0.9560 | 47.003525 | 0.021275 | 88.129021 | 0.011347
|
| Paladin | 0.9560 | 47.003525 | 0.021275 | 88.129021 | 0.011347
|
| Hunter | 0.9880 | 145.560408 | 0.006870 | 145.560408 | 0.006870
|
| Rogue | 0.9880 | 145.560408 | 0.006870 | 145.560408 | 0.006870
|
| Priest | 0.9530 | 0 | 0 | 150.375940 | 0.006650
|
| Deathknight | 0.9560 | 47.003525 | 0.021275 | 88.129021 | 0.011347
|
| Shaman | 0.9880 | 145.560408 | 0.006870 | 145.560408 | 0.006870
|
| Mage | 0.9530 | 0 | 0 | 150.375940 | 0.006650
|
| Warlock | 0.9530 | 0 | 0 | 150.375940 | 0.006650
|
| Druid | 0.9720 | 0 | 0 | 116.890707 | 0.008555
|
Returns
- avoidanceAfterDR
- number - avoidance after diminishing returns in percentages.
Example
local modParry, drFreeParry = StatLogic:GetParryChanceBeforeDR()
local modParryAfterDR = StatLogic:GetAvoidanceAfterDR("PARRY", modParry)
local parry = modParryAfterDR + drFreeParry
local modParryAfterDR = StatLogic:GetAvoidanceAfterDR("PARRY", modParry, "WARRIOR")
local parry = modParryAfterDR + drFreeParry
:GetAvoidanceGainAfterDR("avoidanceType" , gainBeforeDR)
Arguments
- "avoidanceType"
- string - "DODGE", "PARRY", "MELEE_HIT_AVOID"(NYI)
- gainBeforeDR
- number - Avoidance gain before diminishing returns in percentages.
Notes
- Calculates the avoidance gain after diminishing returns with player's current stats.
Returns
- gainAfterDR
- number - Avoidance gain after diminishing returns in percentages.
Example
-- How much dodge will I gain with +30 Agi after DR?
local gainAfterDR = StatLogic:GetAvoidanceGainAfterDR("DODGE", 30*StatLogic:GetDodgePerAgi())
-- How much dodge will I gain with +20 Parry Rating after DR?
local gainAfterDR = StatLogic:GetAvoidanceGainAfterDR("PARRY", StatLogic:GetEffectFromRating(20, CR_PARRY))
string or number
:GetBaseDodge([class])
Arguments
- class
- string or number - ClassID or "ClassName". Default: PlayerClass
See :GetClassIdOrName(class) for valid class values.
Notes
- BaseDodge values derived by Whitetooth (hotdogee [at] gmail [dot] com)
- Gets the base dodge percentage for given class.
- Base dodge is the amount of dodge you have with 0 Agility, independent of level.
Returns
- dodge
- number - Base dodge in percentages
- statid
- string - "DODGE"
Example
local baseDodge = StatLogic:GetBaseDodge()
local baseDodge = StatLogic:GetBaseDodge("WARRIOR")
string or number
:GetBlockValueFromStr(str [, class])
Arguments
- str
- number - Strength
- class
- string or number - ClassID or "ClassName". Default: PlayerClass
See :GetClassIdOrName(class) for valid class values.
Notes
- Calculates the block value from strength for given class.
- Player level does not effect block value per strength.
Returns
- blockValue
- number - Block value
- statid
- string - "BLOCK_VALUE"
Example
local bv = StatLogic:GetBlockValueFromStr(1) -- GetBlockValuePerStr
local bv = StatLogic:GetBlockValueFromStr(10)
local bv = StatLogic:GetBlockValueFromStr(10, "WARRIOR")
string or number
:GetBlockValuePerStr([class])
Arguments
- class
- string or number - ClassID or "ClassName". Default: PlayerClass
See :GetClassIdOrName(class) for valid class values.
Notes
- Gets the block value per strength for given class.
- Player level does not effect block value per strength.
Returns
- blockValue
- number - Block value per strength
- statid
- string - "BLOCK_VALUE"
Example
local blockPerStr = StatLogic:GetBlockValuePerStr()
local blockPerStr = StatLogic:GetBlockValuePerStr("WARRIOR")
:GetClassIdOrName(class)
Arguments
- class
- number or string - ClassID or "ClassName"
Notes
- Converts ClassID to and from "ClassName"
- class:
| ClassID | "ClassName"
|
| 1 | "WARRIOR"
|
| 2 | "PALADIN"
|
| 3 | "HUNTER"
|
| 4 | "ROGUE"
|
| 5 | "PRIEST"
|
| 6 | "DEATHKNIGHT"
|
| 7 | "SHAMAN"
|
| 8 | "MAGE"
|
| 9 | "WARLOCK"
|
| 10 | "DRUID"
|
Returns
None
Example
StatLogic:GetClassIdOrName("WARRIOR") -- 1
StatLogic:GetClassIdOrName(10) -- "DRUID"
string or number
number
:GetCritFromAgi(agi [, class] [, level])
Arguments
- agi
- number - Agility
- class
- string or number - ClassID or "ClassName". Default: PlayerClass
See :GetClassIdOrName(class) for valid class values.
- level
- number - Level used in calculations. Default: player's level
Notes
- CritPerAgi values reverse engineered by Whitetooth (hotdogee [at] gmail [dot] com)
- Calculates the melee/ranged crit chance from agility for given class and level.
Returns
- crit
- number - Melee/ranged crit percentage
- statid
- string - "MELEE_CRIT"
Example
local crit = StatLogic:GetCritFromAgi(1) -- GetCritPerAgi
local crit = StatLogic:GetCritFromAgi(10)
local crit = StatLogic:GetCritFromAgi(10, "WARRIOR")
local crit = StatLogic:GetCritFromAgi(10, nil, 70)
local crit = StatLogic:GetCritFromAgi(10, "WARRIOR", 70)
:GetDiff(item , diff1 , diff2 , ignoreEnchant , ignoreGem , red , yellow , blue , meta)
Arguments
- item
- number or string or table - tooltip or itemId or "itemString" or "itemName" or "itemLink"
- diff1
- table - Stat difference of item and equipped item 1 are writen to this table if provided
- diff2
- table - Stat difference of item and equipped item 2 are writen to this table if provided
- ignoreEnchant
- boolean - Ignore enchants when calculating stat diffrences
- ignoreGem
- boolean - Ignore gems when calculating stat diffrences
- red
- number or string - gemID to replace a red socket
- yellow
- number or string - gemID to replace a yellow socket
- blue
- number or string - gemID to replace a blue socket
- meta
- number or string - gemID to replace a meta socket
Notes
- Calculates the stat diffrence from the specified item and your currently equipped items.
- item:
- tooltip
- table - The tooltip showing the item
- itemId
- number - The numeric ID of the item. ie. 12345
- "itemString"
- string - The full item ID in string format, e.g. "item:12345:0:0:0:0:0:0:0".
- Also supports partial itemStrings, by filling up any missing ":x" value with ":0", e.g. "item:12345:0:0:0"
- "itemName"
- string - The Name of the Item, ex: "Hearthstone"
- The item must have been equiped, in your bags or in your bank once in this session for this to work.
- "itemLink"
- string - The itemLink, when Shift-Clicking items.
Returns
- diff1
- table - The table with stat diff values for item 1
- {
- ["STAT_ID1"] = value,
- ["STAT_ID2"] = value,
- }
- diff2
- table - The table with stat diff values for item 2
- {
- ["STAT_ID1"] = value,
- ["STAT_ID2"] = value,
- }
Example
StatLogic:GetDiff(21417, {}) -- Ring of Unspoken Names
StatLogic:GetDiff(21452) -- Staff of the Ruins
:GetDiffID(item , ignoreEnchant , ignoreGem , red , yellow , blue , meta)
Arguments
- item
- number or string or table - tooltip or itemId or "itemString" or "itemName" or "itemLink"
- ignoreEnchant
- boolean - Ignore enchants when calculating the id if true
- ignoreGem
- boolean - Ignore gems when calculating the id if true
- red
- number or string - gemID to replace a red socket
- yellow
- number or string - gemID to replace a yellow socket
- blue
- number or string - gemID to replace a blue socket
- meta
- number or string - gemID to replace a meta socket
Notes
- Returns a unique identification string of the diff calculation, the identification string is made up of links concatenated together, can be used for cache indexing
- item:
- tooltip
- table - The tooltip showing the item
- itemId
- number - The numeric ID of the item. ie. 12345
- "itemString"
- string - The full item ID in string format, e.g. "item:12345:0:0:0:0:0:0:0".
- Also supports partial itemStrings, by filling up any missing ":x" value with ":0", e.g. "item:12345:0:0:0"
- "itemName"
- string - The Name of the Item, ex: "Hearthstone"
- The item must have been equiped, in your bags or in your bank once in this session for this to work.
- "itemLink"
- string - The itemLink, when Shift-Clicking items.
Returns
- id
- string - a unique identification string of the diff calculation, for use as cache key
- link
- string - link of main item
- linkDiff1
- string - link of compare item 1
- linkDiff2
- string - link of compare item 2
Example
StatLogic:GetDiffID(21417) -- Ring of Unspoken Names
StatLogic:GetDiffID("item:18832:2564:0:0:0:0:0:0", true, true) -- Brutality Blade with +15 agi enchant
http://www.wowwiki.com/EnchantId
:GetDodgeChanceBeforeDR()
Notes
- Calculates your current Dodge% before diminishing returns.
- Dodge% = modDodge + drFreeDodge
- drFreeDodge includes:
- Base dodge
- Dodge from base agility
- Dodge modifier from base defense
- Dodge modifers from talents or spells
- modDodge includes
- Dodge from dodge rating
- Dodge from additional defense
- Dodge from additional dodge
Returns
- modDodge
- number - The part that is affected by diminishing returns.
- drFreeDodge
- number - The part that isn't affected by diminishing returns.
Example
local modDodge, drFreeDodge = StatLogic:GetDodgeChanceBeforeDR()
:GetDodgeFromAgi(agi)
Arguments
- agi
- number - Agility
Notes
- Calculates the dodge chance from agility for your current class and level.
- Only works for your currect class and current level, does not support class and level args.
Returns
- dodge
- number - Dodge percentage
- statid
- string - "DODGE"
Example
local dodge = StatLogic:GetDodgeFromAgi(1) -- GetDodgePerAgi
local dodge = StatLogic:GetDodgeFromAgi(10)
:GetDodgePerAgi()
Notes
- Formula by Whitetooth (hotdogee [at] gmail [dot] com)
- Calculates the dodge percentage per agility for your current class and level.
- Only works for your currect class and current level, does not support class and level args.
- Calculations got a bit more complicated with the introduction of the avoidance DR in WotLK, these are the values we know or can be calculated easily:
- D'=Total Dodge% after DR
- D_r=Dodge from Defense and Dodge Rating before DR
- D_b=Dodge unaffected by DR (BaseDodge + Dodge from talent/buffs + Lower then normal defense correction)
- A=Total Agility
- A_b=Base Agility (This is what you have with no gear on)
- A_g=Total Agility - Base Agility
- Let d be the Dodge/Agi value we are going to calculate.
1 1 k
--- = --- + ---
x' c x
x'=D'-D_b-A_b*d
x=A_g*d+D_r
1/(D'-D_b-A_b*d)=1/C_d+k/(A_g*d+D_r)=(A_g*d+D_r+C_d*k)/(C_d*A_g*d+C_d*D_r)
C_d*A_g*d+C_d*D_r=[(D'-D_b)-A_b*d]*[Ag*d+(D_r+C_d*k)]
After rearranging the terms, we get an equation of type a*d^2+b*d+c where
a=-A_g*A_b
b=A_g(D'-D_b)-A_b(D_r+C_d*k)-C_dA_g
c=(D'-D_b)(D_r+C_d*k)-C_d*D_r
- Dodge/Agi=(-b-(b^2-4ac)^0.5)/(2a)
Returns
- dodge
- number - Dodge percentage per agility
- statid
- string - "DODGE"
Example
local dodge, statid = StatLogic:GetDodgePerAgi()
string
number
:GetEffectFromDefense([defense] [, attackerLevel])
Arguments
- defense
- string - Total defense value. Default: player's armor value
- attackerLevel
- number - Attacker level. Default: player's level
Notes
- Calculates the effective avoidance% from defense (before diminishing returns) for given attacker level
Returns
- effect
- number - 0.04% per effective defense.
Example
local effect = StatLogic:GetEffectFromDefense(415, 83) -- 0
number
:GetEffectFromRating(rating , id [, level])
Arguments
- rating
- number - Rating value
- id
- number - Rating ID as defined in PaperDollFrame.lua
- level
- number - Level used in calculations. Default: player's level
Notes
- Combat Rating formula and constants derived by Whitetooth (hotdogee [at] gmail [dot] com)
- Calculates the stat effects from ratings for any level.
- id: Rating ID as definded in PaperDollFrame.lua
- CR_WEAPON_SKILL = 1
- CR_DEFENSE_SKILL = 2
- CR_DODGE = 3
- CR_PARRY = 4
- CR_BLOCK = 5
- CR_HIT_MELEE = 6
- CR_HIT_RANGED = 7
- CR_HIT_SPELL = 8
- CR_CRIT_MELEE = 9
- CR_CRIT_RANGED = 10
- CR_CRIT_SPELL = 11
- CR_HIT_TAKEN_MELEE = 12
- CR_HIT_TAKEN_RANGED = 13
- CR_HIT_TAKEN_SPELL = 14
- CR_CRIT_TAKEN_MELEE = 15
- CR_CRIT_TAKEN_RANGED = 16
- CR_CRIT_TAKEN_SPELL = 17
- CR_HASTE_MELEE = 18
- CR_HASTE_RANGED = 19
- CR_HASTE_SPELL = 20
- CR_WEAPON_SKILL_MAINHAND = 21
- CR_WEAPON_SKILL_OFFHAND = 22
- CR_WEAPON_SKILL_RANGED = 23
- CR_EXPERTISE = 24
- CR_ARMOR_PENETRATION = 25
- The Combat Rating formula:
- Percentage = Rating / RatingBase / H
- Level 1 to 10: H = 2/52
- Level 10 to 60: H = (level-8)/52
- Level 60 to 70: H = 82/(262-3*level)
- Level 70 to 80: H = (82/52)*(131/63)^((level-70)/10)
| RatingID | RatingBase
|
| CR_WEAPON_SKILL | 2.5
|
| CR_DEFENSE_SKILL | 1.5
|
| CR_DODGE | 12
|
| CR_PARRY | 15
|
| CR_BLOCK | 5
|
| CR_HIT_MELEE | 10
|
| CR_HIT_RANGED | 10
|
| CR_HIT_SPELL | 8
|
| CR_CRIT_MELEE | 14
|
| CR_CRIT_RANGED | 14
|
| CR_CRIT_SPELL | 14
|
| CR_HIT_TAKEN_MELEE | 10
|
| CR_HIT_TAKEN_RANGED | 10
|
| CR_HIT_TAKEN_SPELL | 8
|
| CR_CRIT_TAKEN_MELEE | 25
|
| CR_CRIT_TAKEN_RANGED | 25
|
| CR_CRIT_TAKEN_SPELL | 25
|
| CR_HASTE_MELEE | 10
|
| CR_HASTE_RANGED | 10
|
| CR_HASTE_SPELL | 10
|
| CR_WEAPON_SKILL_MAINHAND | 2.5
|
| CR_WEAPON_SKILL_OFFHAND | 2.5
|
| CR_WEAPON_SKILL_RANGED | 2.5
|
| CR_EXPERTISE | 2.5
|
| CR_ARMOR_PENETRATION | 4.69512176513672
|
- Parry Rating, Defense Rating, Block Rating and Resilience: Low-level players will now convert these ratings into their corresponding defensive stats at the same rate as level 34 players.
Returns
- effect
- number - Effect value
- effect name
- string - Stat ID of converted effect, ex: "DODGE", "PARRY"
Example
StatLogic:GetEffectFromRating(10, CR_DODGE)
StatLogic:GetEffectFromRating(10, CR_DODGE, 70)
:GetGemID(item)
Arguments
- item
- number or string or table - tooltip or itemId or "itemString" or "itemName" or "itemLink"
Notes
- Returns the gemID and gemText of a gem for use in links
- item:
- tooltip
- table - The tooltip showing the item
- itemId
- number - The numeric ID of the item. ie. 12345
- "itemString"
- string - The full item ID in string format, e.g. "item:12345:0:0:0:0:0:0:0".
- Also supports partial itemStrings, by filling up any missing ":x" value with ":0", e.g. "item:12345:0:0:0"
- "itemName"
- string - The Name of the Item, ex: "Hearthstone"
- The item must have been equiped, in your bags or in your bank once in this session for this to work.
- "itemLink"
- string - The itemLink, when Shift-Clicking items.
Returns
- gemID
- number - The gemID of this gem
- gemText
- string - The text shown in the tooltip when socketed in an item
Example
local gemID, gemText = StatLogic:GetGemID(28363)
string or number
:GetHealthRegenFromSpi(spi [, class])
Arguments
- spi
- number - Spirit
- class
- string or number - ClassID or "ClassName". Default: PlayerClass
See :GetClassIdOrName(class) for valid class values.
Notes
- HealthRegenPerSpi values derived by Whitetooth (hotdogee [at] gmail [dot] com)
- Calculates the health regen per 5 seconds when out of combat from spirit for given class.
- Player level does not effect health regen per spirit.
Returns
- hp5oc
- number - Health regen per 5 seconds when out of combat
- statid
- string - "HEALTH_REG_OUT_OF_COMBAT"
Example
local hp5oc = StatLogic:GetHealthRegenFromSpi(1) -- GetHealthRegenPerSpi
local hp5oc = StatLogic:GetHealthRegenFromSpi(10)
local hp5oc = StatLogic:GetHealthRegenFromSpi(10, "MAGE")
number
number