diff options
Diffstat (limited to 'Data/BuiltIn/Libraries/lua-addons/addons/scoreboard/player.lua')
-rw-r--r-- | Data/BuiltIn/Libraries/lua-addons/addons/scoreboard/player.lua | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/scoreboard/player.lua b/Data/BuiltIn/Libraries/lua-addons/addons/scoreboard/player.lua new file mode 100644 index 0000000..18bcf94 --- /dev/null +++ b/Data/BuiltIn/Libraries/lua-addons/addons/scoreboard/player.lua @@ -0,0 +1,178 @@ +--[[ +Object to encapsulate Player battle data + +For each mob fought, a separate player instance will be stored. Therefore +there will be multiple Player instances for each actual player in the game. +This allows for easier mob filtering. +]] + +local Player = {} + +function Player:new (o) + o = o or {} + + assert(o.name, "Must pass a name to player constructor") + -- attrs should be defined in Player above but due to interpreter bug it's here for now + local attrs = { + clock = nil, -- specific DPS clock for this player + damage = 0, -- total damage done by this player + ws = T{}, -- table of all WS and their corresponding damage + ws_misses = 0, -- total ws misses + m_hits = 0, -- total melee hits + m_misses = 0, -- total melee misses + m_min = math.huge, -- minimum melee damage + m_max = 0, -- maximum melee damage + m_avg = 0, -- avg melee damage + m_crits = 0, -- total melee crits + m_crit_min = math.huge, -- minimum melee crit + m_crit_max = 0, -- maximum melee crit + m_crit_avg = 0, -- avg melee crit + r_hits = 0, -- total ranged hits + r_min = math.huge, -- minimum ranged damage + r_max = 0, -- maximum ranged damage + r_avg = 0, -- avg ranged damage + r_misses = 0, -- total ranged misses + r_crits = 0, -- total ranged crits + r_crit_min = math.huge, -- minimum ranged crit + r_crit_max = 0, -- maximum ranged crit + r_crit_avg = 0, -- avg ranged crit + jobabils = 0, -- total damage from JAs + spells = 0, -- total damage from spells + + parries = 0, -- total number of parries + blocks = 0, -- total number of blocks/guards + nonblocks = 0, -- total number of nonblocks + evades = 0, -- total number of evades + damage_taken = 0, -- total damage taken by this player + + } + attrs.name = o.name + o = attrs + if o.name:match('^Skillchain%(') then + o.is_sc = true + else + o.is_sc = false + end + + setmetatable(o, self) + self.__index = self + + return o +end + + +function Player:add_damage(damage) + self.damage = self.damage + damage +end + + +function Player:add_ws_damage(ws_name, damage) + --[[ + if not self.ws[ws_name] then + self.ws[ws_name] = L{} + end + + self.ws[ws_name]:append(damage) + ]] + self.ws:append(damage) + self.damage = self.damage + damage +end + + +function Player:add_m_hit(damage) + -- increment hits + self.m_hits = self.m_hits + 1 + + -- update min/max/avg melee values + self.m_min = math.min(self.m_min, damage) + self.m_max = math.max(self.m_max, damage) + self.m_avg = self.m_avg * (self.m_hits - 1)/self.m_hits + damage/self.m_hits + + -- accumulate damage + self.damage = self.damage + damage +end + + +function Player:add_m_crit(damage) + -- increment crits + self.m_crits = self.m_crits + 1 + + -- update min/max/avg melee values + self.m_crit_min = math.min(self.m_crit_min, damage) + self.m_crit_max = math.max(self.m_crit_max, damage) + self.m_crit_avg = self.m_crit_avg * (self.m_crits - 1)/self.m_crits + damage/self.m_crits + + -- accumulate damage + self.damage = self.damage + damage +end + +function Player:incr_m_misses() self.m_misses = self.m_misses + 1 end + +function Player:incr_ws_misses() self.ws_misses = self.ws_misses + 1 end + +function Player:add_r_hit(damage) + -- increment hits + self.r_hits = self.r_hits + 1 + + -- update min/max/avg melee values + self.r_min = math.min(self.r_min, damage) + self.r_max = math.max(self.r_max, damage) + self.r_avg = self.r_avg * (self.r_hits - 1)/self.r_hits + damage/self.r_hits + + -- accumulate damage + self.damage = self.damage + damage +end + + +function Player:add_r_crit(damage) + -- increment crits + self.r_crits = self.r_crits + 1 + + -- update min/max/avg melee values + self.r_crit_min = math.min(self.r_crit_min, damage) + self.r_crit_max = math.max(self.r_crit_max, damage) + self.r_crit_avg = self.r_crit_avg * (self.r_crits - 1)/self.r_crits + damage/self.r_crits + + -- accumulate damage + self.damage = self.damage + damage +end + + +function Player:incr_r_misses() self.r_misses = self.r_misses + 1 end + +-- Returns the name of this player +function Player:get_name() return self.name end + + + +return Player + +--[[ +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. +]] + + |