Compare commits

...

7 Commits

Author SHA1 Message Date
Sys Quatre 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 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.
@ -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 /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:
Copyright 2018 kakalak-lumberJack

View File

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

300
init.lua
View File

@ -1,67 +1,119 @@
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
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
if cr_areas[id] then
cr_areas[id]["privs"] = privs
return minetest.chat_send_player(name, "Creative Area " ..id.." updated")
end
end
table.insert(cr_areas, id)
end
local cr_area = {}
cr_area["privs"] = privs
cr_areas[id] = cr_area
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, 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!")
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
end
else
return minetest.chat_send_player(name, "Not a creative area ID")
end
return minetest.chat_send_player(name, "Not a creative area ID")
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
-- Checks players location against listed creative areas.
function check_cr_area(player)
local function check_cr_area(player)
local pos = player:get_pos()
local area_at_pos = areas:getAreasAtPos(pos)
local status = false
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
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
end
end
end
end
return status
return status, ID
end
--------------------
-- Chat Commands
-------------------
minetest.register_chatcommand("creative_area", {
description = "Sets area to grant players creative priv while inside it",
params = "<AreaID>",
params = "<AreaID> <Privs>",
privs = {privs = true},
func = function(name, param)
make_cr_area(name, param)
@ -84,17 +136,46 @@ minetest.register_chatcommand("ls_creative_areas", {
local list = ""
if cr_areas ~= {} then
for i = 1, #cr_areas do
local id = tonumber(cr_areas[i])
local area_name = areas.areas[ id ]["name"]
list = list .. " " .. area_name .. " (ID="..id..")"
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)
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 creative priv
-- Check location and Grant/revoke indicated privs
-------------------------------------------------
local timer = 0
minetest.register_globalstep(function(dtime)
@ -105,12 +186,37 @@ 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.
if check_cr_area(player) == true then
if not minetest.check_player_privs(pname, {creative = true}) then
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
privs.creative = true
minetest.set_player_privs(pname, privs)
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)
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")
inv:set_list("saved", invlist)
local list = ""
@ -120,22 +226,124 @@ 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
else
if minetest.check_player_privs(pname, {creative=true}) then
end
--[[] 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
local context = {page = sfinv.get_homepage_name(player)}
sfinv.set_player_inventory_formspec(player, context)
--unified_inventory.get_formspec(player, page)
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
})

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