bedwars/map.lua

148 lines
4.2 KiB
Lua

bedwars.maps = minetest.deserialize(bedwars.storage:get_string("maps")) or {}
minetest.register_privilege("bedwars_maps", {
description = "Player can manage maps.",
})
bedwars.map_exists = function(name)
for _, map in ipairs(bedwars.maps) do
if map.name == name then return true end
end
return false
end
bedwars.map_add = function(def)
table.insert(bedwars.maps, def)
end
bedwars.map_remove = function(name)
for k, map in ipairs(bedwars.maps) do
if map.name == name then bedwars.maps[k] = nil end
end
end
bedwars.get_map_by_name = function(name)
for _, map in ipairs(bedwars.maps) do
if map.name == name then return map end
end
end
minetest.register_chatcommand("map_default", {
description = "Add map with default attribs",
params = "<name>",
privs = {bedwars_maps = true},
func = function(name, param)
if not param or param == "" then return false, "Invalid arguments" end
if bedwars.map_exists(param) then return false, "Map with same name already exists" end
local template = {
name = param,
red = "100,100,100",
green = "100,100,100",
blue = "100,100,100",
yellow = "100,100,100",
diamond1 = "100,100,100",
diamond2 = "100,100,100",
diamond3 = "100,100,100",
diamond4 = "100,100,100",
mese1 = "100,100,100",
mese2 = "100,100,100",
mese3 = "100,100,100",
mese4 = "100,100,100",
}
bedwars.map_add(template)
return true, "Map added, please modify the attributes now with /map_modify"
end,
})
minetest.register_chatcommand("map_modify", {
description = "Modify map attributes",
params = "<map_name> <attrib_name> [<x>,<y>,<z>]",
privs = {bedwars_maps = true},
func = function(name, param)
local map_name = param:split(" ")[1]
local key = param:split(" ")[2]
local value = param:split(" ")[3]
if value and value ~= "" and not minetest.string_to_pos(value) then return false, "Invalid arguments" end
if not map_name or not key then return false, "Invalid arguments" end
local valid = false
local valid_attribs = {"red", "green", "blue", "yellow", "diamond1", "diamond2", "diamond3", "diamond4", "mese1", "mese2", "mese3", "mese4"}
for _, v in ipairs(valid_attribs) do
if key == v then
valid = true
break
end
end
bedwars.get_map_by_name(map_name)[key] = value or minetest.pos_to_string(minetest.get_player_by_name(name):get_pos())
return true, "Attribute changed to " .. bedwars.get_map_by_name(map_name)[key]
end,
})
minetest.register_chatcommand("map_add", {
description = "Add a map",
params = "<name> <red_x,red_y,red_z> <green_x,green_y,green_z> <blue_x,blue_y,blue_z> <yellow_x,yellow_y,yellow_z> <diamond1_x,diamond1_y,diamond1_z> <diamond2_x,diamond2_y,diamond2_z> <diamond3_x,diamond3_y,diamond3_z> <diamond4_x,diamond4_y,diamond4_z> <mese1_x,mese1_y,mese1_z> <mese2_x,mese2_y,mese2_z> <mese3_x,mese3_y,mese3_z> <mese4_x,mese4_y,mese4_z>",
privs = {bedwars_maps = true},
func = function(name, param)
local params = {}
local paramnames = {
"name",
"red",
"green",
"blue",
"yellow",
"diamond1",
"diamond2",
"diamond3",
"diamond4",
"mese1",
"mese2",
"mese3",
"mese4",
}
if #param:split(" ") ~= 13 then return false, "Invalid arguments" end
for k, v in ipairs(param:split(" ")) do
params[paramnames[k]] = v
end
if bedwars.map_exists(params.name) then return false, "Map with same name already exists" end
bedwars.map_add(params)
return true, "Map added"
end,
})
minetest.register_chatcommand("map_remove", {
description = "Remove a map",
params = "<name>",
privs = {bedwars_maps = true},
func = function(name, param)
if param == "" then return false, "Invalid arguments" end
bedwars.map_remove(param)
return true, "Map removed"
end,
})
minetest.register_chatcommand("map_list", {
description = "List all maps",
params = "",
privs = {bedwars_maps = true},
func = function(name, param)
return true, dump(bedwars.maps)
end,
})
minetest.register_on_shutdown(function()
bedwars.storage:set_string("maps", minetest.serialize(bedwars.maps))
end)
local timer = 0
minetest.register_globalstep(function(dtime)
timer = timer + dtime
if timer >= 2 then
local players = minetest.get_connected_players()
for _, player in ipairs(players) do
if player:get_pos().y < 80 then
player:set_hp(0)
end
end
timer = 0
end
end)