Compare commits

..

No commits in common. "master" and "creative_areas-0.1" have entirely different histories.

7 changed files with 50 additions and 262 deletions

View File

@ -1,6 +1,6 @@
# Creative Areas
Creative Areas is a minetest mod allowing areas defined by the Areas mod to be designated as creative/sandbox areas adjusting players privileges and inventory formspecs appropriately as they leave or enter these areas. Items mined or taken from creative inventory inside creative area will be removed from players inventories upon leaving creative areas.
Creative Areas is a minetest mod allowing areas defined by the Areas mod to be designated as creative/sandbox areas adjusting players privliges and inventory formspecs appropriately as they leave or enter these areas. Items mined or taken from creative inventory inside creative area will be removed from players inventories upon leaving creative areas.
Players with the 'privs' priv will not have privileges or inventories affected moving in and out of these areas.
@ -8,10 +8,9 @@ Players with the 'privs' priv will not have privileges or inventories affected m
* Use /rm_creative_areas <area ID number> to remove an area from the list.
* Use /ls_creative_areas to see a list of creative areas and respective area IDs.
Depends on [Advanced Areas Mod](https://github.com/ShadowNinja/areas) by Shadow Ninja and the [Creative](https://github.com/minetest/minetest_game/tree/master/mods/creative) mod included in Minetest Game 0.5.0.
Depends on [Advanced Areas Mod](https://github.com/ShadowNinja/areas) by Shadow Ninja and the [Creative](https://github.com/minetest/minetest_game/tree/master/mods/creative) mod included in Minetest Game.
The creative mod from minetest_game 0.5.0-dev is included in this modpack for convenience of users on Minetest 0.4.16
It is not necessary to enable the creative mod for users of 0.5.0-dev.
This mod is compatible with Minetest 0.4.16 and up.
MIT License:
Copyright 2018 kakalak-lumberJack

View File

@ -1,4 +1,2 @@
areas
creative
sfinv?
unified_inventory?
creative

300
init.lua
View File

@ -1,119 +1,67 @@
local storage = minetest.get_mod_storage()
local cr_areas = minetest.deserialize(storage:get_string("cr_areas")) or {}
local privtbl = {["interact"] = false, ["fast"] = false, ["fly"] = false,
["noclip"] = false, ["creative"] = false, ["teleport"] = false, ["worldedit"] = false}
---------------
-- Functions
---------------
-- Check for intersecting creative areas
function intersects_cr_area(areaID)
local ID = areaID
local newarea = areas.areas[ID]
local np1, np2 = newarea["pos1"], newarea["pos2"]
if cr_areas == {} then
return false
end
for k, v in pairs(cr_areas) do
local id = tonumber(k)
local area = areas.areas[tonumber(id)]
if area ~= nil then
local p1, p2 = area["pos1"], area["pos2"]
for cx = p1.x, p2.x do
for cy = p1.y, p2.y do
for cz = p1.z, p2.z do
for nx = np1.x, np2.x do
for ny = np1.y, np2.y do
for nz = np1.z, np2.z do
if cx == nx and cy == ny and cz == nz then
return true
end
end
end
end
end
end
end
end
end
return false
end
-- Add creative area to list.
local function make_cr_area(name, areaID)
local id = tonumber(areaID)
local intersects = intersects_cr_area(id)
if intersects == true then
return minetest.chat_send_player(name, "This area interesects another creative area.")
end
if privs == nil then privs = privtbl end
if areas.areas[id] ~= nil then
id = tostring(id)
if cr_areas ~= {} then
if cr_areas[id] then
cr_areas[id]["privs"] = privs
return minetest.chat_send_player(name, "Creative Area " ..id.." updated")
for i = 1, #cr_areas do
if cr_areas[i] == id then
return minetest.chat_send_player(name, "Area " ..id.." is already a creative area.")
end
end
end
local cr_area = {}
cr_area["privs"] = privs
cr_areas[id] = cr_area
end
table.insert(cr_areas, id)
storage:set_string("cr_areas", minetest.serialize(cr_areas))
minetest.chat_send_player(name, "Area added to Creative Areas!")
else minetest.chat_send_player(name, "Not a valid area ID")
end
end
--Removes Creative Area
local function rm_cr_area(name, ID)
local id = tostring(ID)
local i = 1
if cr_areas[id] then
for k,v in pairs(cr_areas) do
if k == id then
cr_areas[k] = nil
storage:set_string("cr_areas", minetest.serialize(cr_areas))
return minetest.chat_send_player(name, "Creative area removed!")
end
local function rm_cr_area(name, areaID)
local id = tonumber(areaID)
for i = 1, #cr_areas do
if cr_areas[i] == id then
table.remove(cr_areas, i)
storage:set_string("cr_areas", minetest.serialize(cr_areas))
return minetest.chat_send_player(name, "Creative area removed!")
end
else
return minetest.chat_send_player(name, "Not a creative area ID")
end
end
--Remove creative area which are no longer stored by areas mod
local function rm_nil_areas(areaID)
if areas.areas[areaID] == nil then
cr_areas[tostring(areaID)] = nil
storage:set_string("cr_areas", minetest.serialize(cr_areas))
end
return minetest.chat_send_player(name, "Not a creative area ID")
end
-- Checks players location against listed creative areas.
local function check_cr_area(player)
function check_cr_area(player)
local pos = player:get_pos()
local area_at_pos = areas:getAreasAtPos(pos)
local status = false
local ID = 0
--if area_at_pos ~= {} then
for k, v in pairs(cr_areas) do
if tonumber(k) ~= nil then
local areaID = tonumber(k)
--Compare Areas which player are in with Creative Area. Grant/revoke creative priv accordingly."
for _, in_area in pairs(area_at_pos) do
if in_area["pos1"] == areas.areas[areaID]["pos1"] --make sure the areas are not just the same name.
and in_area["name"] == areas.areas[areaID]["name"] then
status = true
ID = tostring(areaID)
end
if cr_areas ~= {} then
for i = 1, #cr_areas do
local areaID = cr_areas[i]
-- Clean up creative areas which are have been deleted from Areas mod
if areas.areas[areaID] == nil then
table.remove(cr_areas, i)
storage:set_string("cr_areas", minetest.serialize(cr_areas))
end
-- Compare Areas which player are in with Creative Area. Grant/revoke creative priv accordingly."
for _, in_area in pairs(area_at_pos) do
if in_area["pos1"] == areas.areas[areaID]["pos1"] --make sure the areas are not just the same name.
and in_area["name"] == areas.areas[areaID]["name"] then
status = true
end
end
end
return status, ID
end
return status
end
--------------------
-- Chat Commands
-------------------
minetest.register_chatcommand("creative_area", {
description = "Sets area to grant players creative priv while inside it",
params = "<AreaID> <Privs>",
params = "<AreaID>",
privs = {privs = true},
func = function(name, param)
make_cr_area(name, param)
@ -136,46 +84,17 @@ minetest.register_chatcommand("ls_creative_areas", {
local list = ""
if cr_areas ~= {} then
for i = 1, #cr_areas do
for k, v in pairs(cr_areas[i]) do
if k == "id" then
local id = tonumber(v)
local area_name = areas.areas[id]["name"]
list = list .. " " .. area_name .. " (ID="..id..")"
end
end
minetest.chat_send_player(name, "Creative Area (ID): "..list)
local id = tonumber(cr_areas[i])
local area_name = areas.areas[ id ]["name"]
list = list .. " " .. area_name .. " (ID="..id..")"
end
minetest.chat_send_player(name, "Creative Area (ID): "..list)
else minetest.chat_send_player(name, "No creative areas found")
end
end
})
------------------------------------------------------------------------
-- Store players default privs on joining first time incase spawning in creative area.
------------------------------------------------------------------------
local function store_privs(player)
local status = check_cr_area(player)
if status == false then
pname = player:get_player_name()
cr_areas[pname] = minetest.get_player_privs(pname)
storage:set_string("cr_areas", minetest.serialize(cr_areas))
end
end
minetest.register_on_newplayer(function(player)
store_privs(player)
end)
minetest.register_on_leaveplayer(function(player)
local status = check_cr_area(player)
if status == false then
pname = player:get_player_name()
cr_areas[pname] = nil
storage:set_string("cr_areas", minetest.serialize(cr_areas))
end
end)
-------------------------------------------------
-- Check location and Grant/revoke indicated privs
-- Check location and Grant/revoke creative priv
-------------------------------------------------
local timer = 0
minetest.register_globalstep(function(dtime)
@ -186,37 +105,12 @@ minetest.register_globalstep(function(dtime)
local privs = minetest.get_player_privs(pname)
local inv = minetest.get_inventory({type="player", name=pname})
if minetest.get_player_privs(pname).privs == nil then --Players with the "privs" priv will not have privileges effected.
local status, id = check_cr_area(player)
if status == true then
if not cr_areas[pname] then
store_privs(player)
end
for k, v in pairs(cr_areas[id]["privs"]) do
if v == true then
privs[k] = true
end
end
minetest.set_player_privs(pname, privs)
-- Reload inventory formspec
if not minetest.get_modpath("unified_inventory") then
local context = {page = sfinv.get_homepage_name(player)}--minetest.get_inventory{{type="detached", name="creative_"..pname}}--{page = sfinv.pages["creative_"..pname]}
sfinv.set_player_inventory_formspec(player, context)
end
-- Store inventory for restoration after leaving creative area
local invlist = inv:get_list("main")
inv:set_list("saved", invlist)
local list = ""
for i = 1, #invlist do
list = list .." "..dump(invlist[i])
end
--[[]if not minetest.check_player_privs(pname, {creative = true}) then
if check_cr_area(player) == true then
if not minetest.check_player_privs(pname, {creative = true}) then
privs.creative = true
minetest.set_player_privs(pname, privs)
if not minetest.get_modpath("unified_inventory") then
local context = {page = sfinv.get_homepage_name(player)}--minetest.get_inventory{{type="detached", name="creative_"..pname}}--{page = sfinv.pages["creative_"..pname]}
sfinv.set_player_inventory_formspec(player, context)
end
--unified_inventory.get_formspec(player, page)
local context = {page = sfinv.get_homepage_name(player)}--minetest.get_inventory{{type="detached", name="creative_"..pname}}--{page = sfinv.pages["creative_"..pname]}
sfinv.set_player_inventory_formspec(player, context)
local invlist = inv:get_list("main")
inv:set_list("saved", invlist)
local list = ""
@ -226,124 +120,22 @@ minetest.register_globalstep(function(dtime)
--write_file(inv_file,)
minetest.chat_send_player(pname, "You are in creative area.")
end]]--
elseif status == false then
if cr_areas[pname] then
minetest.set_player_privs(pname, cr_areas[pname])
end
end
--[[] if minetest.check_player_privs(pname, {creative=true}) then
else
if minetest.check_player_privs(pname, {creative=true}) then
privs.creative = nil
minetest.set_player_privs(pname, privs)
local saved = inv:get_list("saved")
if saved ~= nil then
inv:set_list("main", saved)
end
if not minetest.get_modpath("unified_inventory") then
local context = {page = sfinv.get_homepage_name(player)}
sfinv.set_player_inventory_formspec(player, context)
end
--unified_inventory.get_formspec(player, page)
local context = {page = sfinv.get_homepage_name(player)}
sfinv.set_player_inventory_formspec(player, context)
minetest.chat_send_player(pname, "You have left creative area.")
]]--
end
end
end
end
timer = 0
end
end)
----------------------------------
--Formspec for SVINV
----------------------------------
local function set_switches(area_id)
local tbl = privtbl
local id = tostring(area_id)
local X, Y = 0.5, 5.5
local j = 1
local switches, state = "", ""
local function form(t)
local switches = ""
for k, v in pairs(tbl) do
local priv = k
if v == true then
state = "on"
else state = "off"
end
switches = switches .. "label["..tostring(X)..","..tostring(Y-0.5)..";"..priv.."]"
.."image_button["..tostring(X)..","..tostring(Y)..";0.8,0.5;switch_"..state..".png;"..priv..";]"
if X < 5.75 then
X=X+2
else X = 0.5
end
if j == 4 or j == 8 then
Y = Y + 1.25
end
if j < 12 then
j = j+1
elseif j >= 12 then break
end
end
return switches
end
if id ~= 0 then
if cr_areas[id] then
tbl = cr_areas[id]["privs"]
end
end
local switches = form(tbl)
return switches
end
local function toggle_switch(ID, priv)
end
sfinv.register_page("creative_areas:areas", {
title = "Creative Areas",
is_in_nav = function(self, player, context)
local privs = minetest.get_player_privs(player:get_player_name())
return privs.privs
end,
get = function(self, player, context)
local status, areaid = check_cr_area(player)
local privs = privtbl
local formspec = {
"label[1.75,1;Add or Remove a Creative Area]"
.."label[0.5,2;Area ID]"
.."field[2.5,2;1,1;areaid;;"..areaid.."]"
.."label[0.5,4;Check privs to be granted in this area]"
..set_switches(areaid)
.."button[3.5,1.75;2,1;mkcrarea;Add]"
.."button[5.5,1.75;2,1;rmcrarea;Remove]"
}
return sfinv.make_formspec(player, context, table.concat(formspec, ""), false)
end,
on_player_receive_fields = function(self, player, formname, fields)
local tbl = {}
if fields.rmcrarea and fields.areaid then
return rm_cr_area(player:get_player_name(), fields.areaid)
elseif fields.mkcrarea and fields.areaid then
return make_cr_area(player:get_player_name(), fields.areaid)
elseif fields.areaid then
local id = fields.areaid
if cr_areas[id] ~= nil then
for k, v in pairs(cr_areas[id]["privs"]) do
if fields[k] then
minetest.chat_send_all(k)
if v == false then
cr_areas[id]["privs"][k] = true
elseif v == true then
cr_areas[id]["privs"][k] = false
end
storage:set_string("cr_areas", minetest.serialize(cr_areas))
sfinv.set_player_inventory_formspec(player)
end
end
end
end
end
})

View File

@ -1 +0,0 @@
name = creative_areas

Binary file not shown.

Before

Width:  |  Height:  |  Size: 278 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 270 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 278 B