mirror of
https://github.com/minetest/minetest_game.git
synced 2024-12-23 14:42:27 +01:00
0157175346
This adds a 'creative' privilege to survival servers which OPs can bestow on admin or competent builders to give access to the creative inventory.
70 lines
1.9 KiB
Lua
70 lines
1.9 KiB
Lua
creative = {}
|
|
|
|
minetest.register_privilege("creative", {
|
|
description = "Allow player to use creative inventory",
|
|
give_to_singleplayer = false
|
|
})
|
|
|
|
local creative_mode_cache = minetest.settings:get_bool("creative_mode")
|
|
|
|
function creative.is_enabled_for(name)
|
|
return creative_mode_cache or
|
|
minetest.check_player_privs(name, {creative = true})
|
|
end
|
|
|
|
dofile(minetest.get_modpath("creative") .. "/inventory.lua")
|
|
|
|
if creative_mode_cache then
|
|
-- Dig time is modified according to difference (leveldiff) between tool
|
|
-- 'maxlevel' and node 'level'. Digtime is divided by the larger of
|
|
-- leveldiff and 1.
|
|
-- To speed up digging in creative, hand 'maxlevel' and 'digtime' have been
|
|
-- increased such that nodes of differing levels have an insignificant
|
|
-- effect on digtime.
|
|
local digtime = 42
|
|
local caps = {times = {digtime, digtime, digtime}, uses = 0, maxlevel = 256}
|
|
|
|
minetest.register_item(":", {
|
|
type = "none",
|
|
wield_image = "wieldhand.png",
|
|
wield_scale = {x = 1, y = 1, z = 2.5},
|
|
range = 10,
|
|
tool_capabilities = {
|
|
full_punch_interval = 0.5,
|
|
max_drop_level = 3,
|
|
groupcaps = {
|
|
crumbly = caps,
|
|
cracky = caps,
|
|
snappy = caps,
|
|
choppy = caps,
|
|
oddly_breakable_by_hand = caps,
|
|
},
|
|
damage_groups = {fleshy = 10},
|
|
}
|
|
})
|
|
end
|
|
|
|
-- Unlimited node placement
|
|
minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack)
|
|
return creative.is_enabled_for(placer:get_player_name())
|
|
end)
|
|
|
|
-- Don't pick up if the item is already in the inventory
|
|
local old_handle_node_drops = minetest.handle_node_drops
|
|
function minetest.handle_node_drops(pos, drops, digger)
|
|
if not digger or not digger:is_player() then
|
|
return
|
|
end
|
|
if not creative.is_enabled_for(digger:get_player_name()) then
|
|
return old_handle_node_drops(pos, drops, digger)
|
|
end
|
|
local inv = digger:get_inventory()
|
|
if inv then
|
|
for _, item in ipairs(drops) do
|
|
if not inv:contains_item("main", item, true) then
|
|
inv:add_item("main", item)
|
|
end
|
|
end
|
|
end
|
|
end
|