forked from mtcontrib/creative_areas
Compare commits
7 Commits
creative_a
...
master
Author | SHA1 | Date | |
---|---|---|---|
cf6e03939f | |||
|
3264945c6d | ||
|
870fbb9c21 | ||
|
57a351c465 | ||
|
5d5c7e9c38 | ||
|
91f7b244f6 | ||
|
8d070f482a |
|
@ -1,6 +1,6 @@
|
||||||
# Creative Areas
|
# 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.
|
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.
|
||||||
|
|
||||||
Players with the 'privs' priv will not have privileges or inventories affected moving in and out of these areas.
|
Players with the 'privs' priv will not have privileges or inventories affected moving in and out of these areas.
|
||||||
|
|
||||||
|
@ -8,9 +8,10 @@ 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 /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.
|
* 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.
|
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.
|
||||||
|
|
||||||
This mod is compatible with Minetest 0.4.16 and up.
|
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.
|
||||||
|
|
||||||
MIT License:
|
MIT License:
|
||||||
Copyright 2018 kakalak-lumberJack
|
Copyright 2018 kakalak-lumberJack
|
||||||
|
|
|
@ -1,2 +1,4 @@
|
||||||
areas
|
areas
|
||||||
creative
|
creative
|
||||||
|
sfinv?
|
||||||
|
unified_inventory?
|
306
init.lua
306
init.lua
|
@ -1,67 +1,119 @@
|
||||||
local storage = minetest.get_mod_storage()
|
local storage = minetest.get_mod_storage()
|
||||||
local cr_areas = minetest.deserialize(storage:get_string("cr_areas")) or {}
|
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
|
-- Functions
|
||||||
---------------
|
---------------
|
||||||
-- Add creative area to list.
|
-- Check for intersecting creative areas
|
||||||
local function make_cr_area(name, areaID)
|
function intersects_cr_area(areaID)
|
||||||
local id = tonumber(areaID)
|
local ID = areaID
|
||||||
if areas.areas[id] ~= nil then
|
local newarea = areas.areas[ID]
|
||||||
if cr_areas ~= {} then
|
local np1, np2 = newarea["pos1"], newarea["pos2"]
|
||||||
for i = 1, #cr_areas do
|
if cr_areas == {} then
|
||||||
if cr_areas[i] == id then
|
return false
|
||||||
return minetest.chat_send_player(name, "Area " ..id.." is already a creative area.")
|
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
|
||||||
end
|
end
|
||||||
table.insert(cr_areas, id)
|
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")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local cr_area = {}
|
||||||
|
cr_area["privs"] = privs
|
||||||
|
cr_areas[id] = cr_area
|
||||||
storage:set_string("cr_areas", minetest.serialize(cr_areas))
|
storage:set_string("cr_areas", minetest.serialize(cr_areas))
|
||||||
minetest.chat_send_player(name, "Area added to Creative Areas!")
|
minetest.chat_send_player(name, "Area added to Creative Areas!")
|
||||||
else minetest.chat_send_player(name, "Not a valid area ID")
|
else minetest.chat_send_player(name, "Not a valid area ID")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
--Removes Creative Area
|
--Removes Creative Area
|
||||||
local function rm_cr_area(name, areaID)
|
local function rm_cr_area(name, ID)
|
||||||
local id = tonumber(areaID)
|
local id = tostring(ID)
|
||||||
for i = 1, #cr_areas do
|
local i = 1
|
||||||
if cr_areas[i] == id then
|
if cr_areas[id] then
|
||||||
table.remove(cr_areas, i)
|
for k,v in pairs(cr_areas) do
|
||||||
storage:set_string("cr_areas", minetest.serialize(cr_areas))
|
if k == id then
|
||||||
return minetest.chat_send_player(name, "Creative area removed!")
|
cr_areas[k] = nil
|
||||||
|
storage:set_string("cr_areas", minetest.serialize(cr_areas))
|
||||||
|
return minetest.chat_send_player(name, "Creative area removed!")
|
||||||
|
end
|
||||||
end
|
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
|
end
|
||||||
return minetest.chat_send_player(name, "Not a creative area ID")
|
|
||||||
end
|
end
|
||||||
-- Checks players location against listed creative areas.
|
-- Checks players location against listed creative areas.
|
||||||
function check_cr_area(player)
|
local function check_cr_area(player)
|
||||||
local pos = player:get_pos()
|
local pos = player:get_pos()
|
||||||
local area_at_pos = areas:getAreasAtPos(pos)
|
local area_at_pos = areas:getAreasAtPos(pos)
|
||||||
local status = false
|
local status = false
|
||||||
if cr_areas ~= {} then
|
local ID = 0
|
||||||
for i = 1, #cr_areas do
|
--if area_at_pos ~= {} then
|
||||||
local areaID = cr_areas[i]
|
for k, v in pairs(cr_areas) do
|
||||||
-- Clean up creative areas which are have been deleted from Areas mod
|
if tonumber(k) ~= nil then
|
||||||
if areas.areas[areaID] == nil then
|
local areaID = tonumber(k)
|
||||||
table.remove(cr_areas, i)
|
--Compare Areas which player are in with Creative Area. Grant/revoke creative priv accordingly."
|
||||||
storage:set_string("cr_areas", minetest.serialize(cr_areas))
|
for _, in_area in pairs(area_at_pos) do
|
||||||
end
|
if in_area["pos1"] == areas.areas[areaID]["pos1"] --make sure the areas are not just the same name.
|
||||||
-- Compare Areas which player are in with Creative Area. Grant/revoke creative priv accordingly."
|
and in_area["name"] == areas.areas[areaID]["name"] then
|
||||||
for _, in_area in pairs(area_at_pos) do
|
status = true
|
||||||
if in_area["pos1"] == areas.areas[areaID]["pos1"] --make sure the areas are not just the same name.
|
ID = tostring(areaID)
|
||||||
and in_area["name"] == areas.areas[areaID]["name"] then
|
end
|
||||||
status = true
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
return status
|
return status, ID
|
||||||
end
|
end
|
||||||
--------------------
|
--------------------
|
||||||
-- Chat Commands
|
-- Chat Commands
|
||||||
-------------------
|
-------------------
|
||||||
minetest.register_chatcommand("creative_area", {
|
minetest.register_chatcommand("creative_area", {
|
||||||
description = "Sets area to grant players creative priv while inside it",
|
description = "Sets area to grant players creative priv while inside it",
|
||||||
params = "<AreaID>",
|
params = "<AreaID> <Privs>",
|
||||||
privs = {privs = true},
|
privs = {privs = true},
|
||||||
func = function(name, param)
|
func = function(name, param)
|
||||||
make_cr_area(name, param)
|
make_cr_area(name, param)
|
||||||
|
@ -84,17 +136,46 @@ minetest.register_chatcommand("ls_creative_areas", {
|
||||||
local list = ""
|
local list = ""
|
||||||
if cr_areas ~= {} then
|
if cr_areas ~= {} then
|
||||||
for i = 1, #cr_areas do
|
for i = 1, #cr_areas do
|
||||||
local id = tonumber(cr_areas[i])
|
for k, v in pairs(cr_areas[i]) do
|
||||||
local area_name = areas.areas[ id ]["name"]
|
if k == "id" then
|
||||||
list = list .. " " .. area_name .. " (ID="..id..")"
|
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)
|
||||||
end
|
end
|
||||||
minetest.chat_send_player(name, "Creative Area (ID): "..list)
|
|
||||||
else minetest.chat_send_player(name, "No creative areas found")
|
else minetest.chat_send_player(name, "No creative areas found")
|
||||||
end
|
end
|
||||||
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 creative priv
|
-- Check location and Grant/revoke indicated privs
|
||||||
-------------------------------------------------
|
-------------------------------------------------
|
||||||
local timer = 0
|
local timer = 0
|
||||||
minetest.register_globalstep(function(dtime)
|
minetest.register_globalstep(function(dtime)
|
||||||
|
@ -105,12 +186,37 @@ minetest.register_globalstep(function(dtime)
|
||||||
local privs = minetest.get_player_privs(pname)
|
local privs = minetest.get_player_privs(pname)
|
||||||
local inv = minetest.get_inventory({type="player", name=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.
|
if minetest.get_player_privs(pname).privs == nil then --Players with the "privs" priv will not have privileges effected.
|
||||||
if check_cr_area(player) == true then
|
local status, id = check_cr_area(player)
|
||||||
if not minetest.check_player_privs(pname, {creative = true}) then
|
if status == true then
|
||||||
privs.creative = true
|
if not cr_areas[pname] then
|
||||||
minetest.set_player_privs(pname, privs)
|
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]}
|
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)
|
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
|
||||||
|
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 invlist = inv:get_list("main")
|
local invlist = inv:get_list("main")
|
||||||
inv:set_list("saved", invlist)
|
inv:set_list("saved", invlist)
|
||||||
local list = ""
|
local list = ""
|
||||||
|
@ -120,22 +226,124 @@ minetest.register_globalstep(function(dtime)
|
||||||
--write_file(inv_file,)
|
--write_file(inv_file,)
|
||||||
minetest.chat_send_player(pname, "You are in creative area.")
|
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
|
||||||
else
|
end
|
||||||
if minetest.check_player_privs(pname, {creative=true}) then
|
|
||||||
|
--[[] if minetest.check_player_privs(pname, {creative=true}) then
|
||||||
privs.creative = nil
|
privs.creative = nil
|
||||||
minetest.set_player_privs(pname, privs)
|
minetest.set_player_privs(pname, privs)
|
||||||
local saved = inv:get_list("saved")
|
local saved = inv:get_list("saved")
|
||||||
if saved ~= nil then
|
if saved ~= nil then
|
||||||
inv:set_list("main", saved)
|
inv:set_list("main", saved)
|
||||||
end
|
end
|
||||||
local context = {page = sfinv.get_homepage_name(player)}
|
if not minetest.get_modpath("unified_inventory") then
|
||||||
sfinv.set_player_inventory_formspec(player, context)
|
local context = {page = sfinv.get_homepage_name(player)}
|
||||||
|
sfinv.set_player_inventory_formspec(player, context)
|
||||||
|
end
|
||||||
|
--unified_inventory.get_formspec(player, page)
|
||||||
minetest.chat_send_player(pname, "You have left creative area.")
|
minetest.chat_send_player(pname, "You have left creative area.")
|
||||||
end
|
]]--
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
timer = 0
|
timer = 0
|
||||||
end
|
end
|
||||||
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
|
||||||
|
})
|
||||||
|
|
BIN
textures/reload.png
Normal file
BIN
textures/reload.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 278 B |
BIN
textures/switch_off.png
Normal file
BIN
textures/switch_off.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 270 B |
BIN
textures/switch_on.png
Normal file
BIN
textures/switch_on.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 278 B |
Loading…
Reference in New Issue
Block a user