Modify match stat handling

master
shivajiva101 2020-10-11 20:09:00 +01:00 committed by Shivajiva
parent 7e0625354e
commit f2e965a2e5
1 changed files with 90 additions and 60 deletions

150
init.lua
View File

@ -52,7 +52,8 @@ local WP = minetest.get_worldpath()
local registered_players = {} -- temp prematch buffer local registered_players = {} -- temp prematch buffer
local schempath = MP.."/schems/" local schempath = MP.."/schems/"
local stats = minetest.deserialize(mod_data:get_string('statistics')) or {} local stats = minetest.deserialize(mod_data:get_string('statistics')) or {}
local reload = true local dev = false -- set this to true if testing locally
local reload = dev == false
local tmp_tbl, tmp_hud = {}, {} local tmp_tbl, tmp_hud = {}, {}
local r_rate = 5 local r_rate = 5
@ -404,10 +405,10 @@ local function initialise_stats(name)
end end
--- Displays match results as a formspec --- Displays match results as a formspec
-- @param match_rank - table of ranked match players -- @param match - table of ranked match players
-- @param arena_id - integer index of arena -- @param arena_id - integer index of arena
-- @return nothing -- @return nothing
local function display_match_results(match_rank, arena_id) local function display_match_results(match, arena_id)
local get_player_by_name = minetest.get_player_by_name local get_player_by_name = minetest.get_player_by_name
local fs = { local fs = {
'size[8,6]', 'size[8,6]',
@ -418,7 +419,7 @@ local function display_match_results(match_rank, arena_id)
'label[6.1,0;Eggs]', 'label[6.1,0;Eggs]',
'label[7,0;Falls]' 'label[7,0;Falls]'
} }
for i, v in ipairs(match_rank) do for i, v in ipairs(match) do
local c = eggwars.arena[arena_id].colour[v.id] local c = eggwars.arena[arena_id].colour[v.id]
fs[#fs + 1] = 'label[0,'..(0.5 * i)..';'..eggwars.colorize(c, i)..']' fs[#fs + 1] = 'label[0,'..(0.5 * i)..';'..eggwars.colorize(c, i)..']'
fs[#fs + 1] = 'label[1,'..(0.5 * i)..';'..eggwars.colorize(c, v.name)..']' fs[#fs + 1] = 'label[1,'..(0.5 * i)..';'..eggwars.colorize(c, v.name)..']'
@ -429,7 +430,7 @@ local function display_match_results(match_rank, arena_id)
end end
fs[#fs + 1] = 'button_exit[3,5;2,1;btn_e;OK]' fs[#fs + 1] = 'button_exit[3,5;2,1;btn_e;OK]'
local res = table.concat(fs) local res = table.concat(fs)
for i, v in ipairs(match_rank) do for i, v in ipairs(match) do
local player = get_player_by_name(v.name) local player = get_player_by_name(v.name)
if player then if player then
minetest.show_formspec(v.name, '', res) minetest.show_formspec(v.name, '', res)
@ -702,6 +703,7 @@ eggwars.begin_match = function ()
-- spawn = spawn point -- spawn = spawn point
-- spawner = pos of gold spawner -- spawner = pos of gold spawner
-- trader = entity obj -- trader = entity obj
-- winner = integer
-- --
-- match.spawners - diamond and ruby spawner positions -- match.spawners - diamond and ruby spawner positions
-- match.stats - match statistics -- match.stats - match statistics
@ -767,6 +769,7 @@ eggwars.begin_match = function ()
match.player[name].rate = spwnr match.player[name].rate = spwnr
match.player[name].shop_items = {} match.player[name].shop_items = {}
match.player[name].spawn = sp match.player[name].spawn = sp
match.player[name].winner = 0
initialise_stats(name) initialise_stats(name)
@ -794,7 +797,7 @@ eggwars.begin_match = function ()
meta:set_string('owner', name) meta:set_string('owner', name)
meta:set_string('infotext', name .. "'s egg") meta:set_string('infotext', name .. "'s egg")
if eggwars.gauges then gauges.add(player) end if eggwars.gauges then gauges.add(player) end -- luacheck: ignore
-- Create players shop items table -- Create players shop items table
match.player[name].shop_items = { match.player[name].shop_items = {
@ -808,7 +811,11 @@ eggwars.begin_match = function ()
}, },
description = def.cs[id][1] .. " Wool", description = def.cs[id][1] .. " Wool",
image = 'wool_' .. def.cs[id][3] .. '.png', image = 'wool_' .. def.cs[id][3] .. '.png',
cost = {name = "default:gold_ingot", count = 5, wear = 0, metadata = ""}, cost = {name = "default:gold_ingot",
count = 5,
wear = 0,
metadata = ""
},
entry = 0, entry = 0,
} }
} }
@ -820,7 +827,10 @@ eggwars.begin_match = function ()
-- Give arena privs -- Give arena privs
minetest.set_player_privs(name, {interact = true, shout = true}) minetest.set_player_privs(name, {interact = true, shout = true})
if eggwars.playertag then playertag.set(player, 1, def.cs[id][2]) end -- Set playertag colour
if eggwars.playertag then
playertag.set(player, 1, def.cs[id][2]) -- luacheck: ignore
end
-- Add home waypoint -- Add home waypoint
sp.y = sp.y - 4 sp.y = sp.y - 4
@ -833,7 +843,7 @@ eggwars.begin_match = function ()
}) })
end end
-- Diamond spawners -- Add diamond spawners
spwnr = def.spawners.diamond.rate spwnr = def.spawners.diamond.rate
for idx, v in ipairs(def.spawners.diamond) do for idx, v in ipairs(def.spawners.diamond) do
adj = vector.add(pos, v) adj = vector.add(pos, v)
@ -842,7 +852,7 @@ eggwars.begin_match = function ()
table.insert(match.spawners, adj) table.insert(match.spawners, adj)
end end
-- Ruby spawners -- Add ruby spawners
spwnr = def.spawners.ruby.rate spwnr = def.spawners.ruby.rate
for idx, v in ipairs(def.spawners.ruby) do for idx, v in ipairs(def.spawners.ruby) do
adj = vector.add(pos, v) adj = vector.add(pos, v)
@ -880,8 +890,7 @@ end
eggwars.end_match = function(key) eggwars.end_match = function(key)
local def = eggwars.match[key] local def = eggwars.match[key]
local match_rank = {} local match = {}
local windex
remove_match_hud(key) remove_match_hud(key)
eggwars.match[key].uid = 0 eggwars.match[key].uid = 0
@ -898,48 +907,40 @@ eggwars.end_match = function(key)
end end
for name, pdef in pairs(def.player) do for name, pdef in pairs(def.player) do
--stop island spawner
--stop gold spawner
minetest.get_node_timer(pdef.spawner):stop() minetest.get_node_timer(pdef.spawner):stop()
-- remove objects on gold spawner
-- remove objects around spawner
local w = minetest.get_objects_inside_radius(pdef.spawner, 2) local w = minetest.get_objects_inside_radius(pdef.spawner, 2)
for _, obj in ipairs(w) do for _, obj in ipairs(w) do
if not obj:is_player() then if not obj:is_player() then
obj:remove() obj:remove()
end end
end end
-- remove spawner node
-- remove spawner
minetest.remove_node(pdef.spawner) minetest.remove_node(pdef.spawner)
-- Update stats
-- Update global stats
local s = stats.player[name] local s = stats.player[name]
s.kills = s.kills + pdef.kills s.kills = s.kills + pdef.kills
s.falls = s.falls + pdef.falls s.falls = s.falls + pdef.falls
s.damage = s.damage + pdef.damage s.damage = s.damage + pdef.damage
s.plays = s.plays + 1 s.plays = s.plays + 1
s.wins = s.wins + pdef.winner
if pdef.win then
s.wins = s.wins + 1
end
-- rank match player -- rank match player
local res = { local record = {
damage = pdef.damage, damage = pdef.damage,
eggs = pdef.eggs, eggs = pdef.eggs,
falls = pdef.falls, falls = pdef.falls,
id = pdef.id, -- colour ref id = pdef.id, -- colour ref
kills = pdef.kills, kills = pdef.kills,
name = name, name = name,
win = pdef.win or false win = pdef.winner
} }
local idx = #match_rank + 1 table.insert(match, record)
for i, v in ipairs(match_rank) do
if v.win then windex = i end
if res.kills > v.kills then
idx = i
break
end
end
table.insert(match_rank, idx, res)
local player = minetest.get_player_by_name(name) local player = minetest.get_player_by_name(name)
if player then if player then
@ -953,14 +954,14 @@ eggwars.end_match = function(key)
player:set_nametag_attributes({ player:set_nametag_attributes({
color = {a = 255, r = 255, g = 255, b = 255}}) --Make nametag visible color = {a = 255, r = 255, g = 255, b = 255}}) --Make nametag visible
else else
playertag.set(player, 1) playertag.set(player, 1) -- luacheck: ignore
end end
player:set_properties({visual_size = {x = 1, y = 1, z = 1}}) --Make player visible player:set_properties({visual_size = {x = 1, y = 1, z = 1}}) --Make player visible
else else
-- reset player -- reset player
if eggwars.armor then eggwars.clear_armor(player) end if eggwars.armor then eggwars.clear_armor(player) end
eggwars.clear_inventory(player) eggwars.clear_inventory(player)
if pdef.win then if pdef.winner == 1 then
minetest.chat_send_all(minetest.colorize( minetest.chat_send_all(minetest.colorize(
"green", "*** " .. name .. " won their match!") "green", "*** " .. name .. " won their match!")
) )
@ -979,29 +980,58 @@ eggwars.end_match = function(key)
end end
-- rank winner -- rank winner
local tmp table.sort(match, function(a, b)
return a.winner > b.winner
if windex then end)
tmp = match_rank[windex] if match[1].winner == 0 then
table.remove(match_rank, windex) -- on kills
table.insert(match_rank, 1, tmp) table.sort(stats.rankings, function(a, b)
else return a.kills > b.kills
tmp = match_rank[1] end)
-- check winner
if match[1].kills == 0 then
-- resort for damage
table.sort(stats.rankings, function(a, b)
return a.damage > b.damage
end)
end
end end
local rank = { local tmp = match[1]
damage = tmp.damage,
eggs = tmp.eggs, if tmp.winner == 1 then
falls = tmp.falls, local rank = {
kills = tmp.kills, damage = tmp.damage,
name = tmp.name, eggs = tmp.eggs,
wins = stats.player[tmp.name].wins falls = tmp.falls,
} kills = tmp.kills,
table.insert(stats.rankings, rank) name = tmp.name,
if #stats.rankings > 1 then wins = stats.player[tmp.name].wins
table.sort(stats.rankings, function(a, b) return a.wins > b.wins end) }
if #stats.rankings > 20 then local new_entry = true
table.remove(stats.rankings, #stats.rankings) for i,v in ipairs(stats.rankings) do
if v.name == rank.name then
-- update entry
new_entry = false
v.damage = v.damage + rank.damage
v.eggs = v.eggs + rank.eggs
v.falls = v.falls + rank.falls
v.kills = v.kills + rank.kills
v.wins = rank.wins
end
end
if new_entry then
table.insert(stats.rankings, rank)
end
if #stats.rankings > 1 then
table.sort(stats.rankings, function(a, b)
return a.wins > b.wins
end)
if #stats.rankings > 20 then
table.remove(stats.rankings, #stats.rankings)
end
end end
end end
@ -1014,7 +1044,7 @@ eggwars.end_match = function(key)
-- store data -- store data
save_persistant() save_persistant()
-- finally -- finally
display_match_results(match_rank, def.arena) display_match_results(match, def.arena)
end end
--- Colour a message string using rgb --- Colour a message string using rgb
@ -1318,11 +1348,11 @@ minetest.register_on_dieplayer(function(player, reason)
if not eggwars.playertag then if not eggwars.playertag then
player:set_nametag_attributes({color = {a = 0, r = 0, g = 0, b = 0}}) player:set_nametag_attributes({color = {a = 0, r = 0, g = 0, b = 0}})
else else
playertag.set(player, 0, {a=0,r=0,g=0,b=0}) playertag.set(player, 0, {a=0,r=0,g=0,b=0}) -- luacheck: ignore
end end
player:set_properties({visual_size = {x = 0, y = 0}}) --Make player invisible player:set_properties({visual_size = {x = 0, y = 0}}) --Make player invisible
if eggwars.gauges then gauges.remove(name) end if eggwars.gauges then gauges.remove(name) end -- luacheck: ignore
if eggwars.armor then eggwars.clear_armor(player) end if eggwars.armor then eggwars.clear_armor(player) end
def.player[name].alive = false def.player[name].alive = false
@ -1336,7 +1366,7 @@ minetest.register_on_dieplayer(function(player, reason)
-- Are we down to 1 player alive yet? -- Are we down to 1 player alive yet?
if def.alive == 1 then if def.alive == 1 then
if killer then def.player[killer].win = true end if killer then def.player[killer].winner = 1 end
eggwars.end_match(key) eggwars.end_match(key)
end end
elseif def.player[name].alive and def.player[name].egg then elseif def.player[name].alive and def.player[name].egg then
@ -1415,7 +1445,7 @@ end, false)
-- knockback override for match players -- knockback override for match players
local old_calculate_knockback = minetest.calculate_knockback local old_calculate_knockback = minetest.calculate_knockback
function minetest.calculate_knockback(player, ...) function minetest.calculate_knockback(player, ...) -- luacheck: ignore
if eggwars.player[player:get_player_name()] then if eggwars.player[player:get_player_name()] then
return 3 return 3
end end