Fix admin chat command & tidy up file

set tab size to 4 spaces, clean up empty lines, beautify code
master
shivajiva101 2020-08-27 21:16:24 +01:00 committed by GitHub
parent e00fdf2d36
commit 30d60bd914
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 298 additions and 294 deletions

592
init.lua
View File

@ -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!