Compare commits

...

5 Commits

Author SHA1 Message Date
shivajiva101 37aa262d9f
Update README.md 2021-12-10 22:22:59 +00:00
shivajiva101 f2e965a2e5 Modify match stat handling 2020-10-11 20:18:48 +01:00
shivajiva101 7e0625354e
Revert prev commit correctly removing sprint FOV 2020-09-27 00:43:24 +01:00
shivajiva101 9676673c6f
Remove FOV modifiers - breaks zoom 2020-09-27 00:14:37 +01:00
shivajiva101 a27872af29
Fixes constantly resetting player physics when player isn't sprinting 2020-09-26 22:57:22 +01:00
3 changed files with 95 additions and 65 deletions

View File

@ -3,7 +3,7 @@
## What this is
This mod is inspired by the Minecraft mod of the same name and has similar features.
Each player's goal is to defend their egg and be the last person standing. If a player dies - either from being killed by another player or falling off - they will re-spawn whilst their egg is intact. If it is not intact, they experience match death and enter into spectator mode.
Each player's goal is to defend their egg and be the last person standing. If a player dies either from being killed by another player or falling off, they will re-spawn whilst their egg is intact, if it has been destroyed, they experience match death and enter into spectator mode.
When there is one player left standing in a match, they are declared the winner.

150
init.lua
View File

