Skip to content

Commit

Permalink
Creative: Add creative.is_enabled_for
Browse files Browse the repository at this point in the history
  • Loading branch information
rubenwardy authored and paramat committed Jan 26, 2017
1 parent ae42687 commit bee5b31
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 17 deletions.
6 changes: 6 additions & 0 deletions game_api.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
37 changes: 23 additions & 14 deletions mods/creative/init.lua
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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
Expand Down
5 changes: 2 additions & 3 deletions mods/creative/inventory.lua
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
creative = {}
local player_inventory = {}

function creative.init_creative_inventory(player)
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit bee5b31

Please sign in to comment.