Update Chinese Translation, Add Traditional Chinese Translation (#2596)
[oweals/minetest_game.git] / mods / creative / init.lua
1 -- creative/init.lua
2
3 -- Load support for MT game translation.
4 local S = minetest.get_translator("creative")
5
6 creative = {}
7 creative.get_translator = S
8
9 local function update_sfinv(name)
10         minetest.after(0, function()
11                 local player = minetest.get_player_by_name(name)
12                 if player then
13                         if sfinv.get_page(player):sub(1, 9) == "creative:" then
14                                 sfinv.set_page(player, sfinv.get_homepage_name(player))
15                         else
16                                 sfinv.set_player_inventory_formspec(player)
17                         end
18                 end
19         end)
20 end
21
22 minetest.register_privilege("creative", {
23         description = S("Allow player to use creative inventory"),
24         give_to_singleplayer = false,
25         give_to_admin = false,
26         on_grant = update_sfinv,
27         on_revoke = update_sfinv,
28 })
29
30 local creative_mode_cache = minetest.settings:get_bool("creative_mode")
31
32 function creative.is_enabled_for(name)
33         return creative_mode_cache or
34                 minetest.check_player_privs(name, {creative = true})
35 end
36
37 dofile(minetest.get_modpath("creative") .. "/inventory.lua")
38
39 if creative_mode_cache then
40         -- Dig time is modified according to difference (leveldiff) between tool
41         -- 'maxlevel' and node 'level'. Digtime is divided by the larger of
42         -- leveldiff and 1.
43         -- To speed up digging in creative, hand 'maxlevel' and 'digtime' have been
44         -- increased such that nodes of differing levels have an insignificant
45         -- effect on digtime.
46         local digtime = 42
47         local caps = {times = {digtime, digtime, digtime}, uses = 0, maxlevel = 256}
48
49         -- Override the hand tool
50         minetest.override_item("", {
51                 range = 10,
52                 tool_capabilities = {
53                         full_punch_interval = 0.5,
54                         max_drop_level = 3,
55                         groupcaps = {
56                                 crumbly = caps,
57                                 cracky  = caps,
58                                 snappy  = caps,
59                                 choppy  = caps,
60                                 oddly_breakable_by_hand = caps,
61                                 -- dig_immediate group doesn't use value 1. Value 3 is instant dig
62                                 dig_immediate =
63                                         {times = {[2] = digtime, [3] = 0}, uses = 0, maxlevel = 256},
64                         },
65                         damage_groups = {fleshy = 10},
66                 }
67         })
68 end
69
70 -- Unlimited node placement
71 minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack)
72         if placer and placer:is_player() then
73                 return creative.is_enabled_for(placer:get_player_name())
74         end
75 end)
76
77 -- Don't pick up if the item is already in the inventory
78 local old_handle_node_drops = minetest.handle_node_drops
79 function minetest.handle_node_drops(pos, drops, digger)
80         if not digger or not digger:is_player() or
81                 not creative.is_enabled_for(digger:get_player_name()) then
82                 return old_handle_node_drops(pos, drops, digger)
83         end
84         local inv = digger:get_inventory()
85         if inv then
86                 for _, item in ipairs(drops) do
87                         if not inv:contains_item("main", item, true) then
88                                 inv:add_item("main", item)
89                         end
90                 end
91         end
92 end