Fix admin chat command & tidy up file
set tab size to 4 spaces, clean up empty lines, beautify codemaster
parent
e00fdf2d36
commit
30d60bd914
592
init.lua
592
init.lua
|
@ -25,23 +25,23 @@ eggwars.player = {}
|
|||
local mod_data = minetest.get_mod_storage() -- mod storage
|
||||
|
||||
local arena_pos = {
|
||||
{x=0, y=0, z=0},
|
||||
{x=1000, y=0, z=0},
|
||||
{x=0, y=0, z=1000},
|
||||
{x=1000, y=0, z=1000},
|
||||
{x=-1000, y=0, z=0},
|
||||
{x=0, y=0, z=-1000},
|
||||
{x=-1000, y=0, z=-1000},
|
||||
{x=-2000, y=0, z=0}
|
||||
{x = 0, y = 0, z = 0},
|
||||
{x = 1000, y = 0, z = 0},
|
||||
{x = 0, y = 0, z = 1000},
|
||||
{x = 1000, y = 0, z = 1000},
|
||||
{x = -1000, y = 0, z = 0},
|
||||
{x = 0, y = 0, z = -1000},
|
||||
{x = -1000, y = 0, z = -1000},
|
||||
{x = -2000, y = 0, z = 0}
|
||||
}
|
||||
local loaded = minetest.deserialize(mod_data:get_string('loaded')) or {arena = {}}
|
||||
local lobby = {
|
||||
insert_offset = {x=-42, y=-14, z=-30},
|
||||
pos = {x=0, y=1000, z=0},
|
||||
region = {
|
||||
p1 = {x=-83, y=980, z=-83},
|
||||
p2 = {x=83, y=1030, z=83}
|
||||
}
|
||||
insert_offset = {x = -42, y = -14, z = -30},
|
||||
pos = {x = 0, y = 1000, z = 0},
|
||||
region = {
|
||||
p1 = {x = -83, y = 980, z = -83},
|
||||
p2 = {x = 83, y = 1030, z = 83}
|
||||
}
|
||||
}
|
||||
local min_match_players = 4 -- min players needed for a match (default = 4)
|
||||
local owner = minetest.settings:get('name')
|
||||
|
@ -52,7 +52,6 @@ local schempath = MP.."/schems/"
|
|||
local stats = minetest.deserialize(mod_data:get_string('STATS')) or {}
|
||||
local last_state = minetest.deserialize(mod_data:get_string('LSTATE')) or {}
|
||||
local tmp_tbl, tmp_hud = {}, {}
|
||||
local timer = 0
|
||||
local r_rate = 5
|
||||
|
||||
stats.rankings = stats.rankings or {}
|
||||
|
@ -70,7 +69,7 @@ dofile(MP .. "/tools.lua")
|
|||
--- Sets server conf settings
|
||||
-- @return nothing
|
||||
local function set_settings()
|
||||
minetest.settings:set('player_transfer_distance', 20)
|
||||
minetest.settings:set('player_transfer_distance', 1)
|
||||
minetest.settings:set('time_speed', 0)
|
||||
minetest.settings:write()
|
||||
minetest.set_timeofday(0.5) -- noon
|
||||
|
@ -90,11 +89,11 @@ end
|
|||
-- @param pos - vector table
|
||||
-- @param region - vector pair table
|
||||
-- @return nothing
|
||||
local function clear(pos, region)
|
||||
local p1 = vector.add(pos, region.p1)
|
||||
local p2 = vector.add(pos, region.p2)
|
||||
clean(p1, p2)
|
||||
end
|
||||
-- local function clear(pos, region)
|
||||
-- local p1 = vector.add(pos, region.p1)
|
||||
-- local p2 = vector.add(pos, region.p2)
|
||||
-- clean(p1, p2)
|
||||
-- end
|
||||
|
||||
--- Save persistant data
|
||||
-- @return nothing
|
||||
|
@ -112,16 +111,16 @@ end
|
|||
local function my_random(tbl, from, to)
|
||||
local num = math.random (from, to)
|
||||
if tbl[num] then num = my_random(tbl, from, to) end
|
||||
tbl[num]=num
|
||||
return num
|
||||
tbl[num] = num
|
||||
return num
|
||||
end
|
||||
|
||||
--- Generate a random unique list for the trader name order
|
||||
-- @return table of unique random integers
|
||||
local function gen_trader_order()
|
||||
local tbl = {}
|
||||
for i=1,8 do
|
||||
tbl[#tbl+1] = my_random(tmp_tbl, 1, 8)
|
||||
for i = 1, 8 do
|
||||
tbl[#tbl + 1] = my_random(tmp_tbl, 1, 8)
|
||||
end
|
||||
tmp_tbl = {}
|
||||
return tbl
|
||||
|
@ -155,7 +154,7 @@ local function check_files(path, name)
|
|||
|
||||
for _, entry in ipairs(extension) do
|
||||
local filename = path .. name .. "." .. entry
|
||||
file, err = ie.io.open(filename, "rb")
|
||||
file, err = io.open(filename, "rb")
|
||||
if err then
|
||||
list[entry] = false
|
||||
else
|
||||
|
@ -166,6 +165,7 @@ local function check_files(path, name)
|
|||
end
|
||||
|
||||
return list
|
||||
|
||||
end
|
||||
|
||||
--- Inserts & protects the lobby in a new instance
|
||||
|
@ -192,14 +192,14 @@ local function gen_match_hud(key)
|
|||
local match = eggwars.match[key]
|
||||
local pos = - (0.5 * (#match.player * 20) - 2)
|
||||
local result = {}
|
||||
for k, def in pairs(match.hud_img) do
|
||||
for _, def in pairs(match.hud_img) do
|
||||
local ndef = {
|
||||
hud_elem_type = 'image',
|
||||
position = {x=0.5, y=1},
|
||||
scale = {x=1, y=1},
|
||||
position = {x = 0.5, y = 1},
|
||||
scale = {x = 1, y = 1},
|
||||
text = def[1],
|
||||
alignment = {x=0, y=0}, -- table reqd
|
||||
offset = {x=pos, y=-100}
|
||||
alignment = {x = 0, y = 0}, -- table reqd
|
||||
offset = {x = pos, y = -100}
|
||||
}
|
||||
table.insert(result, ndef)
|
||||
pos = pos + 20
|
||||
|
@ -210,24 +210,24 @@ local function gen_match_hud(key)
|
|||
for i, v in ipairs(result) do
|
||||
def.hud_id[i] = player:hud_add(v)
|
||||
end
|
||||
-- Add background image
|
||||
-- Add Lozenge
|
||||
def.pil = player:hud_add({
|
||||
hud_elem_type = 'image',
|
||||
position = {x=0, y=1},
|
||||
scale = {x=1, y=0.5},
|
||||
position = {x = 0, y = 1},
|
||||
scale = {x = 1, y = 0.5},
|
||||
text = 'eggwars_pil.png',
|
||||
alignment = {x=0, y=0}, -- table reqd
|
||||
offset = {x=70, y=-20}
|
||||
alignment = {x = 0, y = 0}, -- table reqd
|
||||
offset = {x = 70, y = -20}
|
||||
})
|
||||
-- Add match time element
|
||||
def.remaining = player:hud_add({
|
||||
hud_elem_type = 'text',
|
||||
position = {x=0, y=1},
|
||||
scale = {x=128, y=64},
|
||||
position = {x = 0, y = 1},
|
||||
scale = {x = 128, y = 64},
|
||||
text = 'Remaining: ' .. match.hud_time .. 'm',
|
||||
number = '0x00FF00',
|
||||
alignment = {x=0, y=0}, -- table reqd
|
||||
offset = {x=70, y=-20}
|
||||
alignment = {x = 0, y = 0}, -- table reqd
|
||||
offset = {x = 70, y = -20}
|
||||
})
|
||||
end
|
||||
end
|
||||
|
@ -255,14 +255,14 @@ local function add_hud_image(player, image_string, timer)
|
|||
local name = player:get_player_name()
|
||||
tmp_hud[name] = player:hud_add({
|
||||
hud_elem_type = 'image',
|
||||
position = {x=0.5, y=0.5},
|
||||
scale = {x=1, y=1},
|
||||
position = {x = 0.5, y = 0.5},
|
||||
scale = {x = 1, y = 1},
|
||||
text = image_string,
|
||||
alignment = {x=0, y=0}, -- table reqd
|
||||
offset = {x=0, y=0}
|
||||
alignment = {x = 0, y = 0}, -- table reqd
|
||||
offset = {x = 0, y = 0}
|
||||
})
|
||||
minetest.after(timer, function(name)
|
||||
eggwars.remove_hud_image(name)
|
||||
minetest.after(timer, function(pname)
|
||||
eggwars.remove_hud_image(pname)
|
||||
end, name)
|
||||
end
|
||||
|
||||
|
@ -285,21 +285,21 @@ local function modify_game()
|
|||
-- create a list of exempt nodes from the registered arenas
|
||||
local exempt_node = {}
|
||||
for _, arena in ipairs(eggwars.arena) do
|
||||
for _,v in ipairs(arena.exempt_nodes) do
|
||||
for _, v in ipairs(arena.exempt_nodes) do
|
||||
table.insert(exempt_node, v)
|
||||
end
|
||||
end
|
||||
-- parse registered nodes
|
||||
for item, def in pairs(minetest.registered_nodes) do
|
||||
local modify = true
|
||||
for i,v in ipairs(exempt_node) do
|
||||
for i, v in ipairs(exempt_node) do
|
||||
if string.find(item, v) then
|
||||
modify = false
|
||||
break
|
||||
end
|
||||
end
|
||||
if modify then
|
||||
minetest.override_item(item, {groups = {unbreakable=1},})
|
||||
minetest.override_item(item, {groups = {unbreakable = 1}, })
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -328,21 +328,21 @@ local function match_timer()
|
|||
gain = 1.0,
|
||||
})
|
||||
add_hud_image(
|
||||
minetest.get_player_by_name(k),
|
||||
'eggwars_suddendeath.png', 5
|
||||
minetest.get_player_by_name(k),
|
||||
'eggwars_suddendeath.png', 5
|
||||
)
|
||||
end
|
||||
end
|
||||
if def.sd and def.tmr >= def.max_time then
|
||||
for k, v in pairs(def.player) do
|
||||
minetest.sound_play("eggwars_time_over", {
|
||||
to_player = k,
|
||||
gain = 1.0,
|
||||
})
|
||||
add_hud_image(
|
||||
to_player = k,
|
||||
gain = 1.0,
|
||||
})
|
||||
add_hud_image(
|
||||
minetest.get_player_by_name(k),
|
||||
'eggwars_timeover.png', 5
|
||||
)
|
||||
)
|
||||
end
|
||||
eggwars.end_match(key)
|
||||
end
|
||||
|
@ -392,14 +392,14 @@ local function display_match_results(match_rank, arena_id)
|
|||
}
|
||||
for i, v in ipairs(match_rank) 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)..']'
|
||||
fs[#fs+1] = 'label[4,'..(0.5 * i)..';'..eggwars.colorize(c, v.kills)..']'
|
||||
fs[#fs+1] = 'label[5,'..(0.5 * i)..';'..eggwars.colorize(c, v.damage)..']'
|
||||
fs[#fs+1] = 'label[6.1,'..(0.5 * i)..';'..eggwars.colorize(c, v.eggs)..']'
|
||||
fs[#fs+1] = 'label[7,'..(0.5 * i)..';'..eggwars.colorize(c, v.falls)..']'
|
||||
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[4,'..(0.5 * i)..';'..eggwars.colorize(c, v.kills)..']'
|
||||
fs[#fs + 1] = 'label[5,'..(0.5 * i)..';'..eggwars.colorize(c, v.damage)..']'
|
||||
fs[#fs + 1] = 'label[6.1,'..(0.5 * i)..';'..eggwars.colorize(c, v.eggs)..']'
|
||||
fs[#fs + 1] = 'label[7,'..(0.5 * i)..';'..eggwars.colorize(c, v.falls)..']'
|
||||
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)
|
||||
for i, v in ipairs(match_rank) do
|
||||
local player = get_player_by_name(v.name)
|
||||
|
@ -419,27 +419,27 @@ local function update_hud_time()
|
|||
minetest.after(60, update_hud_time)
|
||||
end
|
||||
|
||||
--- Spawns a player in air, attempts to prevent spawn trap
|
||||
-- @return nothing
|
||||
--- Spawns a player in the first pair of vertical air nodes above minp
|
||||
-- @return vector
|
||||
local function safe_spawn(minp)
|
||||
local maxp = vector.new(minp.x, minp.y + 30, minp.z)
|
||||
local maxp = vector.new(minp.x, minp.y + 20, minp.z)
|
||||
local pos = minetest.find_nodes_in_area(minp, maxp, 'air')
|
||||
local res = minp
|
||||
for i,v in ipairs(pos) do
|
||||
for i, v in ipairs(pos) do
|
||||
if i > 1 and res.y == v.y - 1 then
|
||||
return res -- 2 vertical air nodes
|
||||
else
|
||||
res = v
|
||||
end
|
||||
end
|
||||
return minp
|
||||
return minp -- failed search
|
||||
end
|
||||
|
||||
-------------------
|
||||
-- API Functions --
|
||||
-------------------
|
||||
|
||||
--- Removes a player hud image if its registered
|
||||
--- Removes a temp player hud image
|
||||
-- @param name - players name
|
||||
-- @return nothing
|
||||
eggwars.remove_hud_image = function(name)
|
||||
|
@ -450,9 +450,9 @@ eggwars.remove_hud_image = function(name)
|
|||
end
|
||||
end
|
||||
|
||||
--- Update match status flag in players HUD
|
||||
--- Update match status in players HUD
|
||||
-- @param key - arena key string
|
||||
-- @param id - hud element id
|
||||
-- @param id - hud element index, if omitted time is updated
|
||||
-- @return nothing
|
||||
eggwars.update_hud = function(key, id)
|
||||
local match = eggwars.match[key]
|
||||
|
@ -460,7 +460,7 @@ eggwars.update_hud = function(key, id)
|
|||
local obj = minetest.get_player_by_name(k)
|
||||
if not id then
|
||||
obj:hud_change(def.remaining, 'text', 'Remaining: ' ..
|
||||
eggwars.match[key].hud_time .. 'm')
|
||||
eggwars.match[key].hud_time .. 'm')
|
||||
else
|
||||
obj:hud_change(def.hud_id[id], 'text', match.hud_img[id][2])
|
||||
end
|
||||
|
@ -489,10 +489,10 @@ eggwars.centrespawn = function(id, n)
|
|||
local p1 = vector.add(spwn, def.hub.offset)
|
||||
minetest.place_schematic(p1, schempath .. def.hub.schem)
|
||||
-- place satellites
|
||||
for i,v in ipairs(def.satellite.pos) do
|
||||
for i, v in ipairs(def.satellite.pos) do
|
||||
p1 = vector.add(vector.add(spwn, v), def.satellite.offset)
|
||||
minetest.place_schematic(p1, schempath ..
|
||||
def.satellite.schem)
|
||||
def.satellite.schem)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -559,7 +559,7 @@ eggwars.begin_match = function ()
|
|||
-- eggpos = pos of players egg
|
||||
-- eggs = eggs destroyed count
|
||||
-- falls = fall count
|
||||
-- hud_id = hud element ref
|
||||
-- hud_id = hud element ref table
|
||||
-- id = integer - player index in the instance
|
||||
-- kills = kill count
|
||||
-- rate = gold spawner rate in seconds
|
||||
|
@ -568,14 +568,14 @@ eggwars.begin_match = function ()
|
|||
-- spawner = pos of gold spawner
|
||||
-- trader = entity obj
|
||||
--
|
||||
-- match.spawners - diamond and ruby spawner positions
|
||||
-- match.spawners - diamond and ruby spawner positions
|
||||
-- match.stats - match statistics
|
||||
-- match.tmr - match timer
|
||||
-- match.uid - match id
|
||||
|
||||
|
||||
local match = {}
|
||||
local n = next_index() -- arena pos index
|
||||
local n = next_index() -- arena pos index
|
||||
local pos = arena_pos[n] -- base vector
|
||||
local arena, def, rnd_list, key, spwnr, adj, hud_img, uid
|
||||
|
||||
|
@ -597,11 +597,11 @@ eggwars.begin_match = function ()
|
|||
|
||||
-- Process crash cleanup if reqd
|
||||
if #last_state > 0 then
|
||||
for i,v in ipairs(last_state) do
|
||||
for i, v in ipairs(last_state) do
|
||||
if vector.equals(pos, v.pos) then
|
||||
for _, pos in ipairs(v.spawners) do
|
||||
minetest.get_node_timer(pos):stop()
|
||||
local w = minetest.get_objects_inside_radius(pos, 2)
|
||||
for _, p in ipairs(v.spawners) do
|
||||
minetest.get_node_timer(p):stop()
|
||||
local w = minetest.get_objects_inside_radius(p, 2)
|
||||
for _, object in ipairs(w) do
|
||||
if not object:is_player() then
|
||||
object:remove()
|
||||
|
@ -621,7 +621,7 @@ eggwars.begin_match = function ()
|
|||
}
|
||||
|
||||
def = eggwars.arena[arena]
|
||||
rnd_list = gen_trader_order()
|
||||
rnd_list = gen_trader_order()
|
||||
key = 'm' .. n
|
||||
|
||||
match.alive = #registered_players
|
||||
|
@ -670,7 +670,7 @@ eggwars.begin_match = function ()
|
|||
|
||||
-- Add gold spawner and initialise node timer
|
||||
adj = vector.add(sp, def.spawners.gold[id])
|
||||
minetest.set_node(adj, {name='eggwars:gold_spawner'})
|
||||
minetest.set_node(adj, {name = 'eggwars:gold_spawner'})
|
||||
minetest.get_node_timer(adj):start(spwnr)
|
||||
match.player[name].spawner = adj
|
||||
table.insert(state.spawners, adj)
|
||||
|
@ -679,12 +679,12 @@ eggwars.begin_match = function ()
|
|||
adj = vector.add(sp, def.bot.offset[id])
|
||||
local staticdata = minetest.serialize({uid = uid, owner = name})
|
||||
local obj = minetest.add_entity(adj, 'eggwars:bot', staticdata)
|
||||
local yaw = ((math.pi * def.bot.yaw[id])/180)
|
||||
local yaw = ((math.pi * def.bot.yaw[id]) / 180)
|
||||
obj:set_yaw(yaw)
|
||||
|
||||
-- Add egg
|
||||
adj = vector.add(sp, def.egg_offset[id])
|
||||
minetest.set_node(adj, {name='eggwars:egg' .. id})
|
||||
minetest.set_node(adj, {name = 'eggwars:egg' .. id})
|
||||
match.player[name].eggpos = adj
|
||||
|
||||
-- set egg metadata
|
||||
|
@ -694,10 +694,10 @@ eggwars.begin_match = function ()
|
|||
|
||||
-- Add trader
|
||||
local trader_name = 'Trader '.. def.trader.names[rnd_list[id]]
|
||||
local staticdata = minetest.serialize({owner = name, nametag = trader_name, uid = uid})
|
||||
staticdata = minetest.serialize({owner = name, nametag = trader_name, uid = uid})
|
||||
adj = vector.add(sp, def.trader.offset[id])
|
||||
obj = minetest.add_entity(adj, 'eggwars:trader', staticdata)
|
||||
yaw = ((math.pi * def.trader.yaw[id])/180)
|
||||
yaw = ((math.pi * def.trader.yaw[id]) / 180)
|
||||
obj:set_yaw(yaw)
|
||||
|
||||
-- Create players shop items table
|
||||
|
@ -705,24 +705,24 @@ eggwars.begin_match = function ()
|
|||
-- Add players wool colour
|
||||
{
|
||||
name = {
|
||||
name="wool:" .. def.cs[id][3],
|
||||
count=20,
|
||||
wear=0,
|
||||
metadata=""
|
||||
name = "wool:" .. def.cs[id][3],
|
||||
count = 20,
|
||||
wear = 0,
|
||||
metadata = ""
|
||||
},
|
||||
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,
|
||||
}
|
||||
}
|
||||
-- Add the registered shop items
|
||||
for j=1, #eggwars.shop_items do -- add the rest
|
||||
for j = 1, #eggwars.shop_items do -- add the rest
|
||||
table.insert(match.player[name].shop_items, eggwars.shop_items[j])
|
||||
end
|
||||
|
||||
-- Give arena privs
|
||||
minetest.set_player_privs(name, {interact=true, shout=true})
|
||||
minetest.set_player_privs(name, {interact = true, shout = true})
|
||||
|
||||
end
|
||||
|
||||
|
@ -730,8 +730,8 @@ eggwars.begin_match = function ()
|
|||
spwnr = def.spawners.diamond.rate
|
||||
for idx, v in ipairs(def.spawners.diamond) do
|
||||
adj = vector.add(pos, v)
|
||||
minetest.set_node(adj, {name='eggwars:diamond_spawner'})
|
||||
minetest.get_node_timer(adj):start(spwnr)
|
||||
minetest.set_node(adj, {name = 'eggwars:diamond_spawner'})
|
||||
minetest.get_node_timer(adj):start(spwnr)
|
||||
table.insert(match.spawners, adj)
|
||||
table.insert(state.spawners, adj)
|
||||
end
|
||||
|
@ -740,8 +740,8 @@ eggwars.begin_match = function ()
|
|||
spwnr = def.spawners.ruby.rate
|
||||
for idx, v in ipairs(def.spawners.ruby) do
|
||||
adj = vector.add(pos, v)
|
||||
minetest.set_node(adj, {name='eggwars:ruby_spawner'})
|
||||
minetest.get_node_timer(adj):start(spwnr)
|
||||
minetest.set_node(adj, {name = 'eggwars:ruby_spawner'})
|
||||
minetest.get_node_timer(adj):start(spwnr)
|
||||
table.insert(match.spawners, adj)
|
||||
table.insert(state.spawners, adj)
|
||||
end
|
||||
|
@ -823,7 +823,7 @@ eggwars.end_match = function(key)
|
|||
}
|
||||
local idx = #match_rank + 1
|
||||
|
||||
for i,v in ipairs(match_rank) do
|
||||
for i, v in ipairs(match_rank) do
|
||||
if v.win then windex = i end
|
||||
if res.kills > v.kills then
|
||||
idx = i
|
||||
|
@ -841,8 +841,8 @@ eggwars.end_match = function(key)
|
|||
gain = 0.5
|
||||
})
|
||||
player:set_nametag_attributes({
|
||||
color = {a = 255, r = 255, g = 255, b = 255}}) --Make nametag visible
|
||||
player:set_properties({visual_size={x=1, y=1, z=1}}) --Make player visible
|
||||
color = {a = 255, r = 255, g = 255, b = 255}}) --Make nametag visible
|
||||
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
|
||||
|
@ -853,12 +853,12 @@ eggwars.end_match = function(key)
|
|||
)
|
||||
add_hud_image(player, 'eggwars_winner.png', 5)
|
||||
minetest.sound_play("eggwars_winner", {
|
||||
to_player = killer,
|
||||
to_player = pdef.name,
|
||||
gain = 0.5
|
||||
})
|
||||
end
|
||||
end
|
||||
minetest.set_player_privs(name, {shout=true}) -- set lobby privs
|
||||
minetest.set_player_privs(name, {shout = true}) -- set lobby privs
|
||||
player:set_pos(lobby.pos) -- move player
|
||||
end
|
||||
stats.player[name] = s
|
||||
|
@ -886,7 +886,7 @@ eggwars.end_match = function(key)
|
|||
}
|
||||
table.insert(stats.rankings, rank)
|
||||
if #stats.rankings > 1 then
|
||||
table.sort(stats.rankings, function(a,b) return a.wins > b.wins end)
|
||||
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
|
||||
|
@ -941,10 +941,10 @@ minetest.register_on_dieplayer(function(player, reason)
|
|||
if def then
|
||||
if def.player[name].alive and not def.player[name].egg then
|
||||
minetest.chat_send_all("*** "..name.." is " ..
|
||||
minetest.colorize('red','OUT'))
|
||||
minetest.colorize('red', 'OUT'))
|
||||
|
||||
-- set privs for spectating
|
||||
minetest.set_player_privs(name, {fly=true,fast=true,shout=true})
|
||||
minetest.set_player_privs(name, {fly = true, fast = true, shout = true})
|
||||
add_hud_image(player, 'eggwars_out.png', 5)
|
||||
|
||||
-- record the kill
|
||||
|
@ -957,7 +957,7 @@ minetest.register_on_dieplayer(function(player, reason)
|
|||
|
||||
-- Make nametag invisible
|
||||
player:set_nametag_attributes({color = {a = 0, r = 0, g = 0, b = 0}})
|
||||
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.armor then eggwars.clear_armor(player) end
|
||||
def.player[name].alive = false
|
||||
|
@ -988,9 +988,10 @@ minetest.register_on_respawnplayer(function(player)
|
|||
local pos = lobby.pos -- initialise with lobby vector
|
||||
-- match override
|
||||
if eggwars.player[name] then
|
||||
local key = eggwars.player[name]
|
||||
pos = eggwars.match[key].player[name].spawn
|
||||
end
|
||||
local key = eggwars.player[name]
|
||||
local match = eggwars.match[key]
|
||||
pos = match.player[name].spawn
|
||||
end
|
||||
player:set_pos(safe_spawn(pos))
|
||||
return true
|
||||
-- Wait for respawn before moving
|
||||
|
@ -1002,7 +1003,7 @@ minetest.register_on_joinplayer(function(player)
|
|||
if eggwars.armor then eggwars.clear_armor(player) end
|
||||
eggwars.clear_inventory(player)
|
||||
local name = player:get_player_name()
|
||||
minetest.set_player_privs(name, {shout=true}) --
|
||||
minetest.set_player_privs(name, {shout = true}) --
|
||||
player:set_pos(lobby.pos)
|
||||
add_hud_image(player, 'eggwars_welcome.png', 10)
|
||||
end)
|
||||
|
@ -1026,8 +1027,8 @@ minetest.register_on_chat_message(function(name, message)
|
|||
if eggwars.player[name] then
|
||||
local key = eggwars.player[name]
|
||||
local def = eggwars.match[key]
|
||||
txt = eggwars.colorize(def.player[name].color, message)
|
||||
eggwars.chat_send_match(key, txt)
|
||||
txt = eggwars.colorize(def.player[name].color, message)
|
||||
eggwars.chat_send_match(key, txt)
|
||||
else
|
||||
-- player in lobby
|
||||
minetest.chat_send_all(txt) -- broadcast
|
||||
|
@ -1055,112 +1056,114 @@ end, false)
|
|||
-- Registered chat commands --
|
||||
-----------------------------------------
|
||||
minetest.register_chatcommand('admin', {
|
||||
description = 'gamehub management tool',
|
||||
params = '{load|save} [name]',
|
||||
func = function(name, param)
|
||||
-- secure access
|
||||
if not minetest.get_player_privs(name).server and name == owner then
|
||||
return false, "Insufficient privs!"
|
||||
end
|
||||
description = 'gamehub management tool',
|
||||
params = '{load|save} [name]',
|
||||
func = function(name, param)
|
||||
-- secure access
|
||||
if not minetest.get_player_privs(name).server and name == owner then
|
||||
return false, "Insufficient privs!"
|
||||
end
|
||||
|
||||
local cmd, fn, pos1, pos2, helper, list, param2, player
|
||||
local cmd, fn, pos1, pos2, helper, list, player
|
||||
|
||||
helper = [[Usage:
|
||||
helper = [[Usage:
|
||||
/admin load <filename>
|
||||
/admin save <filename> <pos1> <pos2>
|
||||
]]
|
||||
|
||||
list = {}
|
||||
player = minetest.get_player_by_name(name)
|
||||
list = {}
|
||||
player = minetest.get_player_by_name(name)
|
||||
|
||||
if not player then
|
||||
return false, "You need to be playing to use this command!"
|
||||
end
|
||||
|
||||
for word in param:gmatch("%S+") do
|
||||
list[#list + 1] = word
|
||||
end
|
||||
local qty = #list
|
||||
if qty < 2 or qty == 3 or qty > 4 then
|
||||
return false
|
||||
elseif qty == 4 then
|
||||
pos1 = minetest.string_to_pos(list[3])
|
||||
pos2 = minetest.string_to_pos(list[4])
|
||||
end
|
||||
|
||||
cmd = list[1]
|
||||
fn = list[2]
|
||||
|
||||
if cmd == 'load' then
|
||||
|
||||
-- last entry takes precedence
|
||||
local folders = {
|
||||
MP .. "/schems/", -- read-only
|
||||
WP .. "/schems/"
|
||||
}
|
||||
|
||||
local path, folder, file, err, msg
|
||||
|
||||
msg = {}
|
||||
|
||||
for i, v in ipairs(folders) do
|
||||
|
||||
local check = check_files(v, fn)
|
||||
|
||||
if check.n > 0 then
|
||||
|
||||
folder = v
|
||||
msg[#msg + 1] = "file(s) found in " .. v
|
||||
|
||||
elseif check.n == 0 then
|
||||
msg[#msg + 1] = "no match found in " .. v
|
||||
end
|
||||
|
||||
minetest.chat_send_player(name, table.concat(msg, "\n"))
|
||||
|
||||
check.n = nil -- reset
|
||||
|
||||
if not player then
|
||||
return false, "You need to be playing to use this command!"
|
||||
end
|
||||
|
||||
for word in param:gmatch("%S+") do
|
||||
list[#list+1] = word
|
||||
if not folder then return end
|
||||
|
||||
path = folder .. fn .. ".mts"
|
||||
|
||||
-- add mts using player current pos
|
||||
local pos = vector.round(player:get_pos())
|
||||
|
||||
err = minetest.place_schematic(pos, path, nil, nil, true)
|
||||
|
||||
if err == nil then
|
||||
minetest.chat_send_player(name, "could not open file " .. path)
|
||||
return
|
||||
end
|
||||
|
||||
if #list < 2 then return false, helper end
|
||||
-- add nodes with metadata
|
||||
path = folder .. fn .. ".ewm"
|
||||
file, err = io.open(path, "rb")
|
||||
|
||||
cmd = list[1]
|
||||
fn = list[2]
|
||||
if err then
|
||||
minetest.chat_send_player(name, "could not open meta file "
|
||||
.. fn .. ".ewm")
|
||||
return
|
||||
end
|
||||
|
||||
if cmd == 'load' then
|
||||
local value = file:read("*a")
|
||||
file:close()
|
||||
|
||||
-- last entry takes precedence
|
||||
local folders = {
|
||||
MP .. "/schems/",
|
||||
WP .. "/schems/"
|
||||
}
|
||||
local count = eggwars.deserialize(pos, value)
|
||||
|
||||
local path, folder, file, err, msg
|
||||
msg = {}
|
||||
for i, v in ipairs(folders) do
|
||||
minetest.chat_send_player(name, "replaced " .. count ..
|
||||
" nodes...")
|
||||
|
||||
local check = check_files(v, fn)
|
||||
elseif cmd == 'save' then
|
||||
|
||||
if check.n == 2 then
|
||||
-- serialize metadata
|
||||
local result, count = eggwars.serialize_meta(pos1, pos2)
|
||||
local path = WP .. "/schems"
|
||||
local filename = path .. "/" .. fn .. ".ewm"
|
||||
|
||||
folder = v
|
||||
msg[#msg+1] = "file set found in " .. v
|
||||
if count > 0 then
|
||||
|
||||
elseif check.n == 1 then
|
||||
msg[#msg+1] = v.."."..k.." found..."
|
||||
elseif check.n == 0 then
|
||||
msg[#msg + 1] = "no files found in " .. v
|
||||
end
|
||||
|
||||
minetest.chat_send_player(name, table.concat(msg, "\n"))
|
||||
|
||||
check.n = nil -- reset
|
||||
|
||||
end
|
||||
|
||||
if not folder then return end
|
||||
|
||||
path = folder .. fn .. ".mts"
|
||||
|
||||
-- add mts using player current pos
|
||||
local pos = vector.round(player:get_pos())
|
||||
|
||||
err = minetest.place_schematic(pos, path, nil, nil, true)
|
||||
|
||||
if err == nil then
|
||||
minetest.chat_send_player(name, "could not open file " .. path)
|
||||
return
|
||||
end
|
||||
|
||||
-- add nodes with metadata
|
||||
path = folder .. fn .. ".ewm"
|
||||
file, err = ie.io.open(path, "rb")
|
||||
|
||||
if err then
|
||||
minetest.chat_send_player(name, "could not open meta file "
|
||||
.. fn .. ".ewm")
|
||||
return
|
||||
end
|
||||
|
||||
local value = file:read("*a")
|
||||
file:close()
|
||||
|
||||
local count = eggwars.deserialize(pos1, value)
|
||||
|
||||
minetest.chat_send_player(name, "replaced " .. count ..
|
||||
" nodes...")
|
||||
|
||||
elseif cmd == 'save' then
|
||||
|
||||
pos1 = vector.new(list[3])
|
||||
pos2 = vector.new(list[4])
|
||||
|
||||
local area = areas.areas[id]
|
||||
|
||||
-- serialize metadata
|
||||
local result, count = eggwars.serialize_meta(pos1, pos2)
|
||||
|
||||
local path = WP .. "/schems"
|
||||
local filename = path .. "/" .. fn .. ".ewm"
|
||||
local file, err = io.open(filename, "wb")
|
||||
|
||||
if err ~= nil then
|
||||
|
@ -1174,134 +1177,135 @@ minetest.register_chatcommand('admin', {
|
|||
|
||||
minetest.chat_send_player(name, "Saved " .. count ..
|
||||
" nodes to \"" .. filename .. "\"")
|
||||
|
||||
-- create schematic
|
||||
filename = path .. "/" .. fn .. ".mts"
|
||||
minetest.create_schematic(area.pos1, area.pos2, nil, filename)
|
||||
|
||||
minetest.chat_send_player(name, "Saved \"" .. filename .. "\"")
|
||||
|
||||
else
|
||||
return true, helper
|
||||
end
|
||||
|
||||
-- create schematic
|
||||
filename = path .. "/" .. fn .. ".mts"
|
||||
minetest.create_schematic(pos1, pos2, nil, filename)
|
||||
|
||||
minetest.chat_send_player(name, "Saved \"" .. filename .. "\"")
|
||||
|
||||
else
|
||||
return true, helper
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
-- register for a match
|
||||
minetest.register_chatcommand("r", {
|
||||
params = "",
|
||||
description = "Join match",
|
||||
func = function(name, param)
|
||||
if #registered_players < 8 then -- max 8 players in a match
|
||||
if #eggwars.match < 8 then -- max 8 matches on the server
|
||||
for i, v in ipairs(registered_players) do
|
||||
if registered_players[v] == name then
|
||||
params = "",
|
||||
description = "Join match",
|
||||
func = function(name, param)
|
||||
if #registered_players < 8 then -- max 8 players in a match
|
||||
if #eggwars.match < 8 then -- max 8 matches on the server
|
||||
for i, v in ipairs(registered_players) do
|
||||
if registered_players[v] == name then
|
||||
return true, "You have already registered"
|
||||
end
|
||||
end
|
||||
eggwars.remove_hud_image(name)
|
||||
registered_players[#registered_players+1] = name
|
||||
end
|
||||
eggwars.remove_hud_image(name)
|
||||
registered_players[#registered_players + 1] = name
|
||||
|
||||
if #registered_players == 8 then
|
||||
eggwars.begin_match();
|
||||
else
|
||||
minetest.chat_send_all(#registered_players ..
|
||||
"/8 players have registered! Use /register to join.");
|
||||
end
|
||||
if #registered_players == 8 then
|
||||
eggwars.begin_match();
|
||||
else
|
||||
return true, "Sorry the max number of games are running." ..
|
||||
"Please use /start once a match finishes."
|
||||
minetest.chat_send_all(#registered_players ..
|
||||
"/8 players have registered! Use /register to join.");
|
||||
end
|
||||
else
|
||||
return true, "Sorry. 8 players have already registered." ..
|
||||
"Try registering after their game has begun."
|
||||
return true, "Sorry the max number of games are running." ..
|
||||
"Please use /start once a match finishes."
|
||||
end
|
||||
end,
|
||||
else
|
||||
return true, "Sorry. 8 players have already registered." ..
|
||||
"Try registering after their game has begun."
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
-- start match
|
||||
minetest.register_chatcommand("s", {
|
||||
params = "",
|
||||
description = "Starts match if min match players is satisfied",
|
||||
func = function(name, param)
|
||||
if #registered_players >= min_match_players or name == owner then
|
||||
eggwars.begin_match()
|
||||
end
|
||||
end
|
||||
params = "",
|
||||
description = "Starts match if min match players is satisfied",
|
||||
func = function(name, param)
|
||||
if #registered_players >= min_match_players or name == owner then
|
||||
eggwars.begin_match()
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
-- quit match
|
||||
minetest.register_chatcommand("q", {
|
||||
params = "",
|
||||
description = "Quit the match you are playing",
|
||||
func = function(name, param)
|
||||
if #registered_players > 0 then
|
||||
for i, v in ipairs(registered_players) do
|
||||
if registered_players[v] == name then
|
||||
registered_players[v] = nil
|
||||
return true, "match quit!"
|
||||
end
|
||||
params = "",
|
||||
description = "Quit the match you are playing",
|
||||
func = function(name, param)
|
||||
if #registered_players > 0 then
|
||||
for i, v in ipairs(registered_players) do
|
||||
if registered_players[v] == name then
|
||||
registered_players[v] = nil
|
||||
return true, "match quit!"
|
||||
end
|
||||
end
|
||||
if eggwars.player[name] then
|
||||
local key, match, player, count
|
||||
key = eggwars.player[name]
|
||||
match = eggwars.match[key]
|
||||
player = match.player[name]
|
||||
if player.egg then
|
||||
minetest.remove_node(player.eggpos)
|
||||
end
|
||||
count = match.alive - 1
|
||||
eggwars.match[key].alive = count
|
||||
eggwars.match[key].player[name].alive = false
|
||||
eggwars.match[key].player[name].egg = false
|
||||
eggwars.player[name] = nil
|
||||
if match.alive == 1 then
|
||||
for k,v in pairs(eggwars.match[key].player) do
|
||||
if v.alive then
|
||||
v.win = true
|
||||
minetest.chat_send_all(minetest.colorize(
|
||||
"green", "*** " .. name .. " won their match!")
|
||||
)
|
||||
local obj = minetest.get_player_by_name(k)
|
||||
eggwars.add_hud_image(obj, 'eggwars_winner.png', 5)
|
||||
eggwars.end_match(key)
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
if eggwars.player[name] then
|
||||
local key, match, player, count
|
||||
key = eggwars.player[name]
|
||||
match = eggwars.match[key]
|
||||
player = match.player[name]
|
||||
if player.egg then
|
||||
minetest.remove_node(player.eggpos)
|
||||
end
|
||||
count = match.alive - 1
|
||||
eggwars.match[key].alive = count
|
||||
eggwars.match[key].player[name].alive = false
|
||||
eggwars.match[key].player[name].egg = false
|
||||
eggwars.player[name] = nil
|
||||
if match.alive == 1 then
|
||||
for k, v in pairs(eggwars.match[key].player) do
|
||||
if v.alive then
|
||||
v.win = true
|
||||
minetest.chat_send_all(minetest.colorize(
|
||||
"green", "*** " .. name .. " won their match!")
|
||||
)
|
||||
local obj = minetest.get_player_by_name(k)
|
||||
eggwars.add_hud_image(obj, 'eggwars_winner.png', 5)
|
||||
eggwars.end_match(key)
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
-- end match - development
|
||||
minetest.register_chatcommand("e", {
|
||||
params = "",
|
||||
description = "End the game",
|
||||
func = function(name, param)
|
||||
if not name == owner then return end
|
||||
local key = eggwars.player[name]
|
||||
if key then
|
||||
eggwars.end_match(key)
|
||||
end
|
||||
end
|
||||
params = "",
|
||||
description = "End the game",
|
||||
func = function(name, param)
|
||||
if not name == owner then return end
|
||||
local key = eggwars.player[name]
|
||||
if key then
|
||||
eggwars.end_match(key)
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
-- list players
|
||||
minetest.register_chatcommand("who", {
|
||||
params = "",
|
||||
description = "List players in matches",
|
||||
func = function(name, param)
|
||||
local text = {}
|
||||
for k,v in pairs(eggwars.match) do
|
||||
text[#text+1] = "Players in match: " .. k .. " "
|
||||
for key, def in pairs(v.player) do
|
||||
text[#text+1] = eggwars.colorize(def.color, key)
|
||||
end
|
||||
text[#text+1] = '\n'
|
||||
params = "",
|
||||
description = "List players in matches",
|
||||
func = function(name, param)
|
||||
local text = {}
|
||||
for k, v in pairs(eggwars.match) do
|
||||
text[#text + 1] = "Players in match: " .. k .. " "
|
||||
for key, def in pairs(v.player) do
|
||||
text[#text + 1] = eggwars.colorize(def.color, key)
|
||||
end
|
||||
return true, table.concat(text)
|
||||
end
|
||||
text[#text + 1] = '\n'
|
||||
end
|
||||
return true, table.concat(text)
|
||||
end
|
||||
})
|
||||
|
||||
-- run functions after all mods are loaded!
|
||||
|
|
Loading…
Reference in New Issue