You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
3.4 KiB
118 lines
3.4 KiB
function creative_regions:initial_stuff()
|
|
local stuff_string = minetest.settings:get("initial_stuff") or
|
|
"default:pick_steel,default:axe_steel,default:shovel_steel," ..
|
|
"default:torch 99,default:cobble 99"
|
|
local itemtable = {}
|
|
local items = stuff_string:split(",")
|
|
for _, stack in ipairs(items) do
|
|
table.insert(itemtable, ItemStack(stack))
|
|
end
|
|
return itemtable
|
|
end
|
|
|
|
--[[
|
|
function creative_regions:save_player_privs(player)
|
|
local name = player:get_player_name()
|
|
local pmeta = player:get_meta()
|
|
local privs = minetest.get_player_privs(name)
|
|
pmeta:set_string("creative_regions.saved_privs", minetest.serialize(privs))
|
|
end
|
|
|
|
function creative_regions:restore_player_privs(player)
|
|
local name = player:get_player_name()
|
|
local pmeta = player:get_meta()
|
|
local privs = minetest.deserialize(pmeta:get_string("creative_regions.saved_privs"))
|
|
if privs then
|
|
minetest.set_player_privs(name, privs)
|
|
pmeta:set_string("creative_regions.saved_privs", nil)
|
|
end
|
|
end
|
|
--]]
|
|
|
|
function creative_regions:save_player_inventory(player, listname)
|
|
local name = player:get_player_name()
|
|
local pmeta = player:get_meta()
|
|
local inv = player:get_inventory()
|
|
local player_items = inv:get_list("main")
|
|
inv:set_list(listname, player_items)
|
|
end
|
|
|
|
function creative_regions:restore_player_inventory(player, listname)
|
|
local name = player:get_player_name()
|
|
local pmeta = player:get_meta()
|
|
local inv = player:get_inventory()
|
|
local player_items = inv:get_list(listname)
|
|
local give_initial = false
|
|
if not player_items then
|
|
player_items = {}
|
|
give_initial = true
|
|
end
|
|
inv:set_list("main", player_items)
|
|
if give_initial then
|
|
local initial_items = creative_regions:initial_stuff()
|
|
for _, stack in ipairs(initial_items) do
|
|
inv:add_item("main", stack)
|
|
end
|
|
end
|
|
end
|
|
|
|
function creative_regions:player_enter_region(player, new_privs_table)
|
|
local name = player:get_player_name()
|
|
local has_creative = minetest.check_player_privs(name, {creative=true})
|
|
local has_arena = minetest.check_player_privs(name, {arena=true})
|
|
|
|
local old_mode = nil
|
|
if has_arena then
|
|
old_mode = "arena"
|
|
elseif has_creative then
|
|
old_mode = "creative"
|
|
else
|
|
old_mode = "survival"
|
|
end
|
|
|
|
local privs_grant, privs_revoke = creative_regions:decode_privs_table(new_privs_table)
|
|
|
|
local new_mode = nil
|
|
if privs_grant.arena and not privs_revoke.arena then
|
|
new_mode = "arena"
|
|
elseif privs_grant.creative and not privs_revoke.creative then
|
|
new_mode = "creative"
|
|
else
|
|
new_mode = "survival"
|
|
end
|
|
|
|
if new_mode ~= old_mode then
|
|
|
|
if old_mode == "arena" then
|
|
-- leaving arena (alive)
|
|
creative_regions.drop_everything(player, false)
|
|
end
|
|
|
|
minetest.chat_send_player(name, "You entered "..new_mode.." mode")
|
|
creative_regions:save_player_inventory(player, "saved_"..old_mode)
|
|
creative_regions:restore_player_inventory(player, "saved_"..new_mode)
|
|
|
|
if new_mode == "creative" then
|
|
if minetest.get_modpath("unified_inventory") then
|
|
unified_inventory.set_inventory_formspec(player, unified_inventory.default)
|
|
end
|
|
elseif new_mode == "arena" then
|
|
local inv = player:get_inventory()
|
|
inv:set_list("main", {})
|
|
end
|
|
|
|
end
|
|
|
|
local has_privs = minetest.get_player_privs(name)
|
|
local privs = has_privs
|
|
for _, p in pairs(non_sticky_privs) do
|
|
privs[p] = nil
|
|
end
|
|
for newpriv, _ in pairs(privs_grant) do
|
|
privs[newpriv] = true
|
|
end
|
|
for newpriv, _ in pairs(privs_revoke) do
|
|
privs[newpriv] = nil
|
|
end
|
|
minetest.set_player_privs(name, privs)
|
|
end
|
|
|