|
|
|
@@ -0,0 +1,171 @@
|
|
|
|
|
--[[ *** DataStore_Stats ***
|
|
|
|
|
Written by : Thaoky, EU-Marécages de Zangar
|
|
|
|
|
July 18th, 2009
|
|
|
|
|
--]]
|
|
|
|
|
if not DataStore then return end
|
|
|
|
|
|
|
|
|
|
local addonName = "DataStore_Stats"
|
|
|
|
|
|
|
|
|
|
_G[addonName] = LibStub("AceAddon-3.0"):NewAddon(addonName, "AceConsole-3.0", "AceEvent-3.0", "AceTimer-3.0")
|
|
|
|
|
|
|
|
|
|
local addon = _G[addonName]
|
|
|
|
|
|
|
|
|
|
local THIS_ACCOUNT = "Default"
|
|
|
|
|
|
|
|
|
|
-- Func Call Spam Protection
|
|
|
|
|
local FCSP_timer_UNIT_INVENTORY_CHANGED
|
|
|
|
|
|
|
|
|
|
local AddonDB_Defaults = {
|
|
|
|
|
global = {
|
|
|
|
|
Characters = {
|
|
|
|
|
['*'] = { -- ["Account.Realm.Name"]
|
|
|
|
|
lastUpdate = nil,
|
|
|
|
|
Stats = {},
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
-- ** Mixins **
|
|
|
|
|
local function _GetStats(character, statType)
|
|
|
|
|
local data = character.Stats[statType]
|
|
|
|
|
if not data then return end
|
|
|
|
|
|
|
|
|
|
return strsplit("|", data)
|
|
|
|
|
|
|
|
|
|
-- if there's a need to automate the tonumber of each var, do this ( improve it), since most of the time, these data will be used for display purposes, strings are acceptable
|
|
|
|
|
-- local var1, var2, var3, var4, var5, var6 = strsplit("|", data)
|
|
|
|
|
-- return tonumber(var1), tonumber(var2), tonumber(var3), tonumber(var4), tonumber(var5), tonumber(var6)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local PublicMethods = {
|
|
|
|
|
GetStats = _GetStats,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function addon:OnInitialize()
|
|
|
|
|
addon.db = LibStub("AceDB-3.0"):New(addonName .. "DB", AddonDB_Defaults)
|
|
|
|
|
|
|
|
|
|
DataStore:RegisterModule(addonName, addon, PublicMethods)
|
|
|
|
|
DataStore:SetCharacterBasedMethod("GetStats")
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- *** Scanning functions ***
|
|
|
|
|
local function ScanStats()
|
|
|
|
|
FCSP_timer_UNIT_INVENTORY_CHANGED = nil -- manual reset (safety redundancy)
|
|
|
|
|
-- print("DataStore_Stats.lua -- ScanStats", format("%.3f",GetTime()%100)) -- DEBUG 2025 07 21 - 3
|
|
|
|
|
|
|
|
|
|
local stats = addon.ThisCharacter.Stats
|
|
|
|
|
wipe(stats)
|
|
|
|
|
|
|
|
|
|
stats["HealthMax"] = UnitHealthMax("player")
|
|
|
|
|
-- info on power types here : http://www.wowwiki.com/API_UnitPowerType
|
|
|
|
|
stats["MaxPower"] = UnitPowerType("player") .. "|" .. UnitPowerMax("player")
|
|
|
|
|
|
|
|
|
|
local t = {}
|
|
|
|
|
-- *** resistances ***
|
|
|
|
|
for i = 1, 6 do
|
|
|
|
|
_, t[i] = UnitResistance("player", i)
|
|
|
|
|
-- base, total, bonus, minus = UnitResistance(unitId [, resistanceIndex])
|
|
|
|
|
-- base = base
|
|
|
|
|
-- total = total after all modifiers
|
|
|
|
|
-- bonus = positive modif total
|
|
|
|
|
-- minus = negative ...
|
|
|
|
|
end
|
|
|
|
|
stats["Resistances"] = table.concat(t, "|") -- ["Resistances"] = "holy | fire | nature | frost | shadow | arcane"
|
|
|
|
|
|
|
|
|
|
-- *** base stats ***
|
|
|
|
|
for i = 1, 5 do
|
|
|
|
|
t[i] = UnitStat("player", i)
|
|
|
|
|
-- stat, effectiveStat, posBuff, negBuff = UnitStat("player", statIndex);
|
|
|
|
|
end
|
|
|
|
|
t[6] = UnitArmor("player")
|
|
|
|
|
stats["Base"] = table.concat(t, "|") -- ["Base"] = "strength | agility | stamina | intellect | spirit | armor"
|
|
|
|
|
|
|
|
|
|
-- *** melee stats ***
|
|
|
|
|
local minDmg, maxDmg = UnitDamage("player")
|
|
|
|
|
t[1] = floor(minDmg) .."-" ..ceil(maxDmg) -- Damage "215-337"
|
|
|
|
|
t[2] = UnitAttackSpeed("player")
|
|
|
|
|
t[3] = UnitAttackPower("player")
|
|
|
|
|
t[4] = GetCombatRating(CR_HIT_MELEE)
|
|
|
|
|
t[5] = GetCritChance()
|
|
|
|
|
t[6] = GetExpertise()
|
|
|
|
|
stats["Melee"] = table.concat(t, "|") -- ["Melee"] = "Damage | Speed | Power | Hit rating | Crit chance | Expertise"
|
|
|
|
|
|
|
|
|
|
-- *** ranged stats ***
|
|
|
|
|
local speed
|
|
|
|
|
speed, minDmg, maxDmg = UnitRangedDamage("player")
|
|
|
|
|
t[1] = floor(minDmg) .."-" ..ceil(maxDmg)
|
|
|
|
|
t[2] = speed
|
|
|
|
|
t[3] = UnitRangedAttackPower("player")
|
|
|
|
|
t[4] = GetCombatRating(CR_HIT_RANGED)
|
|
|
|
|
t[5] = GetRangedCritChance()
|
|
|
|
|
t[6] = nil
|
|
|
|
|
stats["Ranged"] = table.concat(t, "|") -- ["Ranged"] = "Damage | Speed | Power | Hit rating | Crit chance"
|
|
|
|
|
|
|
|
|
|
-- *** spell stats ***
|
|
|
|
|
t[1] = GetSpellBonusDamage(2) -- 2, since 1 = physical damage
|
|
|
|
|
t[2] = GetSpellBonusHealing()
|
|
|
|
|
t[3] = GetCombatRating(CR_HIT_SPELL)
|
|
|
|
|
t[4] = GetSpellCritChance(2)
|
|
|
|
|
t[5] = GetCombatRating(CR_HASTE_SPELL)
|
|
|
|
|
t[6] = floor(GetManaRegen() * 5.0)
|
|
|
|
|
stats["Spell"] = table.concat(t, "|") -- ["Spell"] = "+Damage | +Healing | Hit | Crit chance | Haste | Mana Regen"
|
|
|
|
|
|
|
|
|
|
-- *** defenses stats ***
|
|
|
|
|
t[1] = UnitArmor("player")
|
|
|
|
|
t[2] = UnitDefense("player")
|
|
|
|
|
t[3] = GetDodgeChance()
|
|
|
|
|
t[4] = GetParryChance()
|
|
|
|
|
t[5] = GetBlockChance()
|
|
|
|
|
local minResilience = min(GetCombatRating(CR_CRIT_TAKEN_MELEE), GetCombatRating(CR_CRIT_TAKEN_RANGED))
|
|
|
|
|
t[6] = min(minResilience, GetCombatRating(CR_CRIT_TAKEN_SPELL))
|
|
|
|
|
stats["Defense"] = table.concat(t, "|") -- ["Defense"] = "Armor | Defense | Dodge | Parry | Block | Resilience"
|
|
|
|
|
|
|
|
|
|
-- *** PVP Stats ***
|
|
|
|
|
t[1], t[2] = GetPVPLifetimeStats()
|
|
|
|
|
t[3] = GetArenaCurrency()
|
|
|
|
|
t[4] = GetHonorCurrency()
|
|
|
|
|
t[5] = nil
|
|
|
|
|
t[6] = nil
|
|
|
|
|
stats["PVP"] = table.concat(t, "|") -- ["PVP"] = "honorable kills | dishonorable kills | arena points | honor points"
|
|
|
|
|
|
|
|
|
|
-- *** Arena Teams ***
|
|
|
|
|
for i = 1, MAX_ARENA_TEAMS do
|
|
|
|
|
local teamName, teamSize = GetArenaTeam(i)
|
|
|
|
|
if teamName then
|
|
|
|
|
stats["Arena"..teamSize] = table.concat({ GetArenaTeam(i) }, "|")
|
|
|
|
|
-- more info here : http://www.wowwiki.com/API_GetArenaTeam
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
addon.ThisCharacter.lastUpdate = time()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function addon:OnEnable()
|
|
|
|
|
addon:RegisterEvent("PLAYER_ALIVE")
|
|
|
|
|
-- addon:RegisterEvent("UNIT_INVENTORY_CHANGED", ScanStats)
|
|
|
|
|
addon:RegisterEvent("UNIT_INVENTORY_CHANGED")
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function addon:OnDisable()
|
|
|
|
|
addon:UnregisterEvent("PLAYER_ALIVE")
|
|
|
|
|
addon:UnregisterEvent("UNIT_INVENTORY_CHANGED")
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- *** EVENT HANDLERS ***
|
|
|
|
|
function addon:PLAYER_ALIVE()
|
|
|
|
|
-- print("DataStore_Stats.lua") -- DEBUG 2025 07 21
|
|
|
|
|
if not UnitIsGhost("player") then return end -- only scan if player released spirit and went to graveyard
|
|
|
|
|
|
|
|
|
|
ScanStats()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function addon:UNIT_INVENTORY_CHANGED()
|
|
|
|
|
-- this function limits calls to "ScanStats" to max 1 every second
|
|
|
|
|
|
|
|
|
|
-- print("DataStore_Stats.lua -- UNIT_INVENTORY_CHANGED", DEBUG_CNT, format("%.3f",GetTime()%100)) -- DEBUG 2025 07 21 - 3
|
|
|
|
|
|
|
|
|
|
if FCSP_timer_UNIT_INVENTORY_CHANGED then return end
|
|
|
|
|
FCSP_timer_UNIT_INVENTORY_CHANGED = addon:ScheduleTimer(ScanStats, 1)
|
|
|
|
|
end
|