diff --git a/game_api.txt b/game_api.txt index 38718c36..cef46f66 100644 --- a/game_api.txt +++ b/game_api.txt @@ -78,6 +78,12 @@ For example, is used to show all tools. Name is used in the sfinv page name, title is the human readable title. +`is_enabled_for` is used to check whether a player is in creative mode: + + creative.is_enabled_for(name) + +Override this to allow per-player game modes. + The contents of `creative.formspec_add` is appended to every creative inventory page. Mods can use it to add additional formspec elements onto the default creative inventory formspec to be drawn after each update. diff --git a/mods/creative/init.lua b/mods/creative/init.lua index 868b802b..24700eb9 100644 --- a/mods/creative/init.lua +++ b/mods/creative/init.lua @@ -1,3 +1,9 @@ +creative = {} + +function creative.is_enabled_for(name) + return minetest.setting_getbool("creative_mode") +end + dofile(minetest.get_modpath("creative") .. "/inventory.lua") if minetest.setting_getbool("creative_mode") then @@ -28,22 +34,25 @@ if minetest.setting_getbool("creative_mode") then damage_groups = {fleshy = 10}, } }) +end - minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) - return true - end) +-- Unlimited node placement +minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) + return creative.is_enabled_for(placer:get_player_name()) +end) - function minetest.handle_node_drops(pos, drops, digger) - if not digger or not digger:is_player() then - return - end - local inv = digger:get_inventory() - if inv then - for _, item in ipairs(drops) do - item = ItemStack(item):get_name() - if not inv:contains_item("main", item) then - inv:add_item("main", item) - end +-- Don't pick up if the item is already in the inventory +function minetest.handle_node_drops(pos, drops, digger) + if not digger or not digger:is_player() or + not creative.is_enabled_for(digger:get_player_name()) then + return + end + local inv = digger:get_inventory() + if inv then + for _, item in ipairs(drops) do + item = ItemStack(item):get_name() + if not inv:contains_item("main", item) then + inv:add_item("main", item) end end end diff --git a/mods/creative/inventory.lua b/mods/creative/inventory.lua index be24b3a2..1363e294 100644 --- a/mods/creative/inventory.lua +++ b/mods/creative/inventory.lua @@ -1,4 +1,3 @@ -creative = {} local player_inventory = {} function creative.init_creative_inventory(player) @@ -79,7 +78,7 @@ function creative.register_tab(name, title, items) sfinv.register_page("creative:" .. name, { title = title, is_in_nav = function(self, player, context) - return minetest.setting_getbool("creative_mode") + return creative.is_enabled_for(player:get_player_name()) end, get = function(self, player, context) local player_name = player:get_player_name() @@ -172,7 +171,7 @@ creative.register_tab("craftitems", "Items", minetest.registered_craftitems) local old_homepage_name = sfinv.get_homepage_name function sfinv.get_homepage_name(player) - if minetest.setting_getbool("creative_mode") then + if creative.is_enabled_for(player:get_player_name()) then return "creative:all" else return old_homepage_name(player)