Update signs in Tutorial world
[minetest_tutorial_subgame.git] / mods / creative / init.lua
bloba72cc36d22cff8ed742bb21c2f3ee099d1519e55
1 -- minetest/creative/init.lua
3 -- intllib support
4 local S
5 if (minetest.get_modpath("intllib")) then
6 dofile(minetest.get_modpath("intllib").."/intllib.lua")
7 S = intllib.Getter(minetest.get_current_modname())
8 F = function( s )
9 return minetest.formspec_escape(S(s))
10 end
11 else
12 S = function ( s ) return s end
13 F = function ( s ) return minetest.formspec_escape(s) end
14 end
16 creative_inventory = {}
17 creative_inventory.creative_inventory_size = 0
19 -- Create detached creative inventory after loading all mods
20 minetest.after(0, function()
21 local inv = minetest.create_detached_inventory("creative", {
22 allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
23 if minetest.setting_getbool("creative_mode") then
24 return count
25 else
26 return 0
27 end
28 end,
29 allow_put = function(inv, listname, index, stack, player)
30 return 0
31 end,
32 allow_take = function(inv, listname, index, stack, player)
33 if minetest.setting_getbool("creative_mode") then
34 return -1
35 else
36 return 0
37 end
38 end,
39 on_move = function(inv, from_list, from_index, to_list, to_index, count, player)
40 end,
41 on_put = function(inv, listname, index, stack, player)
42 end,
43 on_take = function(inv, listname, index, stack, player)
44 --print(player:get_player_name().." takes item from creative inventory; listname="..dump(listname)..", index="..dump(index)..", stack="..dump(stack))
45 if stack then
46 minetest.log("action", player:get_player_name().." takes "..dump(stack:get_name()).." from creative inventory")
47 --print("stack:get_name()="..dump(stack:get_name())..", stack:get_count()="..dump(stack:get_count()))
48 end
49 end,
51 local creative_list = {}
52 for name,def in pairs(minetest.registered_items) do
53 if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0)
54 and def.description and def.description ~= "" then
55 table.insert(creative_list, name)
56 end
57 end
58 table.sort(creative_list)
59 inv:set_size("main", #creative_list)
60 for _,itemstring in ipairs(creative_list) do
61 inv:add_item("main", ItemStack(itemstring))
62 end
63 creative_inventory.creative_inventory_size = #creative_list
64 --print("creative inventory size: "..dump(creative_inventory.creative_inventory_size))
65 end)
67 -- Create the trash field
68 local trash = minetest.create_detached_inventory("creative_trash", {
69 -- Allow the stack to be placed and remove it in on_put()
70 -- This allows the creative inventory to restore the stack
71 allow_put = function(inv, listname, index, stack, player)
72 if minetest.setting_getbool("creative_mode") then
73 return stack:get_count()
74 else
75 return 0
76 end
77 end,
78 on_put = function(inv, listname, index, stack, player)
79 inv:set_stack(listname, index, "")
80 end,
82 trash:set_size("main", 1)
85 creative_inventory.set_creative_formspec = function(player, start_i, pagenum)
86 pagenum = math.floor(pagenum)
87 local pagemax = math.floor((creative_inventory.creative_inventory_size-1) / (6*4) + 1)
88 player:set_inventory_formspec(
89 "size[13,7.5]"..
90 --"image[6,0.6;1,2;player.png]"..
91 default.gui_bg..
92 default.gui_bg_img..
93 default.gui_slots..
94 "list[current_player;main;5,3.5;8,1;]"..
95 "list[current_player;main;5,4.75;8,3;8]"..
96 "list[current_player;craft;8,0;3,3;]"..
97 "list[current_player;craftpreview;12,1;1,1;]"..
98 "list[detached:creative;main;0.3,0.5;4,6;"..tostring(start_i).."]"..
99 "label[2.0,6.55;"..tostring(pagenum).."/"..tostring(pagemax).."]"..
100 "button[0.3,6.5;1.6,1;creative_prev;<<]"..
101 "button[2.7,6.5;1.6,1;creative_next;>>]"..
102 "label[5,1.5;"..F("Trash:").."]"..
103 "list[detached:creative_trash;main;5,2;1,1;]"..
104 default.get_hotbar_bg(5,3.5)
107 minetest.register_on_joinplayer(function(player)
108 -- If in creative mode, modify player's inventory forms
109 if not minetest.setting_getbool("creative_mode") then
110 return
112 creative_inventory.set_creative_formspec(player, 0, 1)
113 end)
114 minetest.register_on_player_receive_fields(function(player, formname, fields)
115 if not minetest.setting_getbool("creative_mode") then
116 return
118 -- Figure out current page from formspec
119 local current_page = 0
120 local formspec = player:get_inventory_formspec()
121 local start_i = string.match(formspec, "list%[detached:creative;main;[%d.]+,[%d.]+;[%d.]+,[%d.]+;(%d+)%]")
122 start_i = tonumber(start_i) or 0
124 if fields.creative_prev then
125 start_i = start_i - 4*6
127 if fields.creative_next then
128 start_i = start_i + 4*6
131 if start_i < 0 then
132 start_i = start_i + 4*6
134 if start_i >= creative_inventory.creative_inventory_size then
135 start_i = start_i - 4*6
138 if start_i < 0 or start_i >= creative_inventory.creative_inventory_size then
139 start_i = 0
142 creative_inventory.set_creative_formspec(player, start_i, start_i / (6*4) + 1)
143 end)
145 if minetest.setting_getbool("creative_mode") then
146 local digtime = 0.5
147 minetest.register_item(":", {
148 type = "none",
149 wield_image = "wieldhand.png",
150 wield_scale = {x=1,y=1,z=2.5},
151 range = 10,
152 tool_capabilities = {
153 full_punch_interval = 0.5,
154 max_drop_level = 3,
155 groupcaps = {
156 crumbly = {times={[1]=digtime, [2]=digtime, [3]=digtime}, uses=0, maxlevel=3},
157 cracky = {times={[1]=digtime, [2]=digtime, [3]=digtime}, uses=0, maxlevel=3},
158 snappy = {times={[1]=digtime, [2]=digtime, [3]=digtime}, uses=0, maxlevel=3},
159 choppy = {times={[1]=digtime, [2]=digtime, [3]=digtime}, uses=0, maxlevel=3},
160 oddly_breakable_by_hand = {times={[1]=digtime, [2]=digtime, [3]=digtime}, uses=0, maxlevel=3},
162 damage_groups = {fleshy = 10},
166 minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack)
167 return true
168 end)
170 function minetest.handle_node_drops(pos, drops, digger)
171 if not digger or not digger:is_player() then
172 return
174 local inv = digger:get_inventory()
175 if inv then
176 for _,item in ipairs(drops) do
177 item = ItemStack(item):get_name()
178 if not inv:contains_item("main", item) then
179 inv:add_item("main", item)