Compare commits

...

7 Commits

Author SHA1 Message Date
cf6e03939f Delete creative mod and rename files 2020-08-16 13:31:55 +02:00
kakalak-lumberJack
3264945c6d
fix typo 2018-05-22 16:53:24 -04:00
kakalak-lumberJack
870fbb9c21 new features 2018-04-03 04:05:45 -04:00
kakalak-lumberJack
57a351c465 add support for unified inventory 2018-02-22 21:55:37 -05:00
kakalak-lumberJack
5d5c7e9c38 Edit and move README.md 2018-02-21 11:03:01 -05:00
kakalak-lumberJack
91f7b244f6 made modpack: creative mod from 0.5.0 added for 0.4.16 support 2018-02-21 10:55:33 -05:00
kakalak-lumberJack
8d070f482a add mod.conf 2018-02-20 09:32:07 -05:00
7 changed files with 262 additions and 50 deletions

View File

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

View File

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

272
init.lua
View File

@ -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
--------------- ---------------
-- 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. -- Add creative area to list.
local function make_cr_area(name, areaID) local function make_cr_area(name, areaID)
local id = tonumber(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 if areas.areas[id] ~= nil then
id = tostring(id)
if cr_areas ~= {} then if cr_areas ~= {} then
for i = 1, #cr_areas do if cr_areas[id] then
if cr_areas[i] == id then cr_areas[id]["privs"] = privs
return minetest.chat_send_player(name, "Area " ..id.." is already a creative area.") return minetest.chat_send_player(name, "Creative Area " ..id.." updated")
end end
end end
end local cr_area = {}
table.insert(cr_areas, id) 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
if k == id then
cr_areas[k] = nil
storage:set_string("cr_areas", minetest.serialize(cr_areas)) storage:set_string("cr_areas", minetest.serialize(cr_areas))
return minetest.chat_send_player(name, "Creative area removed!") return minetest.chat_send_player(name, "Creative area removed!")
end end
end end
else
return minetest.chat_send_player(name, "Not a creative area ID") 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 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))
end
-- Compare Areas which player are in with Creative Area. Grant/revoke creative priv accordingly."
for _, in_area in pairs(area_at_pos) do 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. 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 and in_area["name"] == areas.areas[areaID]["name"] then
status = true status = true
ID = tostring(areaID)
end 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
local id = tonumber(v)
local area_name = areas.areas[id]["name"]
list = list .. " " .. area_name .. " (ID="..id..")" list = list .. " " .. area_name .. " (ID="..id..")"
end end
end
minetest.chat_send_player(name, "Creative Area (ID): "..list) minetest.chat_send_player(name, "Creative Area (ID): "..list)
end
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
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) 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
if not minetest.get_modpath("unified_inventory") then
local context = {page = sfinv.get_homepage_name(player)} local context = {page = sfinv.get_homepage_name(player)}
sfinv.set_player_inventory_formspec(player, context) 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
})

1
mod.conf Normal file
View File

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

BIN
textures/reload.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 B

BIN
textures/switch_off.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 B

BIN
textures/switch_on.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 B