@ -52,7 +52,8 @@ local WP = minetest.get_worldpath()
local registered_players = {} -- temp prematch buffer
local schempath = MP.."/schems/"
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 r_rate = 5
@ -404,10 +405,10 @@ local function initialise_stats(name)
end
--- 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
-- @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 fs = {
'size[8,6]',
@ -418,7 +419,7 @@ local function display_match_results(match_rank, arena_id)
'label[6.1,0;Eggs]',
'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]
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)..']'
@ -429,7 +430,7 @@ local function display_match_results(match_rank, arena_id)
end
fs[#fs + 1] = 'button_exit[3,5;2,1;btn_e;OK]'
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)
if player then
minetest.show_formspec(v.name, '', res)
@ -702,6 +703,7 @@ eggwars.begin_match = function ()
-- spawn = spawn point
-- spawner = pos of gold spawner
-- trader = entity obj
-- winner = integer
--
-- match.spawners - diamond and ruby spawner positions
-- match.stats - match statistics
@ -767,6 +769,7 @@ eggwars.begin_match = function ()
match.player[name].rate = spwnr
match.player[name].shop_items = {}
match.player[name].spawn = sp
match.player[name].winner = 0
initialise_stats(name)
@ -794,7 +797,7 @@ eggwars.begin_match = function ()
meta:set_string('owner', name)
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
match.player[name].shop_items = {
@ -808,7 +811,11 @@ eggwars.begin_match = function ()
},
description = def.cs[id][1] .. " Wool",
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,
}
}
@ -820,7 +827,10 @@ eggwars.begin_match = function ()
-- Give arena privs
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
sp.y = sp.y - 4
@ -833,7 +843,7 @@ eggwars.begin_match = function ()
})
end
-- Diamond spawners
-- Add diamond spawners
spwnr = def.spawners.diamond.rate
for idx, v in ipairs(def.spawners.diamond) do
adj = vector.add(pos, v)
@ -842,7 +852,7 @@ eggwars.begin_match = function ()
table.insert(match.spawners, adj)
end
-- Ruby spawners
-- Add ruby spawners
spwnr = def.spawners.ruby.rate
for idx, v in ipairs(def.spawners.ruby) do
adj = vector.add(pos, v)
@ -880,8 +890,7 @@ end
eggwars.end_match = function(key)
local def = eggwars.match[key]
local match_rank = {}
local windex
local match = {}
remove_match_hud(key)
eggwars.match[key].uid = 0
@ -898,48 +907,40 @@ eggwars.end_match = function(key)
end
for name, pdef in pairs(def.player) do
--stop island spawner
--stop gold spawner
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)
for _, obj in ipairs(w) do
if not obj:is_player() then
obj:remove()
end
end
-- remove spawner node
-- remove spawner
minetest.remove_node(pdef.spawner)
-- Update stats
-- Update global stats
local s = stats.player[name]
s.kills = s.kills + pdef.kills
s.falls = s.falls + pdef.falls
s.damage = s.damage + pdef.damage
s.plays = s.plays + 1
if pdef.win then
s.wins = s.wins + 1
end
s.wins = s.wins + pdef.winner
-- rank match player
local res = {
local record = {
damage = pdef.damage,
eggs = pdef.eggs,
falls = pdef.falls,
id = pdef.id, -- colour ref
kills = pdef.kills,
name = name,
win = pdef.win or false
win = pdef.winner
}
local idx = #match_rank + 1
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)
table.insert(match, record)
local player = minetest.get_player_by_name(name)
if player then
@ -953,14 +954,14 @@ eggwars.end_match = function(key)
player:set_nametag_attributes({
color = {a = 255, r = 255, g = 255, b = 255}}) --Make nametag visible
else
playertag.set(player, 1)
playertag.set(player, 1) -- luacheck: ignore
end
player:set_properties({visual_size = {x = 1, y = 1, z = 1}}) --Make player visible
else
-- reset player
if eggwars.armor then eggwars.clear_armor(player) end
eggwars.clear_inventory(player)
if pdef.win then
if pdef.winner == 1 then
minetest.chat_send_all(minetest.colorize(
"green", "*** " .. name .. " won their match!")
)
@ -979,29 +980,58 @@ eggwars.end_match = function(key)
end
-- rank winner
local tmp
if windex then
tmp = match_rank[windex]
table.remove(match_rank, windex)
table.insert(match_rank, 1, tmp)
else
tmp = match_rank[1]
table.sort(match, function(a, b)
return a.winner > b.winner
end)
if match[1].winner == 0 then
-- on kills
table.sort(stats.rankings, function(a, b)
return a.kills > b.kills
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
local rank = {
damage = tmp.damage,
eggs = tmp.eggs,
falls = tmp.falls,
kills = tmp.kills,
name = tmp.name,
wins = stats.player[tmp.name].wins
}
table.insert(stats.rankings, rank)
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)
local tmp = match[1]
if tmp.winner == 1 then
local rank = {
damage = tmp.damage,
eggs = tmp.eggs,
falls = tmp.falls,
kills = tmp.kills,
name = tmp.name,
wins = stats.player[tmp.name].wins
}
local new_entry = true
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
@ -1014,7 +1044,7 @@ eggwars.end_match = function(key)
-- store data
save_persistant()
-- finally
display_match_results(match_rank, def.arena)
display_match_results(match, def.arena)
end
--- Colour a message string using rgb
@ -1318,11 +1348,11 @@ minetest.register_on_dieplayer(function(player, reason)
if not eggwars.playertag then
player:set_nametag_attributes({color = {a = 0, r = 0, g = 0, b = 0}})
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
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
def.player[name].alive = false
@ -1336,7 +1366,7 @@ minetest.register_on_dieplayer(function(player, reason)
-- Are we down to 1 player alive yet?
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)
end
elseif def.player[name].alive and def.player[name].egg then
@ -1415,7 +1445,7 @@ end, false)
-- knockback override for match players
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
return 3
end

View File

@ -3,15 +3,15 @@ local players = {}
minetest.register_globalstep(function(dtime)
for _,player in ipairs(minetest.get_connected_players()) do
local name = player:get_player_name()
players[name] = true
local control = player:get_player_control()
local sprint = control.aux1 and control.up
if sprint and players[name] then
if sprint then
players[name] = true
player:set_physics_override({speed = 1.3})
player:set_fov(1.2, true, 0.1)
else
elseif players[name] then
player:set_physics_override({speed = 1})
player:set_fov(1, true, 0.1)
player:set_fov(0, true, 0.1)
players[name] = nil
end
end