diff options
Diffstat (limited to 'Data/BuiltIn/Libraries/lua-addons/addons/scoreboard/mergedplayer.lua')
-rw-r--r-- | Data/BuiltIn/Libraries/lua-addons/addons/scoreboard/mergedplayer.lua | 354 |
1 files changed, 354 insertions, 0 deletions
diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/scoreboard/mergedplayer.lua b/Data/BuiltIn/Libraries/lua-addons/addons/scoreboard/mergedplayer.lua new file mode 100644 index 0000000..8346cfd --- /dev/null +++ b/Data/BuiltIn/Libraries/lua-addons/addons/scoreboard/mergedplayer.lua @@ -0,0 +1,354 @@ +--[[ + The entire mergedplayer file exists to flatten individual stats in the db + into two numbers (per name). So normally the db is: + dps_db.dp[mob_name][player_name] = {stats} + Mergedplayer iterates over mob_name and returns a table that's just: + tab[player_name] = {CalculatedStatA,CalculatedStatB} +]] + +local MergedPlayer = {} + +function MergedPlayer:new (o) + o = o or {} + + assert(o.players and #o.players > 0, + "MergedPlayer constructor requires at least one Player instance.") + + setmetatable(o, self) + self.__index = self + + return o +end + +--[[ + 'wsmin', 'wsmax', 'wsavg' +]] + +function MergedPlayer:mavg() + local hits, hit_dmg = 0, 0 + + for _, p in ipairs(self.players) do + hits = hits + p.m_hits + hit_dmg = hit_dmg + p.m_hits*p.m_avg + end + + if hits > 0 then + return { hit_dmg / hits, hits} + else + return {0, 0} + end +end + + +function MergedPlayer:mrange() + local m_min, m_max = math.huge, 0 + + for _, p in ipairs(self.players) do + m_min = math.min(m_min, p.m_min) + m_max = math.max(m_max, p.m_max) + end + + return {m_min~=math.huge and m_min or m_max, m_max} +end + + +function MergedPlayer:critavg() + local crits, crit_dmg = 0, 0 + + for _, p in ipairs(self.players) do + crits = crits + p.m_crits + crit_dmg = crit_dmg + p.m_crits*p.m_crit_avg + end + + if crits > 0 then + return { crit_dmg / crits, crits} + else + return {0, 0} + end +end + + +function MergedPlayer:critrange() + local m_crit_min, m_crit_max = math.huge, 0 + + for _, p in ipairs(self.players) do + m_crit_min = math.min(m_crit_min, p.m_crit_min) + m_crit_max = math.max(m_crit_max, p.m_crit_max) + end + + return {m_crit_min~=math.huge and m_crit_min or m_crit_max, m_crit_max} +end + + +function MergedPlayer:ravg() + local r_hits, r_hit_dmg = 0, 0 + + for _, p in ipairs(self.players) do + r_hits = r_hits + p.r_hits + r_hit_dmg = r_hit_dmg + p.r_hits*p.r_avg + end + + if r_hits > 0 then + return { r_hit_dmg / r_hits, r_hits} + else + return {0, 0} + end +end + + +function MergedPlayer:rrange() + local r_min, r_max = math.huge, 0 + + for _, p in ipairs(self.players) do + r_min = math.min(r_min, p.r_min) + r_max = math.max(r_max, p.r_max) + end + + return {r_min~=math.huge and r_min or r_max, r_max} +end + + +function MergedPlayer:rcritavg() + local r_crits, r_crit_dmg = 0, 0 + + for _, p in ipairs(self.players) do + r_crits = r_crits + p.r_crits + r_crit_dmg = r_crit_dmg + p.r_crits*p.r_crit_avg + end + + if r_crits > 0 then + return { r_crit_dmg / r_crits, r_crits} + else + return {0, 0} + end +end + + +function MergedPlayer:rcritrange() + local r_crit_min, r_crit_max = math.huge, 0 + + for _, p in ipairs(self.players) do + r_crit_min = math.min(r_crit_min, p.r_crit_min) + r_crit_max = math.max(r_crit_max, p.r_crit_max) + end + + return {r_crit_min~=math.huge and r_crit_min or r_crit_max, r_crit_max} +end + + +function MergedPlayer:acc() + local hits, crits, misses = 0, 0, 0 + + for _, p in ipairs(self.players) do + hits = hits + p.m_hits + crits = crits + p.m_crits + misses = misses + p.m_misses + end + + local total = hits + crits + misses + if total > 0 then + return {(hits + crits) / total, total} + else + return {0, 0} + end +end + + +function MergedPlayer:racc() + local hits, crits, misses = 0, 0, 0 + + for _, p in ipairs(self.players) do + hits = hits + p.r_hits + crits = crits + p.r_crits + misses = misses + p.r_misses + end + + local total = hits + crits + misses + if total > 0 then + return {(hits + crits) / total, total} + else + return {0, 0} + end +end + + +function MergedPlayer:crit() + local hits, crits = 0, 0 + + for _, p in ipairs(self.players) do + hits = hits + p.m_hits + crits = crits + p.m_crits + end + + local total = hits + crits + if total > 0 then + return {crits / total, total} + else + return {0, 0} + end +end + + +function MergedPlayer:rcrit() + local hits, crits = 0, 0 + + for _, p in ipairs(self.players) do + hits = hits + p.r_hits + crits = crits + p.r_crits + end + + local total = hits + crits + if total > 0 then + return {crits / total, total} + else + return {0, 0} + end +end + + +function MergedPlayer:wsavg() + local wsdmg = 0 + local wscount = 0 + --[[ + for _, p in pairs(self.players) do + for _, dmgtable in pairs(p.ws) do + for _, dmg in pairs(dmgtable) do + wsdmg = wsdmg + dmg + wscount = wscount + 1 + end + end + end + ]] + + for _, p in pairs(self.players) do + for _, dmg in pairs(p.ws) do + wsdmg = wsdmg + dmg + wscount = wscount + 1 + end + end + + if wscount > 0 then + return {wsdmg / wscount, wscount} + else + return {0, 0} + end +end + +function MergedPlayer:wsacc() + local hits, misses = 0, 0 + + for _, p in ipairs(self.players) do + hits = hits + table.length(p.ws) + misses = misses + p.ws_misses + end + + local total = hits + misses + if total > 0 then + return {hits / total, total} + else + return {0, 0} + end +end + +-- Unused atm +function MergedPlayer:merge(other) + self.damage = self.damage + other.damage + + for ws_id, values in pairs(other.ws) do + if self.ws[ws_id] then + for _, value in ipairs(values) do + self.ws[ws_id]:append(value) + end + else + self.ws[ws_id] = table.copy(values) + end + end + + self.m_hits = self.m_hits + other.m_hits + self.m_misses = self.m_misses + other.m_misses + self.m_min = math.min(self.m_min, other.m_min) + self.m_max = math.max(self.m_max, other.m_max) + + local total_m_hits = self.m_hits + other.m_hits + if total_m_hits > 0 then + self.m_avg = self.m_avg * self.m_hits/total_m_hits + + other.m_avg * other.m_hits/total_m_hits + else + self.m_avg = 0 + end + + self.m_crits = self.m_crits + other.m_crits + self.m_crit_min = math.min(self.m_crit_min, other.m_crit_min) + self.m_crit_max = math.max(self.m_crit_max, other.m_crit_max) + + local total_m_crits = self.m_crits + other.m_crits + if total_m_crits > 0 then + self.m_crit_avg = self.m_crit_avg * self.m_crits / total_m_crits + + other.m_crit_avg * other.m_crits / total_m_crits + else + self.m_crit_avg = 0 + end + + self.r_hits = self.r_hits + other.r_hits + self.r_misses = self.r_misses + other.r_misses + self.r_min = math.min(self.r_min, other.r_min) + self.r_max = math.max(self.r_max, other.r_max) + + local total_r_hits = self.r_hits + other.r_hits + if total_r_hits > 0 then + self.r_avg = self.r_avg * self.r_hits/total_r_hits + + other.r_avg * other.r_hits/total_r_hits + else + self.r_avg = 0 + end + + self.r_crits = self.r_crits + other.r_crits + self.r_crit_min = math.min(self.r_crit_min, other.r_crit_min) + self.r_crit_max = math.max(self.r_crit_max, other.r_crit_max) + + local total_r_crits = self.r_crits + other.r_crits + if total_r_crits > 0 then + self.r_crit_avg = self.r_crit_avg * self.r_crits / total_r_crits + + other.r_crit_avg * other.r_crits / total_r_crits + else + self.r_crit_avg = 0 + end + + self.jobabils = self.jobabils + other.jobabils + self.spells = self.spells + other.spells +end + + + + +return MergedPlayer + +--[[ +Copyright (c) 2013, Jerry Hebert +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Scoreboard nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL JERRY HEBERT BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +]] + + |